aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/md-cluster.c
diff options
context:
space:
mode:
authorGoldwyn Rodrigues <rgoldwyn@suse.de>2015-04-14 11:44:44 -0400
committerNeilBrown <neilb@suse.de>2015-04-21 17:59:39 -0400
commit88bcfef7be513e8bf5448e0025330fdd97c4c708 (patch)
tree68cb889fecc9ab303a798bf9b43130701bb34460 /drivers/md/md-cluster.c
parent57d051dccaef395e0d8c0fff02cfc3a77bacc88c (diff)
md-cluster: remove capabilities
This adds "remove" capabilities for the clustered environment. When a user initiates removal of a device from the array, a REMOVE message with disk number in the array is sent to all the nodes which kick the respective device in their own array. This facilitates the removal of failed devices. Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers/md/md-cluster.c')
-rw-r--r--drivers/md/md-cluster.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
index 10c44a3a9d6a..30b41b70db17 100644
--- a/drivers/md/md-cluster.c
+++ b/drivers/md/md-cluster.c
@@ -72,6 +72,7 @@ enum msg_type {
72 METADATA_UPDATED = 0, 72 METADATA_UPDATED = 0,
73 RESYNCING, 73 RESYNCING,
74 NEWDISK, 74 NEWDISK,
75 REMOVE,
75}; 76};
76 77
77struct cluster_msg { 78struct cluster_msg {
@@ -401,6 +402,16 @@ static void process_metadata_update(struct mddev *mddev, struct cluster_msg *msg
401 dlm_lock_sync(cinfo->no_new_dev_lockres, DLM_LOCK_CR); 402 dlm_lock_sync(cinfo->no_new_dev_lockres, DLM_LOCK_CR);
402} 403}
403 404
405static void process_remove_disk(struct mddev *mddev, struct cluster_msg *msg)
406{
407 struct md_rdev *rdev = md_find_rdev_nr_rcu(mddev, msg->raid_slot);
408
409 if (rdev)
410 md_kick_rdev_from_array(rdev);
411 else
412 pr_warn("%s: %d Could not find disk(%d) to REMOVE\n", __func__, __LINE__, msg->raid_slot);
413}
414
404static void process_recvd_msg(struct mddev *mddev, struct cluster_msg *msg) 415static void process_recvd_msg(struct mddev *mddev, struct cluster_msg *msg)
405{ 416{
406 switch (msg->type) { 417 switch (msg->type) {
@@ -419,6 +430,15 @@ static void process_recvd_msg(struct mddev *mddev, struct cluster_msg *msg)
419 pr_info("%s: %d Received message: NEWDISK from %d\n", 430 pr_info("%s: %d Received message: NEWDISK from %d\n",
420 __func__, __LINE__, msg->slot); 431 __func__, __LINE__, msg->slot);
421 process_add_new_disk(mddev, msg); 432 process_add_new_disk(mddev, msg);
433 break;
434 case REMOVE:
435 pr_info("%s: %d Received REMOVE from %d\n",
436 __func__, __LINE__, msg->slot);
437 process_remove_disk(mddev, msg);
438 break;
439 default:
440 pr_warn("%s:%d Received unknown message from %d\n",
441 __func__, __LINE__, msg->slot);
422 } 442 }
423} 443}
424 444
@@ -854,6 +874,15 @@ static int new_disk_ack(struct mddev *mddev, bool ack)
854 return 0; 874 return 0;
855} 875}
856 876
877static int remove_disk(struct mddev *mddev, struct md_rdev *rdev)
878{
879 struct cluster_msg cmsg;
880 struct md_cluster_info *cinfo = mddev->cluster_info;
881 cmsg.type = REMOVE;
882 cmsg.raid_slot = rdev->desc_nr;
883 return __sendmsg(cinfo, &cmsg);
884}
885
857static struct md_cluster_operations cluster_ops = { 886static struct md_cluster_operations cluster_ops = {
858 .join = join, 887 .join = join,
859 .leave = leave, 888 .leave = leave,
@@ -868,6 +897,7 @@ static struct md_cluster_operations cluster_ops = {
868 .add_new_disk_start = add_new_disk_start, 897 .add_new_disk_start = add_new_disk_start,
869 .add_new_disk_finish = add_new_disk_finish, 898 .add_new_disk_finish = add_new_disk_finish,
870 .new_disk_ack = new_disk_ack, 899 .new_disk_ack = new_disk_ack,
900 .remove_disk = remove_disk,
871}; 901};
872 902
873static int __init cluster_init(void) 903static int __init cluster_init(void)