Skip to content

Commit 2c97cf1

Browse files
GuoqingJiangshligit
authored andcommitted
md-cluser: make resync_finish only called after pers->sync_request
It is not reasonable that cluster raid to release resync lock before the last pers->sync_request has finished. As the metadata will be changed when node performs resync, we need to inform other nodes to update metadata, so the MD_CHANGE_PENDING flag is set before finish resync. Then metadata_update_finish is move ahead to ensure that METADATA_UPDATED msg is sent before finish resync, and metadata_update_start need to be run after "repeat:" label accordingly. Reviewed-by: NeilBrown <neilb@suse.com> Signed-off-by: Guoqing Jiang <gqjiang@suse.com> Signed-off-by: Shaohua Li <shli@fb.com>
1 parent 41a9a0d commit 2c97cf1

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

drivers/md/md.c

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2291,6 +2291,7 @@ void md_update_sb(struct mddev *mddev, int force_change)
22912291
return;
22922292
}
22932293

2294+
repeat:
22942295
if (mddev_is_clustered(mddev)) {
22952296
if (test_and_clear_bit(MD_CHANGE_DEVS, &mddev->flags))
22962297
force_change = 1;
@@ -2303,7 +2304,7 @@ void md_update_sb(struct mddev *mddev, int force_change)
23032304
return;
23042305
}
23052306
}
2306-
repeat:
2307+
23072308
/* First make sure individual recovery_offsets are correct */
23082309
rdev_for_each(rdev, mddev) {
23092310
if (rdev->raid_disk >= 0 &&
@@ -2430,6 +2431,9 @@ void md_update_sb(struct mddev *mddev, int force_change)
24302431
md_super_wait(mddev);
24312432
/* if there was a failure, MD_CHANGE_DEVS was set, and we re-write super */
24322433

2434+
if (mddev_is_clustered(mddev) && ret == 0)
2435+
md_cluster_ops->metadata_update_finish(mddev);
2436+
24332437
spin_lock(&mddev->lock);
24342438
if (mddev->in_sync != sync_req ||
24352439
test_bit(MD_CHANGE_DEVS, &mddev->flags)) {
@@ -2452,9 +2456,6 @@ void md_update_sb(struct mddev *mddev, int force_change)
24522456
clear_bit(BlockedBadBlocks, &rdev->flags);
24532457
wake_up(&rdev->blocked_wait);
24542458
}
2455-
2456-
if (mddev_is_clustered(mddev) && ret == 0)
2457-
md_cluster_ops->metadata_update_finish(mddev);
24582459
}
24592460
EXPORT_SYMBOL(md_update_sb);
24602461

@@ -7785,7 +7786,6 @@ void md_do_sync(struct md_thread *thread)
77857786
struct md_rdev *rdev;
77867787
char *desc, *action = NULL;
77877788
struct blk_plug plug;
7788-
bool cluster_resync_finished = false;
77897789
int ret;
77907790

77917791
/* just incase thread restarts... */
@@ -8103,11 +8103,6 @@ void md_do_sync(struct md_thread *thread)
81038103
mddev->curr_resync_completed = mddev->curr_resync;
81048104
sysfs_notify(&mddev->kobj, NULL, "sync_completed");
81058105
}
8106-
/* tell personality and other nodes that we are finished */
8107-
if (mddev_is_clustered(mddev)) {
8108-
md_cluster_ops->resync_finish(mddev);
8109-
cluster_resync_finished = true;
8110-
}
81118106
mddev->pers->sync_request(mddev, max_sectors, &skipped);
81128107

81138108
if (!test_bit(MD_RECOVERY_CHECK, &mddev->recovery) &&
@@ -8147,9 +8142,15 @@ void md_do_sync(struct md_thread *thread)
81478142
set_bit(MD_CHANGE_DEVS, &mddev->flags);
81488143

81498144
if (mddev_is_clustered(mddev) &&
8150-
test_bit(MD_RECOVERY_INTR, &mddev->recovery) &&
8151-
!cluster_resync_finished)
8145+
ret == 0) {
8146+
/* set CHANGE_PENDING here since maybe another
8147+
* update is needed, so other nodes are informed */
8148+
set_bit(MD_CHANGE_PENDING, &mddev->flags);
8149+
md_wakeup_thread(mddev->thread);
8150+
wait_event(mddev->sb_wait,
8151+
!test_bit(MD_CHANGE_PENDING, &mddev->flags));
81528152
md_cluster_ops->resync_finish(mddev);
8153+
}
81538154

81548155
spin_lock(&mddev->lock);
81558156
if (!test_bit(MD_RECOVERY_INTR, &mddev->recovery)) {

0 commit comments

Comments
 (0)