hfsplus: add error propagation to __hfsplus_ext_write_extent()
__hfsplus_ext_write_extent() suppresses errors coming from hfs_brec_find(). The patch implements error code propagation. Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> Reviewed-by: Vyacheslav Dubeyko <slava@dubeyko.com> Cc: Hin-Tak Leung <htl10@users.sourceforge.net> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Cc: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d614267329
commit
d7a475d0c4
1 changed files with 13 additions and 8 deletions
|
@ -83,7 +83,7 @@ static u32 hfsplus_ext_lastblock(struct hfsplus_extent *ext)
|
|||
return be32_to_cpu(ext->start_block) + be32_to_cpu(ext->block_count);
|
||||
}
|
||||
|
||||
static void __hfsplus_ext_write_extent(struct inode *inode,
|
||||
static int __hfsplus_ext_write_extent(struct inode *inode,
|
||||
struct hfs_find_data *fd)
|
||||
{
|
||||
struct hfsplus_inode_info *hip = HFSPLUS_I(inode);
|
||||
|
@ -98,13 +98,13 @@ static void __hfsplus_ext_write_extent(struct inode *inode,
|
|||
res = hfs_brec_find(fd, hfs_find_rec_by_key);
|
||||
if (hip->extent_state & HFSPLUS_EXT_NEW) {
|
||||
if (res != -ENOENT)
|
||||
return;
|
||||
return res;
|
||||
hfs_brec_insert(fd, hip->cached_extents,
|
||||
sizeof(hfsplus_extent_rec));
|
||||
hip->extent_state &= ~(HFSPLUS_EXT_DIRTY | HFSPLUS_EXT_NEW);
|
||||
} else {
|
||||
if (res)
|
||||
return;
|
||||
return res;
|
||||
hfs_bnode_write(fd->bnode, hip->cached_extents,
|
||||
fd->entryoffset, fd->entrylength);
|
||||
hip->extent_state &= ~HFSPLUS_EXT_DIRTY;
|
||||
|
@ -117,11 +117,13 @@ static void __hfsplus_ext_write_extent(struct inode *inode,
|
|||
* to explicily mark the inode dirty, too.
|
||||
*/
|
||||
set_bit(HFSPLUS_I_EXT_DIRTY, &hip->flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int hfsplus_ext_write_extent_locked(struct inode *inode)
|
||||
{
|
||||
int res;
|
||||
int res = 0;
|
||||
|
||||
if (HFSPLUS_I(inode)->extent_state & HFSPLUS_EXT_DIRTY) {
|
||||
struct hfs_find_data fd;
|
||||
|
@ -129,10 +131,10 @@ static int hfsplus_ext_write_extent_locked(struct inode *inode)
|
|||
res = hfs_find_init(HFSPLUS_SB(inode->i_sb)->ext_tree, &fd);
|
||||
if (res)
|
||||
return res;
|
||||
__hfsplus_ext_write_extent(inode, &fd);
|
||||
res = __hfsplus_ext_write_extent(inode, &fd);
|
||||
hfs_find_exit(&fd);
|
||||
}
|
||||
return 0;
|
||||
return res;
|
||||
}
|
||||
|
||||
int hfsplus_ext_write_extent(struct inode *inode)
|
||||
|
@ -175,8 +177,11 @@ static inline int __hfsplus_ext_cache_extent(struct hfs_find_data *fd,
|
|||
|
||||
WARN_ON(!mutex_is_locked(&hip->extents_lock));
|
||||
|
||||
if (hip->extent_state & HFSPLUS_EXT_DIRTY)
|
||||
__hfsplus_ext_write_extent(inode, fd);
|
||||
if (hip->extent_state & HFSPLUS_EXT_DIRTY) {
|
||||
res = __hfsplus_ext_write_extent(inode, fd);
|
||||
if (res)
|
||||
return res;
|
||||
}
|
||||
|
||||
res = __hfsplus_ext_read_extent(fd, hip->cached_extents, inode->i_ino,
|
||||
block, HFSPLUS_IS_RSRC(inode) ?
|
||||
|
|
Loading…
Reference in a new issue