md-bitmap: create and destroy wb_info_pool with the change of bitmap
authorGuoqing Jiang <gqjiang@suse.com>
Fri, 14 Jun 2019 09:10:38 +0000 (17:10 +0800)
committerSong Liu <songliubraving@fb.com>
Thu, 20 Jun 2019 23:36:00 +0000 (16:36 -0700)
The write-behind attribute is part of bitmap, since bitmap
can be added/removed dynamically with the following.

1. mdadm --grow /dev/md0 --bitmap=none
2. mdadm --grow /dev/md0 --bitmap=internal --write-behind

So we need to destroy wb_info_pool in md_bitmap_destroy,
and create the pool before load bitmap.

Reviewed-by: NeilBrown <neilb@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Song Liu <songliubraving@fb.com>
drivers/md/md-bitmap.c

index 15dd817fe83bf08204ff3c0b13ff44a558d97083..b092c7b5282f9608553e19dd36389b4e671df042 100644 (file)
@@ -1790,6 +1790,8 @@ void md_bitmap_destroy(struct mddev *mddev)
                return;
 
        md_bitmap_wait_behind_writes(mddev);
+       mempool_destroy(mddev->wb_info_pool);
+       mddev->wb_info_pool = NULL;
 
        mutex_lock(&mddev->bitmap_info.mutex);
        spin_lock(&mddev->lock);
@@ -1900,10 +1902,14 @@ int md_bitmap_load(struct mddev *mddev)
        sector_t start = 0;
        sector_t sector = 0;
        struct bitmap *bitmap = mddev->bitmap;
+       struct md_rdev *rdev;
 
        if (!bitmap)
                goto out;
 
+       rdev_for_each(rdev, mddev)
+               mddev_create_wb_pool(mddev, rdev, true);
+
        if (mddev_is_clustered(mddev))
                md_cluster_ops->load_bitmaps(mddev, mddev->bitmap_info.nodes);