diff options
author | Lukas Czerner <lczerner@redhat.com> | 2019-03-15 00:15:32 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-04-27 09:33:56 +0200 |
commit | d8ef8e9465ef976f3b8a61d9b453947b2d144d73 (patch) | |
tree | 2751e39c4679571846b9eddbc1ced01184657765 /fs/ext4/resize.c | |
parent | e92dc325a560de6efd1e4e1ac6b1f638170ab197 (diff) | |
download | linux-stable-d8ef8e9465ef976f3b8a61d9b453947b2d144d73.tar.gz linux-stable-d8ef8e9465ef976f3b8a61d9b453947b2d144d73.tar.bz2 linux-stable-d8ef8e9465ef976f3b8a61d9b453947b2d144d73.zip |
ext4: add missing brelse() in add_new_gdb_meta_bg()
[ Upstream commit d64264d6218e6892edd832dc3a5a5857c2856c53 ]
Currently in add_new_gdb_meta_bg() there is a missing brelse of gdb_bh
in case ext4_journal_get_write_access() fails.
Additionally kvfree() is missing in the same error path. Fix it by
moving the ext4_journal_get_write_access() before the ext4 sb update as
Ted suggested and release n_group_desc and gdb_bh in case it fails.
Fixes: 61a9c11e5e7a ("ext4: add missing brelse() add_new_gdb_meta_bg()'s error path")
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'fs/ext4/resize.c')
-rw-r--r-- | fs/ext4/resize.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c index 4bd12247a9be..22c90eb9a4e0 100644 --- a/fs/ext4/resize.c +++ b/fs/ext4/resize.c @@ -907,11 +907,18 @@ static int add_new_gdb_meta_bg(struct super_block *sb, memcpy(n_group_desc, o_group_desc, EXT4_SB(sb)->s_gdb_count * sizeof(struct buffer_head *)); n_group_desc[gdb_num] = gdb_bh; + + BUFFER_TRACE(gdb_bh, "get_write_access"); + err = ext4_journal_get_write_access(handle, gdb_bh); + if (err) { + kvfree(n_group_desc); + brelse(gdb_bh); + return err; + } + EXT4_SB(sb)->s_group_desc = n_group_desc; EXT4_SB(sb)->s_gdb_count++; kvfree(o_group_desc); - BUFFER_TRACE(gdb_bh, "get_write_access"); - err = ext4_journal_get_write_access(handle, gdb_bh); return err; } |