aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGoldwyn Rodrigues <rgoldwyn@suse.com>2014-06-07 02:44:51 -0400
committerGoldwyn Rodrigues <rgoldwyn@suse.com>2015-02-23 10:59:06 -0500
commit293467aa1f161cd50920ccf7fc1efa3946a4d50c (patch)
tree661c54b1c0e45b1f8bdd56c86a9564887c9ec069
parent601b515c5dcc00fa71148cd9d2405ea1f70bc9cd (diff)
metadata_update sends message to other nodes
- request to send a message - make changes to superblock - send messages telling everyone that the superblock has changed - other nodes all read the superblock - other nodes all ack the messages - updating node release the "I'm sending a message" resource. Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.com>
-rw-r--r--drivers/md/md-cluster.c28
-rw-r--r--drivers/md/md-cluster.h3
-rw-r--r--drivers/md/md.c89
3 files changed, 106 insertions, 14 deletions
diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c
index 9a4abe1b4aa4..5db491010835 100644
--- a/drivers/md/md-cluster.c
+++ b/drivers/md/md-cluster.c
@@ -621,11 +621,39 @@ static void resync_info_update(struct mddev *mddev, sector_t lo, sector_t hi)
621 dlm_lock_sync(cinfo->bitmap_lockres, DLM_LOCK_PW); 621 dlm_lock_sync(cinfo->bitmap_lockres, DLM_LOCK_PW);
622} 622}
623 623
624static int metadata_update_start(struct mddev *mddev)
625{
626 return lock_comm(mddev->cluster_info);
627}
628
629static int metadata_update_finish(struct mddev *mddev)
630{
631 struct md_cluster_info *cinfo = mddev->cluster_info;
632 struct cluster_msg cmsg;
633 int ret;
634
635 memset(&cmsg, 0, sizeof(cmsg));
636 cmsg.type = cpu_to_le32(METADATA_UPDATED);
637 ret = __sendmsg(cinfo, &cmsg);
638 unlock_comm(cinfo);
639 return ret;
640}
641
642static int metadata_update_cancel(struct mddev *mddev)
643{
644 struct md_cluster_info *cinfo = mddev->cluster_info;
645
646 return dlm_unlock_sync(cinfo->token_lockres);
647}
648
624static struct md_cluster_operations cluster_ops = { 649static struct md_cluster_operations cluster_ops = {
625 .join = join, 650 .join = join,
626 .leave = leave, 651 .leave = leave,
627 .slot_number = slot_number, 652 .slot_number = slot_number,
628 .resync_info_update = resync_info_update, 653 .resync_info_update = resync_info_update,
654 .metadata_update_start = metadata_update_start,
655 .metadata_update_finish = metadata_update_finish,
656 .metadata_update_cancel = metadata_update_cancel,
629}; 657};
630 658
631static int __init cluster_init(void) 659static int __init cluster_init(void)
diff --git a/drivers/md/md-cluster.h b/drivers/md/md-cluster.h
index 51a24df15b64..658982afcf9b 100644
--- a/drivers/md/md-cluster.h
+++ b/drivers/md/md-cluster.h
@@ -12,6 +12,9 @@ struct md_cluster_operations {
12 int (*leave)(struct mddev *mddev); 12 int (*leave)(struct mddev *mddev);
13 int (*slot_number)(struct mddev *mddev); 13 int (*slot_number)(struct mddev *mddev);
14 void (*resync_info_update)(struct mddev *mddev, sector_t lo, sector_t hi); 14 void (*resync_info_update)(struct mddev *mddev, sector_t lo, sector_t hi);
15 int (*metadata_update_start)(struct mddev *mddev);
16 int (*metadata_update_finish)(struct mddev *mddev);
17 int (*metadata_update_cancel)(struct mddev *mddev);
15}; 18};
16 19
17#endif /* _MD_CLUSTER_H */ 20#endif /* _MD_CLUSTER_H */
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 630a9142a819..0052e433d8a6 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -2472,10 +2472,14 @@ state_store(struct md_rdev *rdev, const char *buf, size_t len)
2472 err = -EBUSY; 2472 err = -EBUSY;
2473 else { 2473 else {
2474 struct mddev *mddev = rdev->mddev; 2474 struct mddev *mddev = rdev->mddev;
2475 if (mddev_is_clustered(mddev))
2476 md_cluster_ops->metadata_update_start(mddev);
2475 kick_rdev_from_array(rdev); 2477 kick_rdev_from_array(rdev);
2476 if (mddev->pers) 2478 if (mddev->pers)
2477 md_update_sb(mddev, 1); 2479 md_update_sb(mddev, 1);
2478 md_new_event(mddev); 2480 md_new_event(mddev);
2481 if (mddev_is_clustered(mddev))
2482 md_cluster_ops->metadata_update_finish(mddev);
2479 err = 0; 2483 err = 0;
2480 } 2484 }
2481 } else if (cmd_match(buf, "writemostly")) { 2485 } else if (cmd_match(buf, "writemostly")) {
@@ -4008,8 +4012,12 @@ size_store(struct mddev *mddev, const char *buf, size_t len)
4008 if (err) 4012 if (err)
4009 return err; 4013 return err;
4010 if (mddev->pers) { 4014 if (mddev->pers) {
4015 if (mddev_is_clustered(mddev))
4016 md_cluster_ops->metadata_update_start(mddev);
4011 err = update_size(mddev, sectors); 4017 err = update_size(mddev, sectors);
4012 md_update_sb(mddev, 1); 4018 md_update_sb(mddev, 1);
4019 if (mddev_is_clustered(mddev))
4020 md_cluster_ops->metadata_update_finish(mddev);
4013 } else { 4021 } else {
4014 if (mddev->dev_sectors == 0 || 4022 if (mddev->dev_sectors == 0 ||
4015 mddev->dev_sectors > sectors) 4023 mddev->dev_sectors > sectors)
@@ -5236,6 +5244,8 @@ static void md_clean(struct mddev *mddev)
5236 5244
5237static void __md_stop_writes(struct mddev *mddev) 5245static void __md_stop_writes(struct mddev *mddev)
5238{ 5246{
5247 if (mddev_is_clustered(mddev))
5248 md_cluster_ops->metadata_update_start(mddev);
5239 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery); 5249 set_bit(MD_RECOVERY_FROZEN, &mddev->recovery);
5240 flush_workqueue(md_misc_wq); 5250 flush_workqueue(md_misc_wq);
5241 if (mddev->sync_thread) { 5251 if (mddev->sync_thread) {
@@ -5254,6 +5264,8 @@ static void __md_stop_writes(struct mddev *mddev)
5254 mddev->in_sync = 1; 5264 mddev->in_sync = 1;
5255 md_update_sb(mddev, 1); 5265 md_update_sb(mddev, 1);
5256 } 5266 }
5267 if (mddev_is_clustered(mddev))
5268 md_cluster_ops->metadata_update_finish(mddev);
5257} 5269}
5258 5270
5259void md_stop_writes(struct mddev *mddev) 5271void md_stop_writes(struct mddev *mddev)
@@ -5902,6 +5914,9 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev)
5902 if (!rdev) 5914 if (!rdev)
5903 return -ENXIO; 5915 return -ENXIO;
5904 5916
5917 if (mddev_is_clustered(mddev))
5918 md_cluster_ops->metadata_update_start(mddev);
5919
5905 clear_bit(Blocked, &rdev->flags); 5920 clear_bit(Blocked, &rdev->flags);
5906 remove_and_add_spares(mddev, rdev); 5921 remove_and_add_spares(mddev, rdev);
5907 5922
@@ -5912,8 +5927,13 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev)
5912 md_update_sb(mddev, 1); 5927 md_update_sb(mddev, 1);
5913 md_new_event(mddev); 5928 md_new_event(mddev);
5914 5929
5930 if (mddev_is_clustered(mddev))
5931 md_cluster_ops->metadata_update_finish(mddev);
5932
5915 return 0; 5933 return 0;
5916busy: 5934busy:
5935 if (mddev_is_clustered(mddev))
5936 md_cluster_ops->metadata_update_cancel(mddev);
5917 printk(KERN_WARNING "md: cannot remove active disk %s from %s ...\n", 5937 printk(KERN_WARNING "md: cannot remove active disk %s from %s ...\n",
5918 bdevname(rdev->bdev,b), mdname(mddev)); 5938 bdevname(rdev->bdev,b), mdname(mddev));
5919 return -EBUSY; 5939 return -EBUSY;
@@ -5963,12 +5983,15 @@ static int hot_add_disk(struct mddev *mddev, dev_t dev)
5963 err = -EINVAL; 5983 err = -EINVAL;
5964 goto abort_export; 5984 goto abort_export;
5965 } 5985 }
5986
5987 if (mddev_is_clustered(mddev))
5988 md_cluster_ops->metadata_update_start(mddev);
5966 clear_bit(In_sync, &rdev->flags); 5989 clear_bit(In_sync, &rdev->flags);
5967 rdev->desc_nr = -1; 5990 rdev->desc_nr = -1;
5968 rdev->saved_raid_disk = -1; 5991 rdev->saved_raid_disk = -1;
5969 err = bind_rdev_to_array(rdev, mddev); 5992 err = bind_rdev_to_array(rdev, mddev);
5970 if (err) 5993 if (err)
5971 goto abort_export; 5994 goto abort_clustered;
5972 5995
5973 /* 5996 /*
5974 * The rest should better be atomic, we can have disk failures 5997 * The rest should better be atomic, we can have disk failures
@@ -5979,6 +6002,8 @@ static int hot_add_disk(struct mddev *mddev, dev_t dev)
5979 6002
5980 md_update_sb(mddev, 1); 6003 md_update_sb(mddev, 1);
5981 6004
6005 if (mddev_is_clustered(mddev))
6006 md_cluster_ops->metadata_update_finish(mddev);
5982 /* 6007 /*
5983 * Kick recovery, maybe this spare has to be added to the 6008 * Kick recovery, maybe this spare has to be added to the
5984 * array immediately. 6009 * array immediately.
@@ -5988,6 +6013,9 @@ static int hot_add_disk(struct mddev *mddev, dev_t dev)
5988 md_new_event(mddev); 6013 md_new_event(mddev);
5989 return 0; 6014 return 0;
5990 6015
6016abort_clustered:
6017 if (mddev_is_clustered(mddev))
6018 md_cluster_ops->metadata_update_cancel(mddev);
5991abort_export: 6019abort_export:
5992 export_rdev(rdev); 6020 export_rdev(rdev);
5993 return err; 6021 return err;
@@ -6304,6 +6332,8 @@ static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
6304 return rv; 6332 return rv;
6305 } 6333 }
6306 } 6334 }
6335 if (mddev_is_clustered(mddev))
6336 md_cluster_ops->metadata_update_start(mddev);
6307 if (info->size >= 0 && mddev->dev_sectors / 2 != info->size) 6337 if (info->size >= 0 && mddev->dev_sectors / 2 != info->size)
6308 rv = update_size(mddev, (sector_t)info->size * 2); 6338 rv = update_size(mddev, (sector_t)info->size * 2);
6309 6339
@@ -6311,17 +6341,25 @@ static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
6311 rv = update_raid_disks(mddev, info->raid_disks); 6341 rv = update_raid_disks(mddev, info->raid_disks);
6312 6342
6313 if ((state ^ info->state) & (1<<MD_SB_BITMAP_PRESENT)) { 6343 if ((state ^ info->state) & (1<<MD_SB_BITMAP_PRESENT)) {
6314 if (mddev->pers->quiesce == NULL || mddev->thread == NULL) 6344 if (mddev->pers->quiesce == NULL || mddev->thread == NULL) {
6315 return -EINVAL; 6345 rv = -EINVAL;
6316 if (mddev->recovery || mddev->sync_thread) 6346 goto err;
6317 return -EBUSY; 6347 }
6348 if (mddev->recovery || mddev->sync_thread) {
6349 rv = -EBUSY;
6350 goto err;
6351 }
6318 if (info->state & (1<<MD_SB_BITMAP_PRESENT)) { 6352 if (info->state & (1<<MD_SB_BITMAP_PRESENT)) {
6319 struct bitmap *bitmap; 6353 struct bitmap *bitmap;
6320 /* add the bitmap */ 6354 /* add the bitmap */
6321 if (mddev->bitmap) 6355 if (mddev->bitmap) {
6322 return -EEXIST; 6356 rv = -EEXIST;
6323 if (mddev->bitmap_info.default_offset == 0) 6357 goto err;
6324 return -EINVAL; 6358 }
6359 if (mddev->bitmap_info.default_offset == 0) {
6360 rv = -EINVAL;
6361 goto err;
6362 }
6325 mddev->bitmap_info.offset = 6363 mddev->bitmap_info.offset =
6326 mddev->bitmap_info.default_offset; 6364 mddev->bitmap_info.default_offset;
6327 mddev->bitmap_info.space = 6365 mddev->bitmap_info.space =
@@ -6337,10 +6375,14 @@ static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
6337 mddev->pers->quiesce(mddev, 0); 6375 mddev->pers->quiesce(mddev, 0);
6338 } else { 6376 } else {
6339 /* remove the bitmap */ 6377 /* remove the bitmap */
6340 if (!mddev->bitmap) 6378 if (!mddev->bitmap) {
6341 return -ENOENT; 6379 rv = -ENOENT;
6342 if (mddev->bitmap->storage.file) 6380 goto err;
6343 return -EINVAL; 6381 }
6382 if (mddev->bitmap->storage.file) {
6383 rv = -EINVAL;
6384 goto err;
6385 }
6344 mddev->pers->quiesce(mddev, 1); 6386 mddev->pers->quiesce(mddev, 1);
6345 bitmap_destroy(mddev); 6387 bitmap_destroy(mddev);
6346 mddev->pers->quiesce(mddev, 0); 6388 mddev->pers->quiesce(mddev, 0);
@@ -6348,6 +6390,12 @@ static int update_array_info(struct mddev *mddev, mdu_array_info_t *info)
6348 } 6390 }
6349 } 6391 }
6350 md_update_sb(mddev, 1); 6392 md_update_sb(mddev, 1);
6393 if (mddev_is_clustered(mddev))
6394 md_cluster_ops->metadata_update_finish(mddev);
6395 return rv;
6396err:
6397 if (mddev_is_clustered(mddev))
6398 md_cluster_ops->metadata_update_cancel(mddev);
6351 return rv; 6399 return rv;
6352} 6400}
6353 6401
@@ -7438,7 +7486,11 @@ int md_allow_write(struct mddev *mddev)
7438 mddev->safemode == 0) 7486 mddev->safemode == 0)
7439 mddev->safemode = 1; 7487 mddev->safemode = 1;
7440 spin_unlock(&mddev->lock); 7488 spin_unlock(&mddev->lock);
7489 if (mddev_is_clustered(mddev))
7490 md_cluster_ops->metadata_update_start(mddev);
7441 md_update_sb(mddev, 0); 7491 md_update_sb(mddev, 0);
7492 if (mddev_is_clustered(mddev))
7493 md_cluster_ops->metadata_update_finish(mddev);
7442 sysfs_notify_dirent_safe(mddev->sysfs_state); 7494 sysfs_notify_dirent_safe(mddev->sysfs_state);
7443 } else 7495 } else
7444 spin_unlock(&mddev->lock); 7496 spin_unlock(&mddev->lock);
@@ -7996,8 +8048,13 @@ void md_check_recovery(struct mddev *mddev)
7996 sysfs_notify_dirent_safe(mddev->sysfs_state); 8048 sysfs_notify_dirent_safe(mddev->sysfs_state);
7997 } 8049 }
7998 8050
7999 if (mddev->flags & MD_UPDATE_SB_FLAGS) 8051 if (mddev->flags & MD_UPDATE_SB_FLAGS) {
8052 if (mddev_is_clustered(mddev))
8053 md_cluster_ops->metadata_update_start(mddev);
8000 md_update_sb(mddev, 0); 8054 md_update_sb(mddev, 0);
8055 if (mddev_is_clustered(mddev))
8056 md_cluster_ops->metadata_update_finish(mddev);
8057 }
8001 8058
8002 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) && 8059 if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) &&
8003 !test_bit(MD_RECOVERY_DONE, &mddev->recovery)) { 8060 !test_bit(MD_RECOVERY_DONE, &mddev->recovery)) {
@@ -8095,6 +8152,8 @@ void md_reap_sync_thread(struct mddev *mddev)
8095 set_bit(MD_CHANGE_DEVS, &mddev->flags); 8152 set_bit(MD_CHANGE_DEVS, &mddev->flags);
8096 } 8153 }
8097 } 8154 }
8155 if (mddev_is_clustered(mddev))
8156 md_cluster_ops->metadata_update_start(mddev);
8098 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) && 8157 if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) &&
8099 mddev->pers->finish_reshape) 8158 mddev->pers->finish_reshape)
8100 mddev->pers->finish_reshape(mddev); 8159 mddev->pers->finish_reshape(mddev);
@@ -8107,6 +8166,8 @@ void md_reap_sync_thread(struct mddev *mddev)
8107 rdev->saved_raid_disk = -1; 8166 rdev->saved_raid_disk = -1;
8108 8167
8109 md_update_sb(mddev, 1); 8168 md_update_sb(mddev, 1);
8169 if (mddev_is_clustered(mddev))
8170 md_cluster_ops->metadata_update_finish(mddev);
8110 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery); 8171 clear_bit(MD_RECOVERY_RUNNING, &mddev->recovery);
8111 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery); 8172 clear_bit(MD_RECOVERY_SYNC, &mddev->recovery);
8112 clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery); 8173 clear_bit(MD_RECOVERY_RESHAPE, &mddev->recovery);