ext4: properly handle error of ext4_init_block_bitmap in ext4_read_block_bitmap_nowait
authorKemeng Shi <shikemeng@huaweicloud.com>
Tue, 21 Feb 2023 11:59:13 +0000 (19:59 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 24 Mar 2023 03:00:07 +0000 (23:00 -0400)
We mark buffer_head of bitmap successfully initialized even error occurs
in ext4_init_block_bitmap. Although we will return error, we will get a
invalid buffer_head of bitmap from next ext4_read_block_bitmap_nowait
which is marked buffer_verified but not successfully initialized actually
in previous ext4_read_block_bitmap_nowait.
Fix this by only marking buffer_head successfully initialized if
ext4_init_block_bitmap successes.

Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
Link: https://lore.kernel.org/r/20230221115919.1918161-2-shikemeng@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/balloc.c

index 8ff4b91..10cab74 100644 (file)
@@ -474,16 +474,18 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group,
                        goto out;
                }
                err = ext4_init_block_bitmap(sb, bh, block_group, desc);
-               set_bitmap_uptodate(bh);
-               set_buffer_uptodate(bh);
-               set_buffer_verified(bh);
-               ext4_unlock_group(sb, block_group);
-               unlock_buffer(bh);
                if (err) {
+                       ext4_unlock_group(sb, block_group);
+                       unlock_buffer(bh);
                        ext4_error(sb, "Failed to init block bitmap for group "
                                   "%u: %d", block_group, err);
                        goto out;
                }
+               set_bitmap_uptodate(bh);
+               set_buffer_uptodate(bh);
+               set_buffer_verified(bh);
+               ext4_unlock_group(sb, block_group);
+               unlock_buffer(bh);
                goto verify;
        }
        ext4_unlock_group(sb, block_group);