We shouldn't run related funs of md_cluster_ops in case metadata_update_start returned failure.
Unified · Split
| @@ -2245,6 +2245,7 @@ void md_update_sb(struct mddev *mddev, int force_change) · 2244 unmodified lines | |||
| 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) · 4 unmodified lines | |||
| 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: · 147 unmodified lines | |||
| 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) · 3612 unmodified lines | |||
| 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) · 5 unmodified lines | |||
| 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: · 2 unmodified lines | |||
| 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", |