lkml.org 
[lkml]   [2018]   [Oct]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.18 35/65] dm raid: fix stripe adding reshape deadlock
    Date
    From: Heinz Mauelshagen <heinzm@redhat.com>

    [ Upstream commit 644e2537fdc77baeeefc829524937bca64329f82 ]

    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>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    drivers/md/dm-raid.c | 11 +++--------
    1 file changed, 3 insertions(+), 8 deletions(-)

    diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c
    index 0d30958dc78f..2c0d8036fb66 100644
    --- a/drivers/md/dm-raid.c
    +++ b/drivers/md/dm-raid.c
    @@ -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
    --
    2.17.1
    \
     
     \ /
      Last update: 2018-10-01 03:19    [W:4.305 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site