• Jeff Mahoney's avatar
    btrfs: fix error handling in btrfs_dev_replace_start · 5c061471
    Jeff Mahoney authored
    When we fail to start a transaction in btrfs_dev_replace_start, we leave
    dev_replace->replace_start set to STARTED but clear ->srcdev and
    ->tgtdev.  Later, that can result in an Oops in
    btrfs_dev_replace_progress when having state set to STARTED or SUSPENDED
    implies that ->srcdev is valid.
    
    Also fix error handling when the state is already STARTED or SUSPENDED
    while starting.  That, too, will clear ->srcdev and ->tgtdev even though
    it doesn't own them.  This should be an impossible case to hit since we
    should be protected by the BTRFS_FS_EXCL_OP bit being set.  Let's add an
    ASSERT there while we're at it.
    
    Fixes: e93c89c1 (Btrfs: add new sources for device replace code)
    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: default avatarJeff Mahoney <jeffm@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    5c061471
dev-replace.c 31.5 KB