ext4: Use new buffer_head flag to check uninit group bitmaps initialization
For uninit block group, the on-disk bitmap is not initialized. That implies we cannot depend on the uptodate flag on the bitmap buffer_head to find bitmap validity. Use a new buffer_head flag which would be set after we properly initialize the bitmap. This also prevents (re-)initializing the uninit group bitmap every time we call ext4_read_block_bitmap(). Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> Cc: stable@kernel.org
This commit is contained in:
committed by
Theodore Ts'o
parent
393418676a
commit
2ccb5fb9f1
@@ -794,22 +794,42 @@ static int ext4_mb_init_cache(struct page *page, char *incore)
|
||||
if (bh[i] == NULL)
|
||||
goto out;
|
||||
|
||||
if (buffer_uptodate(bh[i]) &&
|
||||
!(desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)))
|
||||
if (bitmap_uptodate(bh[i]))
|
||||
continue;
|
||||
|
||||
lock_buffer(bh[i]);
|
||||
if (bitmap_uptodate(bh[i])) {
|
||||
unlock_buffer(bh[i]);
|
||||
continue;
|
||||
}
|
||||
spin_lock(sb_bgl_lock(EXT4_SB(sb), first_group + i));
|
||||
if (desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
|
||||
ext4_init_block_bitmap(sb, bh[i],
|
||||
first_group + i, desc);
|
||||
set_bitmap_uptodate(bh[i]);
|
||||
set_buffer_uptodate(bh[i]);
|
||||
spin_unlock(sb_bgl_lock(EXT4_SB(sb), first_group + i));
|
||||
unlock_buffer(bh[i]);
|
||||
continue;
|
||||
}
|
||||
spin_unlock(sb_bgl_lock(EXT4_SB(sb), first_group + i));
|
||||
if (buffer_uptodate(bh[i])) {
|
||||
/*
|
||||
* if not uninit if bh is uptodate,
|
||||
* bitmap is also uptodate
|
||||
*/
|
||||
set_bitmap_uptodate(bh[i]);
|
||||
unlock_buffer(bh[i]);
|
||||
continue;
|
||||
}
|
||||
get_bh(bh[i]);
|
||||
/*
|
||||
* submit the buffer_head for read. We can
|
||||
* safely mark the bitmap as uptodate now.
|
||||
* We do it here so the bitmap uptodate bit
|
||||
* get set with buffer lock held.
|
||||
*/
|
||||
set_bitmap_uptodate(bh[i]);
|
||||
bh[i]->b_end_io = end_buffer_read_sync;
|
||||
submit_bh(READ, bh[i]);
|
||||
mb_debug("read bitmap for group %u\n", first_group + i);
|
||||
|
Reference in New Issue
Block a user