|
@@ -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);
|