Commit dd7f3d5458e5c0eded620fe8192abe7e418fc94c

Authored by Alexey Khoroshilov
Committed by Christoph Hellwig
1 parent 5bd9d99d10

hfsplus: Add error propagation for hfsplus_ext_write_extent_locked

Implement error propagation through the callers of
hfsplus_ext_write_extent_locked().

Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: Christoph Hellwig <hch@lst.de>

Showing 3 changed files with 24 additions and 10 deletions Side-by-side Diff

fs/hfsplus/extents.c
... ... @@ -119,23 +119,31 @@
119 119 set_bit(HFSPLUS_I_EXT_DIRTY, &hip->flags);
120 120 }
121 121  
122   -static void hfsplus_ext_write_extent_locked(struct inode *inode)
  122 +static int hfsplus_ext_write_extent_locked(struct inode *inode)
123 123 {
  124 + int res;
  125 +
124 126 if (HFSPLUS_I(inode)->extent_state & HFSPLUS_EXT_DIRTY) {
125 127 struct hfs_find_data fd;
126 128  
127   - if (!hfs_find_init(HFSPLUS_SB(inode->i_sb)->ext_tree, &fd)) {
128   - __hfsplus_ext_write_extent(inode, &fd);
129   - hfs_find_exit(&fd);
130   - }
  129 + res = hfs_find_init(HFSPLUS_SB(inode->i_sb)->ext_tree, &fd);
  130 + if (res)
  131 + return res;
  132 + __hfsplus_ext_write_extent(inode, &fd);
  133 + hfs_find_exit(&fd);
131 134 }
  135 + return 0;
132 136 }
133 137  
134   -void hfsplus_ext_write_extent(struct inode *inode)
  138 +int hfsplus_ext_write_extent(struct inode *inode)
135 139 {
  140 + int res;
  141 +
136 142 mutex_lock(&HFSPLUS_I(inode)->extents_lock);
137   - hfsplus_ext_write_extent_locked(inode);
  143 + res = hfsplus_ext_write_extent_locked(inode);
138 144 mutex_unlock(&HFSPLUS_I(inode)->extents_lock);
  145 +
  146 + return res;
139 147 }
140 148  
141 149 static inline int __hfsplus_ext_read_extent(struct hfs_find_data *fd,
... ... @@ -477,7 +485,9 @@
477 485  
478 486 insert_extent:
479 487 dprint(DBG_EXTENT, "insert new extent\n");
480   - hfsplus_ext_write_extent_locked(inode);
  488 + res = hfsplus_ext_write_extent_locked(inode);
  489 + if (res)
  490 + goto out;
481 491  
482 492 memset(hip->cached_extents, 0, sizeof(hfsplus_extent_rec));
483 493 hip->cached_extents[0].start_block = cpu_to_be32(start);
fs/hfsplus/hfsplus_fs.h
... ... @@ -374,7 +374,7 @@
374 374  
375 375 /* extents.c */
376 376 int hfsplus_ext_cmp_key(const hfsplus_btree_key *, const hfsplus_btree_key *);
377   -void hfsplus_ext_write_extent(struct inode *);
  377 +int hfsplus_ext_write_extent(struct inode *);
378 378 int hfsplus_get_block(struct inode *, sector_t, struct buffer_head *, int);
379 379 int hfsplus_free_fork(struct super_block *, u32,
380 380 struct hfsplus_fork_raw *, int);
... ... @@ -135,9 +135,13 @@
135 135 static int hfsplus_write_inode(struct inode *inode,
136 136 struct writeback_control *wbc)
137 137 {
  138 + int err;
  139 +
138 140 dprint(DBG_INODE, "hfsplus_write_inode: %lu\n", inode->i_ino);
139 141  
140   - hfsplus_ext_write_extent(inode);
  142 + err = hfsplus_ext_write_extent(inode);
  143 + if (err)
  144 + return err;
141 145  
142 146 if (inode->i_ino >= HFSPLUS_FIRSTUSER_CNID ||
143 147 inode->i_ino == HFSPLUS_ROOT_CNID)