diff options
-rw-r--r-- | drivers/md/md.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index d39a72aec316..a71b36f0acb0 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -2245,6 +2245,7 @@ void md_update_sb(struct mddev *mddev, int force_change) | |||
2245 | int sync_req; | 2245 | int sync_req; |
2246 | int nospares = 0; | 2246 | int nospares = 0; |
2247 | int any_badblocks_changed = 0; | 2247 | int any_badblocks_changed = 0; |
2248 | int ret = -1; | ||
2248 | 2249 | ||
2249 | if (mddev->ro) { | 2250 | if (mddev->ro) { |
2250 | if (force_change) | 2251 | if (force_change) |
@@ -2255,10 +2256,11 @@ void md_update_sb(struct mddev *mddev, int force_change) | |||
2255 | if (mddev_is_clustered(mddev)) { | 2256 | if (mddev_is_clustered(mddev)) { |
2256 | if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) | 2257 | if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) |
2257 | force_change = 1; | 2258 | force_change = 1; |
2258 | md_cluster_ops->metadata_update_start(mddev); | 2259 | ret = md_cluster_ops->metadata_update_start(mddev); |
2259 | /* Has someone else has updated the sb */ | 2260 | /* Has someone else has updated the sb */ |
2260 | if (!does_sb_need_changing(mddev)) { | 2261 | 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); | ||
2262 | clear_bit(MD_CHANGE_PENDING, &mddev->flags); | 2264 | clear_bit(MD_CHANGE_PENDING, &mddev->flags); |
2263 | return; | 2265 | return; |
2264 | } | 2266 | } |
@@ -2412,7 +2414,7 @@ repeat: | |||
2412 | wake_up(&rdev->blocked_wait); | 2414 | wake_up(&rdev->blocked_wait); |
2413 | } | 2415 | } |
2414 | 2416 | ||
2415 | if (mddev_is_clustered(mddev)) | 2417 | if (mddev_is_clustered(mddev) && ret == 0) |
2416 | md_cluster_ops->metadata_update_finish(mddev); | 2418 | md_cluster_ops->metadata_update_finish(mddev); |
2417 | } | 2419 | } |
2418 | EXPORT_SYMBOL(md_update_sb); | 2420 | EXPORT_SYMBOL(md_update_sb); |
@@ -6031,13 +6033,14 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev) | |||
6031 | { | 6033 | { |
6032 | char b[BDEVNAME_SIZE]; | 6034 | char b[BDEVNAME_SIZE]; |
6033 | struct md_rdev *rdev; | 6035 | struct md_rdev *rdev; |
6036 | int ret = -1; | ||
6034 | 6037 | ||
6035 | rdev = find_rdev(mddev, dev); | 6038 | rdev = find_rdev(mddev, dev); |
6036 | if (!rdev) | 6039 | if (!rdev) |
6037 | return -ENXIO; | 6040 | return -ENXIO; |
6038 | 6041 | ||
6039 | if (mddev_is_clustered(mddev)) | 6042 | if (mddev_is_clustered(mddev)) |
6040 | md_cluster_ops->metadata_update_start(mddev); | 6043 | ret = md_cluster_ops->metadata_update_start(mddev); |
6041 | 6044 | ||
6042 | if (rdev->raid_disk < 0) | 6045 | if (rdev->raid_disk < 0) |
6043 | goto kick_rdev; | 6046 | goto kick_rdev; |
@@ -6049,7 +6052,7 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev) | |||
6049 | goto busy; | 6052 | goto busy; |
6050 | 6053 | ||
6051 | kick_rdev: | 6054 | kick_rdev: |
6052 | if (mddev_is_clustered(mddev)) | 6055 | if (mddev_is_clustered(mddev) && ret == 0) |
6053 | md_cluster_ops->remove_disk(mddev, rdev); | 6056 | md_cluster_ops->remove_disk(mddev, rdev); |
6054 | 6057 | ||
6055 | md_kick_rdev_from_array(rdev); | 6058 | md_kick_rdev_from_array(rdev); |
@@ -6058,7 +6061,7 @@ kick_rdev: | |||
6058 | 6061 | ||
6059 | return 0; | 6062 | return 0; |
6060 | busy: | 6063 | busy: |
6061 | if (mddev_is_clustered(mddev)) | 6064 | if (mddev_is_clustered(mddev) && ret == 0) |
6062 | md_cluster_ops->metadata_update_cancel(mddev); | 6065 | md_cluster_ops->metadata_update_cancel(mddev); |
6063 | 6066 | ||
6064 | printk(KERN_WARNING "md: cannot remove active disk %s from %s ...\n", | 6067 | printk(KERN_WARNING "md: cannot remove active disk %s from %s ...\n", |