From: Yu Kuai <yukuai3@xxxxxxxxxx> There are no functional changes, prepare to handle the case that mddev->bitmap_ops can be NULL, which is possible after support to build md-bitmap as kernel module. Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> --- drivers/md/md-bitmap.c | 16 ++++------------ drivers/md/md-bitmap.h | 19 ++++++++++++++++++- drivers/md/raid1-10.c | 2 +- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index bf6de7ad3b6a..4450edd9774f 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -220,22 +220,14 @@ 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(void *data) { + struct bitmap *bitmap = data; + return bitmap->storage.filemap && !test_bit(BITMAP_STALE, &bitmap->flags); } -static bool bitmap_enabled(struct mddev *mddev) -{ - struct bitmap *bitmap = mddev->bitmap; - - if (!bitmap) - return false; - - return __bitmap_enabled(bitmap); -} - /* * check a page and, if necessary, allocate it (or hijack it if the alloc fails) * @@ -1232,7 +1224,7 @@ static void __bitmap_unplug(struct bitmap *bitmap) int dirty, need_write; int writing = 0; - if (!__bitmap_enabled(bitmap)) + if (!bitmap_enabled(bitmap)) 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 5a2aa1324df0..3b242ee10856 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -71,7 +71,7 @@ struct md_bitmap_stats { }; struct bitmap_operations { - bool (*enabled)(struct mddev *mddev); + bool (*enabled)(void *data); int (*create)(struct mddev *mddev, int slot); int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize); @@ -116,4 +116,21 @@ struct bitmap_operations { /* the bitmap API */ void mddev_set_bitmap_ops(struct mddev *mddev); +static inline bool md_bitmap_registered(struct mddev *mddev) +{ + return mddev->bitmap_ops != NULL; +} + +static inline bool md_bitmap_enabled(struct mddev *mddev) +{ + /* bitmap_ops must be registered before creating bitmap. */ + if (!md_bitmap_registered(mddev)) + return false; + + if (!mddev->bitmap) + return false; + + return mddev->bitmap_ops->enabled(mddev->bitmap); +} + #endif diff --git a/drivers/md/raid1-10.c b/drivers/md/raid1-10.c index 4378d3250bd7..6b8b7b7f1678 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 (!md_bitmap_enabled(mddev)) { raid1_submit_write(bio); return true; } -- 2.39.2