summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgmail <yngsion@gmail.com>2016-09-30 01:33:37 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-10-22 12:06:49 +0200
commit9de4a46a278e1375951ad084bbb59b3c57a6e0db (patch)
treea9753e140da7de12cd8d685a8b83979efe708348
parente54ffbb9b42d55340d7f3da69c15f857eb748aa3 (diff)
downloadlinux-stable-9de4a46a278e1375951ad084bbb59b3c57a6e0db.tar.gz
linux-stable-9de4a46a278e1375951ad084bbb59b3c57a6e0db.tar.bz2
linux-stable-9de4a46a278e1375951ad084bbb59b3c57a6e0db.zip
ext4: release bh in make_indexed_dir
commit e81d44778d1d57bbaef9e24c4eac7c8a7a401d40 upstream. The commit 6050d47adcad: "ext4: bail out from make_indexed_dir() on first error" could end up leaking bh2 in the error path. [ Also avoid renaming bh2 to bh, which just confuses things --tytso ] Signed-off-by: yangsheng <yngsion@gmail.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--fs/ext4/namei.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
index 5bb46b6ed456..593f32b7fcd9 100644
--- a/fs/ext4/namei.c
+++ b/fs/ext4/namei.c
@@ -2043,33 +2043,31 @@ static int make_indexed_dir(handle_t *handle, struct ext4_filename *fname,
frame->entries = entries;
frame->at = entries;
frame->bh = bh;
- bh = bh2;
retval = ext4_handle_dirty_dx_node(handle, dir, frame->bh);
if (retval)
goto out_frames;
- retval = ext4_handle_dirty_dirent_node(handle, dir, bh);
+ retval = ext4_handle_dirty_dirent_node(handle, dir, bh2);
if (retval)
goto out_frames;
- de = do_split(handle,dir, &bh, frame, &fname->hinfo);
+ de = do_split(handle,dir, &bh2, frame, &fname->hinfo);
if (IS_ERR(de)) {
retval = PTR_ERR(de);
goto out_frames;
}
- dx_release(frames);
- retval = add_dirent_to_buf(handle, fname, dir, inode, de, bh);
- brelse(bh);
- return retval;
+ retval = add_dirent_to_buf(handle, fname, dir, inode, de, bh2);
out_frames:
/*
* Even if the block split failed, we have to properly write
* out all the changes we did so far. Otherwise we can end up
* with corrupted filesystem.
*/
- ext4_mark_inode_dirty(handle, dir);
+ if (retval)
+ ext4_mark_inode_dirty(handle, dir);
dx_release(frames);
+ brelse(bh2);
return retval;
}