lkml.org 
[lkml]   [2018]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.16 048/272] Btrfs: clean up resources during umount after trans is aborted
    Date
    4.16-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Liu Bo <bo.liu@linux.alibaba.com>

    [ Upstream commit af7227338135d2f1b1552bf9a6d43e02dcba10b9 ]

    Currently if some fatal errors occur, like all IO get -EIO, resources
    would be cleaned up when
    a) transaction is being committed or
    b) BTRFS_FS_STATE_ERROR is set

    However, in some rare cases, resources may be left alone after transaction
    gets aborted and umount may run into some ASSERT(), e.g.
    ASSERT(list_empty(&block_group->dirty_list));

    For case a), in btrfs_commit_transaciton(), there're several places at the
    beginning where we just call btrfs_end_transaction() without cleaning up
    resources. For case b), it is possible that the trans handle doesn't have
    any dirty stuff, then only trans hanlde is marked as aborted while
    BTRFS_FS_STATE_ERROR is not set, so resources remain in memory.

    This makes btrfs also check BTRFS_FS_STATE_TRANS_ABORTED to make sure that
    all resources won't stay in memory after umount.

    Signed-off-by: Liu Bo <bo.liu@linux.alibaba.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/btrfs/disk-io.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    --- a/fs/btrfs/disk-io.c
    +++ b/fs/btrfs/disk-io.c
    @@ -3735,7 +3735,8 @@ void close_ctree(struct btrfs_fs_info *f
    btrfs_err(fs_info, "commit super ret %d", ret);
    }

    - if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state))
    + if (test_bit(BTRFS_FS_STATE_ERROR, &fs_info->fs_state) ||
    + test_bit(BTRFS_FS_STATE_TRANS_ABORTED, &fs_info->fs_state))
    btrfs_error_commit_super(fs_info);

    kthread_stop(fs_info->transaction_kthread);

    \
     
     \ /
      Last update: 2018-05-28 13:08    [W:6.383 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site