History

md: check the return value for metadata_update_start

We shouldn't run related funs of md_cluster_ops in case metadata_update_start returned failure.

Guoqing Jiang committed 11 years ago

Commit 23b63f91 parent a9720901 file · +9 −6Browse files

Unified · Split

drivers/md/md.c+9−6
@@ -2245,6 +2245,7 @@ void md_update_sb(struct mddev *mddev, int force_change) · 2244 unmodified lines
22452245 int sync_req;
22462246 int nospares = 0;
22472247 int any_badblocks_changed = 0;
2248+ int ret = -1;
22482249
22492250 if (mddev->ro) {
22502251 if (force_change)
@@ -2255,10 +2256,11 @@ void md_update_sb(struct mddev *mddev, int force_change) · 4 unmodified lines
22552256 if (mddev_is_clustered(mddev)) {
22562257 if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags))
22572258 force_change = 1;
2258− md_cluster_ops->metadata_update_start(mddev);
2259+ ret = md_cluster_ops->metadata_update_start(mddev);
22592260 /* Has someone else has updated the sb */
22602261 if (!does_sb_need_changing(mddev)) {
2261− md_cluster_ops->metadata_update_cancel(mddev);
2262+ if (ret == 0)
2263+ md_cluster_ops->metadata_update_cancel(mddev);
22622264 clear_bit(MD_CHANGE_PENDING, &mddev->flags);
22632265 return;
22642266 }
@@ -2412,7 +2414,7 @@ repeat: · 147 unmodified lines
24122414 wake_up(&rdev->blocked_wait);
24132415 }
24142416
2415− if (mddev_is_clustered(mddev))
2417+ if (mddev_is_clustered(mddev) && ret == 0)
24162418 md_cluster_ops->metadata_update_finish(mddev);
24172419 }
24182420 EXPORT_SYMBOL(md_update_sb);
@@ -6031,13 +6033,14 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev) · 3612 unmodified lines
60316033 {
60326034 char b[BDEVNAME_SIZE];
60336035 struct md_rdev *rdev;
6036+ int ret = -1;
60346037
60356038 rdev = find_rdev(mddev, dev);
60366039 if (!rdev)
60376040 return -ENXIO;
60386041
60396042 if (mddev_is_clustered(mddev))
6040− md_cluster_ops->metadata_update_start(mddev);
6043+ ret = md_cluster_ops->metadata_update_start(mddev);
60416044
60426045 if (rdev->raid_disk < 0)
60436046 goto kick_rdev;
@@ -6049,7 +6052,7 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev) · 5 unmodified lines
60496052 goto busy;
60506053
60516054 kick_rdev:
6052− if (mddev_is_clustered(mddev))
6055+ if (mddev_is_clustered(mddev) && ret == 0)
60536056 md_cluster_ops->remove_disk(mddev, rdev);
60546057
60556058 md_kick_rdev_from_array(rdev);
@@ -6058,7 +6061,7 @@ kick_rdev: · 2 unmodified lines
60586061
60596062 return 0;
60606063 busy:
6061− if (mddev_is_clustered(mddev))
6064+ if (mddev_is_clustered(mddev) && ret == 0)
60626065 md_cluster_ops->metadata_update_cancel(mddev);
60636066
60646067 printk(KERN_WARNING "md: cannot remove active disk %s from %s ...\n",