]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
md-bitmap: create and destroy wb_info_pool with the change of backlog
authorGuoqing Jiang <gqjiang@suse.com>
Fri, 14 Jun 2019 09:10:37 +0000 (17:10 +0800)
committerSong Liu <songliubraving@fb.com>
Thu, 20 Jun 2019 23:36:00 +0000 (16:36 -0700)
Since we can enable write-behind mode by write backlog node,
so create wb_info_pool if the mode is just enabled, also call
call md_bitmap_update_sb to make user aware the write-behind
mode is enabled. Conversely, wb_info_pool should be destroyed
when write-behind mode is disabled.

Beside above, it is better to update bitmap sb if we change
the number of max_write_behind.

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 c01d41198f5e614bccd7947a896143457f846a4d..15dd817fe83bf08204ff3c0b13ff44a558d97083 100644 (file)
@@ -2462,12 +2462,26 @@ static ssize_t
 backlog_store(struct mddev *mddev, const char *buf, size_t len)
 {
        unsigned long backlog;
+       unsigned long old_mwb = mddev->bitmap_info.max_write_behind;
        int rv = kstrtoul(buf, 10, &backlog);
        if (rv)
                return rv;
        if (backlog > COUNTER_MAX)
                return -EINVAL;
        mddev->bitmap_info.max_write_behind = backlog;
+       if (!backlog && mddev->wb_info_pool) {
+               /* wb_info_pool is not needed if backlog is zero */
+               mempool_destroy(mddev->wb_info_pool);
+               mddev->wb_info_pool = NULL;
+       } else if (backlog && !mddev->wb_info_pool) {
+               /* wb_info_pool is needed since backlog is not zero */
+               struct md_rdev *rdev;
+
+               rdev_for_each(rdev, mddev)
+                       mddev_create_wb_pool(mddev, rdev, false);
+       }
+       if (old_mwb != backlog)
+               md_bitmap_update_sb(mddev->bitmap);
        return len;
 }