lkml.org 
[lkml]   [2018]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.15 139/189] btrfs: Ignore errors from btrfs_qgroup_trace_extent_post
    Date
    From: Nikolay Borisov <nborisov@suse.com>

    [ Upstream commit 952bd3db0dada9994fa7edd891178075abcc045d ]

    Running generic/019 with qgroups on the scratch device enabled is almost
    guaranteed to trigger the BUG_ON in btrfs_free_tree_block. It's supposed
    to trigger only on -ENOMEM, in reality, however, it's possible to get
    -EIO from btrfs_qgroup_trace_extent_post. This function just finds the
    roots of the extent being tracked and sets the qrecord->old_roots list.
    If this operation fails nothing critical happens except the quota
    accounting can be considered wrong. In such case just set the
    INCONSISTENT flag for the quota and print a warning, rather than killing
    off the system. Additionally, it's possible to trigger a BUG_ON in
    btrfs_truncate_inode_items as well.

    Signed-off-by: Nikolay Borisov <nborisov@suse.com>
    Reviewed-by: Qu Wenruo <wqu@suse.com>
    [ error message adjustments ]
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    fs/btrfs/delayed-ref.c | 3 ++-
    fs/btrfs/qgroup.c | 9 +++++++--
    2 files changed, 9 insertions(+), 3 deletions(-)

    diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
    index 83be8f9fd906..fa552a5ac103 100644
    --- a/fs/btrfs/delayed-ref.c
    +++ b/fs/btrfs/delayed-ref.c
    @@ -821,7 +821,8 @@ int btrfs_add_delayed_tree_ref(struct btrfs_fs_info *fs_info,
    spin_unlock(&delayed_refs->lock);

    if (qrecord_inserted)
    - return btrfs_qgroup_trace_extent_post(fs_info, record);
    + btrfs_qgroup_trace_extent_post(fs_info, record);
    +
    return 0;

    free_head_ref:
    diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
    index 168fd03ca3ac..388731481e9d 100644
    --- a/fs/btrfs/qgroup.c
    +++ b/fs/btrfs/qgroup.c
    @@ -1442,8 +1442,13 @@ int btrfs_qgroup_trace_extent_post(struct btrfs_fs_info *fs_info,
    int ret;

    ret = btrfs_find_all_roots(NULL, fs_info, bytenr, 0, &old_root, false);
    - if (ret < 0)
    - return ret;
    + if (ret < 0) {
    + fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT;
    + btrfs_warn(fs_info,
    +"error accounting new delayed refs extent (err code: %d), quota inconsistent",
    + ret);
    + return 0;
    + }

    /*
    * Here we don't need to get the lock of
    --
    2.15.1
    \
     
     \ /
      Last update: 2018-04-09 05:44    [W:4.168 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site