From: Yu Kuai <yukuai3@xxxxxxxxxx> So that the implementation won't be exposed, and it'll be possible to invent a new bitmap by replacing bitmap_operations. Signed-off-by: Yu Kuai <yukuai3@xxxxxxxxxx> --- drivers/md/md-bitmap.c | 17 +++++++---------- drivers/md/md-bitmap.h | 10 +++++++++- drivers/md/md-cluster.c | 10 +++++----- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 199bd6757543..99c496a32e94 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -1790,10 +1790,7 @@ static void bitmap_flush(struct mddev *mddev) bitmap_update_sb(bitmap); } -/* - * free memory that was allocated - */ -void md_bitmap_free(struct bitmap *bitmap) +static void __bitmap_free(struct bitmap *bitmap) { unsigned long k, pages; struct bitmap_page *bp; @@ -1827,7 +1824,6 @@ void md_bitmap_free(struct bitmap *bitmap) kfree(bp); kfree(bitmap); } -EXPORT_SYMBOL(md_bitmap_free); void md_bitmap_wait_behind_writes(struct mddev *mddev) { @@ -1861,7 +1857,7 @@ static void bitmap_destroy(struct mddev *mddev) mutex_unlock(&mddev->bitmap_info.mutex); mddev_set_timeout(mddev, MAX_SCHEDULE_TIMEOUT, true); - md_bitmap_free(bitmap); + __bitmap_free(bitmap); } /* @@ -1952,7 +1948,7 @@ static struct bitmap *bitmap_create(struct mddev *mddev, int slot) return bitmap; error: - md_bitmap_free(bitmap); + __bitmap_free(bitmap); return ERR_PTR(err); } @@ -2013,7 +2009,7 @@ static int bitmap_load(struct mddev *mddev) return err; } -/* caller need to free returned bitmap with md_bitmap_free() */ +/* caller need to free returned bitmap with __bitmap_free() */ static struct bitmap *bitmap_get_from_slot(struct mddev *mddev, int slot) { int rv = 0; @@ -2027,7 +2023,7 @@ static struct bitmap *bitmap_get_from_slot(struct mddev *mddev, int slot) rv = md_bitmap_init_from_disk(bitmap, 0); if (rv) { - md_bitmap_free(bitmap); + __bitmap_free(bitmap); return ERR_PTR(rv); } @@ -2076,7 +2072,7 @@ static int bitmap_copy_from_slot(struct mddev *mddev, int slot, sector_t *low, md_bitmap_unplug(mddev->bitmap); *low = lo; *high = hi; - md_bitmap_free(bitmap); + __bitmap_free(bitmap); return rv; } @@ -2715,6 +2711,7 @@ static struct bitmap_operations bitmap_ops = { .sync_with_cluster = bitmap_sync_with_cluster, .get_from_slot = bitmap_get_from_slot, .copy_from_slot = bitmap_copy_from_slot, + .free = __bitmap_free, }; void mddev_set_bitmap_ops(struct mddev *mddev) diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index acd868e2ef5e..b5836e5ff1e3 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -263,6 +263,7 @@ struct bitmap_operations { struct bitmap* (*get_from_slot)(struct mddev *mddev, int slot); int (*copy_from_slot)(struct mddev *mddev, int slot, sector_t *lo, sector_t *hi, bool clear_bits); + void (*free)(struct bitmap *bitmap); }; /* the bitmap API */ @@ -433,11 +434,18 @@ static inline int md_bitmap_copy_from_slot(struct mddev *mddev, int slot, return mddev->bitmap_ops->copy_from_slot(mddev, slot, lo, hi, clear_bits); } +static inline void md_bitmap_free(struct mddev *mddev, struct bitmap *bitmap) +{ + if (!mddev->bitmap_ops->free) + return; + + return mddev->bitmap_ops->free(bitmap); +} + void md_bitmap_unplug(struct bitmap *bitmap); void md_bitmap_unplug_async(struct bitmap *bitmap); void md_bitmap_daemon_work(struct mddev *mddev); -void md_bitmap_free(struct bitmap *bitmap); void md_bitmap_wait_behind_writes(struct mddev *mddev); static inline bool md_bitmap_enabled(struct bitmap *bitmap) diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c index d608535fc06a..9e3c579703f6 100644 --- a/drivers/md/md-cluster.c +++ b/drivers/md/md-cluster.c @@ -1192,12 +1192,12 @@ static int resize_bitmaps(struct mddev *mddev, sector_t newsize, sector_t oldsiz * can't resize bitmap */ goto out; - md_bitmap_free(bitmap); + md_bitmap_free(mddev, bitmap); } return 0; out: - md_bitmap_free(bitmap); + md_bitmap_free(mddev, bitmap); update_bitmap_size(mddev, oldsize); return -1; } @@ -1238,7 +1238,7 @@ static int cluster_check_sync_size(struct mddev *mddev) bm_lockres = lockres_init(mddev, str, NULL, 1); if (!bm_lockres) { pr_err("md-cluster: Cannot initialize %s\n", str); - md_bitmap_free(bitmap); + md_bitmap_free(mddev, bitmap); return -1; } bm_lockres->flags |= DLM_LKF_NOQUEUE; @@ -1253,11 +1253,11 @@ static int cluster_check_sync_size(struct mddev *mddev) sync_size = sb->sync_size; else if (sync_size != sb->sync_size) { kunmap_atomic(sb); - md_bitmap_free(bitmap); + md_bitmap_free(mddev, bitmap); return -1; } kunmap_atomic(sb); - md_bitmap_free(bitmap); + md_bitmap_free(mddev, bitmap); } return (my_sync_size == sync_size) ? 0 : -1; -- 2.39.2