mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-09 15:29:16 +00:00
dm raid: fix stripe adding reshape deadlock
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>
This commit is contained in:
parent
38b0bd0cda
commit
644e2537fd
@ -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
|
||||
*
|
||||
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user