ext4: release bh in make_indexed_dir
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 ] Cc: stable@vger.kernel.org Signed-off-by: yangsheng <yngsion@gmail.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
Родитель
16c5468859
Коммит
e81d44778d
|
@ -2044,33 +2044,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;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче