diff options
author | Guoqing Jiang <gqjiang@suse.com> | 2016-05-02 11:50:15 -0400 |
---|---|---|
committer | Shaohua Li <shli@fb.com> | 2016-05-04 12:39:35 -0700 |
commit | c84400c89f0f98ae4a73ed89886239b67d1dcd31 (patch) | |
tree | bc6b5b5563494ead2f8f10a769670259f90c860b /drivers/md/bitmap.c | |
parent | 23cea66a37c76dc6554b862b179a654db24fa83d (diff) | |
download | linux-stable-c84400c89f0f98ae4a73ed89886239b67d1dcd31.tar.gz linux-stable-c84400c89f0f98ae4a73ed89886239b67d1dcd31.tar.bz2 linux-stable-c84400c89f0f98ae4a73ed89886239b67d1dcd31.zip |
md-cluster/bitmap: unplug bitmap to sync dirty pages to disk
This patch is doing two distinct but related things.
1. It adds bitmap_unplug() for the main bitmap (mddev->bitmap). As bit
have been set, BITMAP_PAGE_DIRTY is set so bitmap_deamon_work() will
not write those pages out in its regular scans, only bitmap_unplug()
will. If there are no writes to the array, bitmap_unplug() won't be
called, so we need to call it explicitly here.
2. bitmap_write_all() is a bit of a confusing interface as it doesn't
actually write anything. The current code for writing "bitmap" works
but this change makes it a bit clearer.
Reviewed-by: NeilBrown <neilb@suse.com>
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
Diffstat (limited to 'drivers/md/bitmap.c')
-rw-r--r-- | drivers/md/bitmap.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c index de28c8095df8..4a05bacd6601 100644 --- a/drivers/md/bitmap.c +++ b/drivers/md/bitmap.c @@ -1924,14 +1924,14 @@ int bitmap_copy_from_slot(struct mddev *mddev, int slot, if (clear_bits) { bitmap_update_sb(bitmap); - /* Setting this for the ev_page should be enough. - * And we do not require both write_all and PAGE_DIRT either - */ + /* BITMAP_PAGE_PENDING is set, but bitmap_unplug needs + * BITMAP_PAGE_DIRTY or _NEEDWRITE to write ... */ for (i = 0; i < bitmap->storage.file_pages; i++) - set_page_attr(bitmap, i, BITMAP_PAGE_DIRTY); - bitmap_write_all(bitmap); + if (test_page_attr(bitmap, i, BITMAP_PAGE_PENDING)) + set_page_attr(bitmap, i, BITMAP_PAGE_NEEDWRITE); bitmap_unplug(bitmap); } + bitmap_unplug(mddev->bitmap); *low = lo; *high = hi; err: |