summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/space-info.c
diff options
context:
space:
mode:
authorJosef Bacik <josef@toxicpanda.com>2020-07-21 16:22:30 +0200
committerDavid Sterba <dsterba@suse.com>2020-10-07 12:06:53 +0200
commitbb86bd3db82ed6d28d4ab4ed33c7ee3b27290e49 (patch)
treebdfbf5847310191fe0bd865700fd265b04326b4d /fs/btrfs/space-info.c
parentbtrfs: drop the commit_cycles stuff for data reservations (diff)
downloadlinux-bb86bd3db82ed6d28d4ab4ed33c7ee3b27290e49.tar.xz
linux-bb86bd3db82ed6d28d4ab4ed33c7ee3b27290e49.zip
btrfs: don't force commit if we are data
We used to unconditionally commit the transaction at least 2 times and then on the 3rd try check against pinned space to make sure committing the transaction was worth the effort. This is overkill, we know nobody is going to steal our reservation, and if we can't make our reservation with the pinned amount simply bail out. This also cleans up the passing of bytes_needed to may_commit_transaction, as that was the thing we added into place in order to accomplish this behavior. We no longer need it so remove that mess. Reviewed-by: Nikolay Borisov <nborisov@suse.com> Tested-by: Nikolay Borisov <nborisov@suse.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'fs/btrfs/space-info.c')
-rw-r--r--fs/btrfs/space-info.c22
1 files changed, 4 insertions, 18 deletions
diff --git a/fs/btrfs/space-info.c b/fs/btrfs/space-info.c
index 244cd2a61386..c229dffa46d8 100644
--- a/fs/btrfs/space-info.c
+++ b/fs/btrfs/space-info.c
@@ -579,8 +579,7 @@ static void shrink_delalloc(struct btrfs_fs_info *fs_info,
* will return -ENOSPC.
*/
static int may_commit_transaction(struct btrfs_fs_info *fs_info,
- struct btrfs_space_info *space_info,
- u64 bytes_needed)
+ struct btrfs_space_info *space_info)
{
struct reserve_ticket *ticket = NULL;
struct btrfs_block_rsv *delayed_rsv = &fs_info->delayed_block_rsv;
@@ -588,24 +587,13 @@ static int may_commit_transaction(struct btrfs_fs_info *fs_info,
struct btrfs_block_rsv *trans_rsv = &fs_info->trans_block_rsv;
struct btrfs_trans_handle *trans;
u64 reclaim_bytes = 0;
+ u64 bytes_needed = 0;
u64 cur_free_bytes = 0;
- bool do_commit = false;
trans = (struct btrfs_trans_handle *)current->journal_info;
if (trans)
return -EAGAIN;
- /*
- * If we are data and have passed in U64_MAX we just want to
- * unconditionally commit the transaction to match the previous data
- * flushing behavior.
- */
- if ((space_info->flags & BTRFS_BLOCK_GROUP_DATA) &&
- bytes_needed == U64_MAX) {
- do_commit = true;
- goto check_pinned;
- }
-
spin_lock(&space_info->lock);
cur_free_bytes = btrfs_space_info_used(space_info, true);
if (cur_free_bytes < space_info->total_bytes)
@@ -631,7 +619,6 @@ static int may_commit_transaction(struct btrfs_fs_info *fs_info,
if (!bytes_needed)
return 0;
-check_pinned:
trans = btrfs_join_transaction(fs_info->extent_root);
if (IS_ERR(trans))
return PTR_ERR(trans);
@@ -641,8 +628,7 @@ check_pinned:
* we have block groups that are going to be freed, allowing us to
* possibly do a chunk allocation the next loop through.
*/
- if (do_commit ||
- test_bit(BTRFS_TRANS_HAVE_FREE_BGS, &trans->transaction->flags) ||
+ if (test_bit(BTRFS_TRANS_HAVE_FREE_BGS, &trans->transaction->flags) ||
__percpu_counter_compare(&space_info->total_bytes_pinned,
bytes_needed,
BTRFS_TOTAL_BYTES_PINNED_BATCH) >= 0)
@@ -759,7 +745,7 @@ static void flush_space(struct btrfs_fs_info *fs_info,
btrfs_wait_on_delayed_iputs(fs_info);
break;
case COMMIT_TRANS:
- ret = may_commit_transaction(fs_info, space_info, num_bytes);
+ ret = may_commit_transaction(fs_info, space_info);
break;
default:
ret = -ENOSPC;