diff options
Diffstat (limited to 'drivers/md/md-bitmap.c')
| -rw-r--r-- | drivers/md/md-bitmap.c | 25 | 
1 files changed, 12 insertions, 13 deletions
| diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 3ad18246fcb3..e230052c2107 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -1019,8 +1019,6 @@ void md_bitmap_unplug(struct bitmap *bitmap)  	/* look at each page to see if there are any set bits that need to be  	 * flushed out to disk */  	for (i = 0; i < bitmap->storage.file_pages; i++) { -		if (!bitmap->storage.filemap) -			return;  		dirty = test_and_clear_page_attr(bitmap, i, BITMAP_PAGE_DIRTY);  		need_write = test_and_clear_page_attr(bitmap, i,  						      BITMAP_PAGE_NEEDWRITE); @@ -1338,7 +1336,8 @@ void md_bitmap_daemon_work(struct mddev *mddev)  				   BITMAP_PAGE_DIRTY))  			/* bitmap_unplug will handle the rest */  			break; -		if (test_and_clear_page_attr(bitmap, j, +		if (bitmap->storage.filemap && +		    test_and_clear_page_attr(bitmap, j,  					     BITMAP_PAGE_NEEDWRITE)) {  			write_page(bitmap, bitmap->storage.filemap[j], 0);  		} @@ -1790,8 +1789,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; +	if (!mddev->serialize_policy) +		mddev_destroy_serial_pool(mddev, NULL, true);  	mutex_lock(&mddev->bitmap_info.mutex);  	spin_lock(&mddev->lock); @@ -1908,7 +1907,7 @@ int md_bitmap_load(struct mddev *mddev)  		goto out;  	rdev_for_each(rdev, mddev) -		mddev_create_wb_pool(mddev, rdev, true); +		mddev_create_serial_pool(mddev, rdev, true);  	if (mddev_is_clustered(mddev))  		md_cluster_ops->load_bitmaps(mddev, mddev->bitmap_info.nodes); @@ -2475,16 +2474,16 @@ backlog_store(struct mddev *mddev, const char *buf, size_t len)  	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 */ +	if (!backlog && mddev->serial_info_pool) { +		/* serial_info_pool is not needed if backlog is zero */ +		if (!mddev->serialize_policy) +			mddev_destroy_serial_pool(mddev, NULL, false); +	} else if (backlog && !mddev->serial_info_pool) { +		/* serial_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); +			mddev_create_serial_pool(mddev, rdev, false);  	}  	if (old_mwb != backlog)  		md_bitmap_update_sb(mddev->bitmap); | 
