diff options
author | Goldwyn Rodrigues <rgoldwyn@suse.de> | 2015-04-14 10:45:42 -0500 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2015-04-22 07:59:39 +1000 |
commit | 97f6cd39da227459cb46ed4088d37d5d8db51c50 (patch) | |
tree | 129f07ab60f7f7fd4b6ac792bb29d40bcf938aa1 /drivers/md/md.c | |
parent | a6da4ef85cef0382244fc588c901e133a2ec5109 (diff) | |
download | op-kernel-dev-97f6cd39da227459cb46ed4088d37d5d8db51c50.zip op-kernel-dev-97f6cd39da227459cb46ed4088d37d5d8db51c50.tar.gz |
md-cluster: re-add capabilities
When "re-add" is writted to /sys/block/mdXX/md/dev-YYY/state,
the clustered md:
1. Sends RE_ADD message with the desc_nr. Nodes receiving the message
clear the Faulty bit in their respective rdev->flags.
2. The node initiating re-add, gathers the bitmaps of all nodes
and copies them into the local bitmap. It does not clear the bitmap
from which it is copying.
3. Initiating node schedules a md recovery to sync the devices.
Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 429e95e..d9cac48 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -2596,8 +2596,17 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len) } } else if (cmd_match(buf, "re-add")) { if (test_bit(Faulty, &rdev->flags) && (rdev->raid_disk == -1)) { - clear_bit(Faulty, &rdev->flags); - err = add_bound_rdev(rdev); + /* clear_bit is performed _after_ all the devices + * have their local Faulty bit cleared. If any writes + * happen in the meantime in the local node, they + * will land in the local bitmap, which will be synced + * by this node eventually + */ + if (!mddev_is_clustered(rdev->mddev) || + (err = md_cluster_ops->gather_bitmaps(rdev)) == 0) { + clear_bit(Faulty, &rdev->flags); + err = add_bound_rdev(rdev); + } } else err = -EBUSY; } |