diff options
author | Alexey Khoroshilov <khoroshilov@ispras.ru> | 2011-07-06 02:30:00 +0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2011-07-07 17:45:46 +0200 |
commit | dd7f3d5458e5c0eded620fe8192abe7e418fc94c (patch) | |
tree | 80ccd8fe3d0e7dab7d18852ceac6b4093d3cd44a /fs | |
parent | 5bd9d99d107c56ff7b35a29e930d85f91a07b2fd (diff) | |
download | linux-dd7f3d5458e5c0eded620fe8192abe7e418fc94c.tar.gz linux-dd7f3d5458e5c0eded620fe8192abe7e418fc94c.tar.bz2 linux-dd7f3d5458e5c0eded620fe8192abe7e418fc94c.zip |
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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/hfsplus/extents.c | 26 | ||||
-rw-r--r-- | fs/hfsplus/hfsplus_fs.h | 2 | ||||
-rw-r--r-- | fs/hfsplus/super.c | 6 |
3 files changed, 24 insertions, 10 deletions
diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c index 95065a89e7e2..5849e3ef35cc 100644 --- a/fs/hfsplus/extents.c +++ b/fs/hfsplus/extents.c @@ -119,23 +119,31 @@ static void __hfsplus_ext_write_extent(struct inode *inode, set_bit(HFSPLUS_I_EXT_DIRTY, &hip->flags); } -static void hfsplus_ext_write_extent_locked(struct inode *inode) +static int hfsplus_ext_write_extent_locked(struct inode *inode) { + int res; + if (HFSPLUS_I(inode)->extent_state & HFSPLUS_EXT_DIRTY) { struct hfs_find_data fd; - if (!hfs_find_init(HFSPLUS_SB(inode->i_sb)->ext_tree, &fd)) { - __hfsplus_ext_write_extent(inode, &fd); - hfs_find_exit(&fd); - } + res = hfs_find_init(HFSPLUS_SB(inode->i_sb)->ext_tree, &fd); + if (res) + return res; + __hfsplus_ext_write_extent(inode, &fd); + hfs_find_exit(&fd); } + return 0; } -void hfsplus_ext_write_extent(struct inode *inode) +int hfsplus_ext_write_extent(struct inode *inode) { + int res; + mutex_lock(&HFSPLUS_I(inode)->extents_lock); - hfsplus_ext_write_extent_locked(inode); + res = hfsplus_ext_write_extent_locked(inode); mutex_unlock(&HFSPLUS_I(inode)->extents_lock); + + return res; } static inline int __hfsplus_ext_read_extent(struct hfs_find_data *fd, @@ -477,7 +485,9 @@ out: insert_extent: dprint(DBG_EXTENT, "insert new extent\n"); - hfsplus_ext_write_extent_locked(inode); + res = hfsplus_ext_write_extent_locked(inode); + if (res) + goto out; memset(hip->cached_extents, 0, sizeof(hfsplus_extent_rec)); hip->cached_extents[0].start_block = cpu_to_be32(start); diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h index d6857523336d..0bebf7488feb 100644 --- a/fs/hfsplus/hfsplus_fs.h +++ b/fs/hfsplus/hfsplus_fs.h @@ -374,7 +374,7 @@ extern const struct file_operations hfsplus_dir_operations; /* extents.c */ int hfsplus_ext_cmp_key(const hfsplus_btree_key *, const hfsplus_btree_key *); -void hfsplus_ext_write_extent(struct inode *); +int hfsplus_ext_write_extent(struct inode *); int hfsplus_get_block(struct inode *, sector_t, struct buffer_head *, int); int hfsplus_free_fork(struct super_block *, u32, struct hfsplus_fork_raw *, int); diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c index 2c1a72287fb5..84f56e1f6dac 100644 --- a/fs/hfsplus/super.c +++ b/fs/hfsplus/super.c @@ -135,9 +135,13 @@ static int hfsplus_system_write_inode(struct inode *inode) static int hfsplus_write_inode(struct inode *inode, struct writeback_control *wbc) { + int err; + dprint(DBG_INODE, "hfsplus_write_inode: %lu\n", inode->i_ino); - hfsplus_ext_write_extent(inode); + err = hfsplus_ext_write_extent(inode); + if (err) + return err; if (inode->i_ino >= HFSPLUS_FIRSTUSER_CNID || inode->i_ino == HFSPLUS_ROOT_CNID) |