lkml.org 
[lkml]   [2020]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.4 048/175] btrfs: account for trans_block_rsv in may_commit_transaction
    Date
    From: Josef Bacik <josef@toxicpanda.com>

    [ Upstream commit bb4f58a747f0421b10645fbf75a6acc88da0de50 ]

    On ppc64le with 64k page size (respectively 64k block size) generic/320
    was failing and debug output showed we were getting a premature ENOSPC
    with a bunch of space in btrfs_fs_info::trans_block_rsv.

    This meant there were still open transaction handles holding space, yet
    the flusher didn't commit the transaction because it deemed the freed
    space won't be enough to satisfy the current reserve ticket. Fix this
    by accounting for space in trans_block_rsv when deciding whether the
    current transaction should be committed or not.

    Reviewed-by: Nikolay Borisov <nborisov@suse.com>
    Tested-by: Nikolay Borisov <nborisov@suse.com>
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/btrfs/space-info.c | 6 ++++++
    1 file changed, 6 insertions(+)

    diff --git a/fs/btrfs/space-info.c b/fs/btrfs/space-info.c
    index e8a4b0ebe97f..5b47e3c44c8f 100644
    --- a/fs/btrfs/space-info.c
    +++ b/fs/btrfs/space-info.c
    @@ -462,6 +462,7 @@ static int may_commit_transaction(struct btrfs_fs_info *fs_info,
    struct reserve_ticket *ticket = NULL;
    struct btrfs_block_rsv *delayed_rsv = &fs_info->delayed_block_rsv;
    struct btrfs_block_rsv *delayed_refs_rsv = &fs_info->delayed_refs_rsv;
    + struct btrfs_block_rsv *trans_rsv = &fs_info->trans_block_rsv;
    struct btrfs_trans_handle *trans;
    u64 bytes_needed;
    u64 reclaim_bytes = 0;
    @@ -524,6 +525,11 @@ static int may_commit_transaction(struct btrfs_fs_info *fs_info,
    spin_lock(&delayed_refs_rsv->lock);
    reclaim_bytes += delayed_refs_rsv->reserved;
    spin_unlock(&delayed_refs_rsv->lock);
    +
    + spin_lock(&trans_rsv->lock);
    + reclaim_bytes += trans_rsv->reserved;
    + spin_unlock(&trans_rsv->lock);
    +
    if (reclaim_bytes >= bytes_needed)
    goto commit;
    bytes_needed -= reclaim_bytes;
    --
    2.25.1
    \
     
     \ /
      Last update: 2020-06-09 02:12    [W:4.055 / U:0.200 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site