Skip to content

Commit

Permalink
dm raid: fix stripe adding reshape deadlock
Browse files Browse the repository at this point in the history
When initiating a stripe adding reshape, a deadlock between
md_stop_writes() waiting for the sync thread to stop and the running
sync thread waiting for inactive stripes occurs (this frequently happens
on single-core but rarely on multi-core systems).

Fix this deadlock by setting MD_RECOVERY_WAIT to have the main MD
resynchronization thread worker (md_do_sync()) bail out when initiating
the reshape via constructor arguments.

Signed-off-by: Heinz Mauelshagen <heinzm@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
  • Loading branch information
mauelsha authored and snitm committed Sep 6, 2018
1 parent 38b0bd0 commit 644e253
Showing 1 changed file with 3 additions and 8 deletions.
11 changes: 3 additions & 8 deletions drivers/md/dm-raid.c
Original file line number Diff line number Diff line change
Expand Up @@ -3869,14 +3869,13 @@ static int rs_start_reshape(struct raid_set *rs)
struct mddev *mddev = &rs->md;
struct md_personality *pers = mddev->pers;

/* Don't allow the sync thread to work until the table gets reloaded. */
set_bit(MD_RECOVERY_WAIT, &mddev->recovery);

r = rs_setup_reshape(rs);
if (r)
return r;

/* Need to be resumed to be able to start reshape, recovery is frozen until raid_resume() though */
if (test_and_clear_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags))
mddev_resume(mddev);

/*
* Check any reshape constraints enforced by the personalility
*
Expand All @@ -3900,10 +3899,6 @@ static int rs_start_reshape(struct raid_set *rs)
}
}

/* Suspend because a resume will happen in raid_resume() */
set_bit(RT_FLAG_RS_SUSPENDED, &rs->runtime_flags);
mddev_suspend(mddev);

/*
* Now reshape got set up, update superblocks to
* reflect the fact so that a table reload will
Expand Down

0 comments on commit 644e253

Please sign in to comment.