aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/md/md-cluster.c30
-rw-r--r--drivers/md/md-cluster.h1
-rw-r--r--drivers/md/md.c7
3 files changed, 37 insertions, 1 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)
diff --git a/drivers/md/md-cluster.h b/drivers/md/md-cluster.h
index 7417133c4295..71e51432c1f4 100644
--- a/drivers/md/md-cluster.h
+++ b/drivers/md/md-cluster.h
@@ -22,6 +22,7 @@ struct md_cluster_operations {
22 int (*add_new_disk_start)(struct mddev *mddev, struct md_rdev *rdev); 22 int (*add_new_disk_start)(struct mddev *mddev, struct md_rdev *rdev);
23 int (*add_new_disk_finish)(struct mddev *mddev); 23 int (*add_new_disk_finish)(struct mddev *mddev);
24 int (*new_disk_ack)(struct mddev *mddev, bool ack); 24 int (*new_disk_ack)(struct mddev *mddev, bool ack);
25 int (*remove_disk)(struct mddev *mddev, struct md_rdev *rdev);
25}; 26};
26 27
27#endif /* _MD_CLUSTER_H */ 28#endif /* _MD_CLUSTER_H */
diff --git a/drivers/md/md.c b/drivers/md/md.c
index d406a79f9140..ca011d1d1de7 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -2477,8 +2477,10 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
2477 else { 2477 else {
2478 struct mddev *mddev = rdev->mddev; 2478 struct mddev *mddev = rdev->mddev;
2479 if (mddev_is_clustered(mddev)) 2479 if (mddev_is_clustered(mddev))
2480 md_cluster_ops->metadata_update_start(mddev); 2480 md_cluster_ops->remove_disk(mddev, rdev);
2481 md_kick_rdev_from_array(rdev); 2481 md_kick_rdev_from_array(rdev);
2482 if (mddev_is_clustered(mddev))
2483 md_cluster_ops->metadata_update_start(mddev);
2482 if (mddev->pers) 2484 if (mddev->pers)
2483 md_update_sb(mddev, 1); 2485 md_update_sb(mddev, 1);
2484 md_new_event(mddev); 2486 md_new_event(mddev);
@@ -5968,6 +5970,9 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev)
5968 if (rdev->raid_disk >= 0) 5970 if (rdev->raid_disk >= 0)
5969 goto busy; 5971 goto busy;
5970 5972
5973 if (mddev_is_clustered(mddev))
5974 md_cluster_ops->remove_disk(mddev, rdev);
5975
5971 md_kick_rdev_from_array(rdev); 5976 md_kick_rdev_from_array(rdev);
5972 md_update_sb(mddev, 1); 5977 md_update_sb(mddev, 1);
5973 md_new_event(mddev); 5978 md_new_event(mddev);