Commit dd7f3d5458e5c0eded620fe8192abe7e418fc94c
Committed by
Christoph Hellwig
1 parent
5bd9d99d10
Exists in
master
and in
38 other branches
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); |
fs/hfsplus/super.c
... | ... | @@ -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) |