diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 30b6b42b9a48..69e4a43c38b4 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -232,20 +232,27 @@ static inline char *bmname(struct bitmap *bitmap) return bitmap->mddev ? mdname(bitmap->mddev) : "mdX"; } -static bool __bitmap_enabled(struct bitmap *bitmap) +static bool __bitmap_enabled(struct bitmap *bitmap, bool flush) { - return bitmap->storage.filemap && - !test_bit(BITMAP_STALE, &bitmap->flags); + if (!flush) + return true; + + /* + * If caller want to flush bitmap pages to underlying disks, check if + * there are cached pages in filemap. + */ + return !test_bit(BITMAP_STALE, &bitmap->flags) && + bitmap->storage.filemap != NULL; } -static bool bitmap_enabled(struct mddev *mddev) +static bool bitmap_enabled(struct mddev *mddev, bool flush) { struct bitmap *bitmap = mddev->bitmap; if (!bitmap) return false; - return __bitmap_enabled(bitmap); + return __bitmap_enabled(bitmap, flush); } /* @@ -1244,7 +1251,7 @@ static void __bitmap_unplug(struct bitmap *bitmap) int dirty, need_write; int writing = 0; - if (!__bitmap_enabled(bitmap)) + if (!__bitmap_enabled(bitmap, true)) return; /* look at each page to see if there are any set bits that need to be diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 0ceb9e97d21f..63d91831655f 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -62,7 +62,7 @@ struct md_bitmap_stats { }; struct bitmap_operations { - bool (*enabled)(struct mddev *mddev); + bool (*enabled)(struct mddev *mddev, bool flush); int (*create)(struct mddev *mddev); int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize); diff --git a/drivers/md/raid1-10.c b/drivers/md/raid1-10.c index 52881e6032da..f3c3376cdd06 100644 --- a/drivers/md/raid1-10.c +++ b/drivers/md/raid1-10.c @@ -140,7 +140,7 @@ static inline bool raid1_add_bio_to_plug(struct mddev *mddev, struct bio *bio, * If bitmap is not enabled, it's safe to submit the io directly, and * this can get optimal performance. */ - if (!mddev->bitmap_ops->enabled(mddev)) { + if (!mddev->bitmap_ops->enabled(mddev, true)) { raid1_submit_write(bio); return true; }