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 | 2245 | int sync_req; |
| 2246 | 2246 | int nospares = 0; |
| 2247 | 2247 | int any_badblocks_changed = 0; |
| 2248 | + int ret = -1; | |
| 2248 | 2249 | |
| 2249 | 2250 | if (mddev->ro) { |
| 2250 | 2251 | if (force_change) |
| @@ -2255,10 +2256,11 @@ void md_update_sb(struct mddev *mddev, int force_change) · 4 unmodified lines | ||
| 2255 | 2256 | if (mddev_is_clustered(mddev)) { |
| 2256 | 2257 | if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags)) |
| 2257 | 2258 | force_change = 1; |
| 2258 | − md_cluster_ops->metadata_update_start(mddev); | |
| 2259 | + ret = md_cluster_ops->metadata_update_start(mddev); | |
| 2259 | 2260 | /* Has someone else has updated the sb */ |
| 2260 | 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 | 2264 | clear_bit(MD_CHANGE_PENDING, &mddev->flags); |
| 2263 | 2265 | return; |
| 2264 | 2266 | } |
| @@ -2412,7 +2414,7 @@ repeat: · 147 unmodified lines | ||
| 2412 | 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 | 2418 | md_cluster_ops->metadata_update_finish(mddev); |
| 2417 | 2419 | } |
| 2418 | 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 | 6034 | char b[BDEVNAME_SIZE]; |
| 6033 | 6035 | struct md_rdev *rdev; |
| 6036 | + int ret = -1; | |
| 6034 | 6037 | |
| 6035 | 6038 | rdev = find_rdev(mddev, dev); |
| 6036 | 6039 | if (!rdev) |
| 6037 | 6040 | return -ENXIO; |
| 6038 | 6041 | |
| 6039 | 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 | 6045 | if (rdev->raid_disk < 0) |
| 6043 | 6046 | goto kick_rdev; |
| @@ -6049,7 +6052,7 @@ static int hot_remove_disk(struct mddev *mddev, dev_t dev) · 5 unmodified lines | ||
| 6049 | 6052 | goto busy; |
| 6050 | 6053 | |
| 6051 | 6054 | kick_rdev: |
| 6052 | − if (mddev_is_clustered(mddev)) | |
| 6055 | + if (mddev_is_clustered(mddev) && ret == 0) | |
| 6053 | 6056 | md_cluster_ops->remove_disk(mddev, rdev); |
| 6054 | 6057 | |
| 6055 | 6058 | md_kick_rdev_from_array(rdev); |
| @@ -6058,7 +6061,7 @@ kick_rdev: · 2 unmodified lines | ||
| 6058 | 6061 | |
| 6059 | 6062 | return 0; |
| 6060 | 6063 | busy: |
| 6061 | − if (mddev_is_clustered(mddev)) | |
| 6064 | + if (mddev_is_clustered(mddev) && ret == 0) | |
| 6062 | 6065 | md_cluster_ops->metadata_update_cancel(mddev); |
| 6063 | 6066 | |
| 6064 | 6067 | printk(KERN_WARNING "md: cannot remove active disk %s from %s ...\n", |