Skip to content

Commit

Permalink
md-cluster: remove a disk asynchronously from cluster environment
Browse files Browse the repository at this point in the history
For cluster raid, if one disk couldn't be reach in one node, then
other nodes would receive the REMOVE message for the disk.

In receiving node, we can't call md_kick_rdev_from_array to remove
the disk from array synchronously since the disk might still be busy
in this node. So let's set a ClusterRemove flag on the disk, then
let the thread to do the removal job eventually.

Signed-off-by: Guoqing Jiang <gqjiang@suse.com>
Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
Signed-off-by: NeilBrown <neilb@suse.com>
  • Loading branch information
GuoqingJiang authored and NeilBrown committed Jan 6, 2016
1 parent ac277c6 commit 659b254
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 2 deletions.
7 changes: 5 additions & 2 deletions drivers/md/md-cluster.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,8 +440,11 @@ static void process_remove_disk(struct mddev *mddev, struct cluster_msg *msg)
struct md_rdev *rdev = md_find_rdev_nr_rcu(mddev,
le32_to_cpu(msg->raid_slot));

if (rdev)
md_kick_rdev_from_array(rdev);
if (rdev) {
set_bit(ClusterRemove, &rdev->flags);
set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
md_wakeup_thread(mddev->thread);
}
else
pr_warn("%s: %d Could not find disk(%d) to REMOVE\n",
__func__, __LINE__, le32_to_cpu(msg->raid_slot));
Expand Down
12 changes: 12 additions & 0 deletions drivers/md/md.c
Original file line number Diff line number Diff line change
Expand Up @@ -8318,6 +8318,18 @@ void md_check_recovery(struct mddev *mddev)
goto unlock;
}

if (mddev_is_clustered(mddev)) {
struct md_rdev *rdev;
/* kick the device if another node issued a
* remove disk.
*/
rdev_for_each(rdev, mddev) {
if (test_and_clear_bit(ClusterRemove, &rdev->flags) &&
rdev->raid_disk < 0)
md_kick_rdev_from_array(rdev);
}
}

if (!mddev->external) {
int did_change = 0;
spin_lock(&mddev->lock);
Expand Down
1 change: 1 addition & 0 deletions drivers/md/md.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ enum flag_bits {
* Usually, this device should be faster
* than other devices in the array
*/
ClusterRemove,
};

#define BB_LEN_MASK (0x00000000000001FFULL)
Expand Down

0 comments on commit 659b254

Please sign in to comment.