Nikolay Borisov d549af
From: Josef Bacik <josef@toxicpanda.com>
Nikolay Borisov d549af
Date: Thu, 22 Aug 2019 15:11:00 -0400
Nikolay Borisov d549af
Subject: btrfs: fix may_commit_transaction to deal with no partial filling
Nikolay Borisov d549af
Git-commit: 00c0135eb8b8172de48e1accbb09ebfa3aa8bf25
Nikolay Borisov d549af
Patch-mainline: v5.4-rc1
Nikolay Borisov d549af
References: bsc#1141456
Nikolay Borisov d549af
Nikolay Borisov d549af
Now that we aren't partially filling tickets we may have some slack
Nikolay Borisov d549af
space left in the space_info.  We need to account for this in
Nikolay Borisov d549af
may_commit_transaction, otherwise we may choose to not commit the
Nikolay Borisov d549af
transaction despite it actually having enough space to satisfy our
Nikolay Borisov d549af
ticket.
Nikolay Borisov d549af
Nikolay Borisov d549af
Calculate the free space we have in the space_info, if any, and subtract
Nikolay Borisov d549af
this from the ticket we have and use that amount to determine if we will
Nikolay Borisov d549af
need to commit to reclaim enough space.
Nikolay Borisov d549af
Nikolay Borisov d549af
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Nikolay Borisov d549af
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Nikolay Borisov d549af
Signed-off-by: David Sterba <dsterba@suse.com>
Nikolay Borisov d549af
Acked-by: Nikolay Borisov <nborisov@suse.com>
Nikolay Borisov d549af
---
Nikolay Borisov d549af
 fs/btrfs/space-info.c | 12 ++++++++++++
Nikolay Borisov d549af
 1 file changed, 12 insertions(+)
Nikolay Borisov d549af
Nikolay Borisov d549af
diff --git a/fs/btrfs/space-info.c b/fs/btrfs/space-info.c
Nikolay Borisov d549af
index eb4a926ea7b9..3ab7a4810bef 100644
Nikolay Borisov d549af
--- a/fs/btrfs/space-info.c
Nikolay Borisov d549af
+++ b/fs/btrfs/space-info.c
Nikolay Borisov d549af
@@ -473,12 +473,19 @@ static int may_commit_transaction(struct btrfs_fs_info *fs_info,
Nikolay Borisov d549af
 	struct btrfs_trans_handle *trans;
Nikolay Borisov d549af
 	u64 bytes_needed;
Nikolay Borisov d549af
 	u64 reclaim_bytes = 0;
Nikolay Borisov d549af
+	u64 cur_free_bytes = 0;
Nikolay Borisov d549af
 
Nikolay Borisov d549af
 	trans = (struct btrfs_trans_handle *)current->journal_info;
Nikolay Borisov d549af
 	if (trans)
Nikolay Borisov d549af
 		return -EAGAIN;
Nikolay Borisov d549af
 
Nikolay Borisov d549af
 	spin_lock(&space_info->lock);
Nikolay Borisov d549af
+	cur_free_bytes = btrfs_space_info_used(space_info, true);
Nikolay Borisov d549af
+	if (cur_free_bytes < space_info->total_bytes)
Nikolay Borisov d549af
+		cur_free_bytes = space_info->total_bytes - cur_free_bytes;
Nikolay Borisov d549af
+	else
Nikolay Borisov d549af
+		cur_free_bytes = 0;
Nikolay Borisov d549af
+
Nikolay Borisov d549af
 	if (!list_empty(&space_info->priority_tickets))
Nikolay Borisov d549af
 		ticket = list_first_entry(&space_info->priority_tickets,
Nikolay Borisov d549af
 					  struct reserve_ticket, list);
Nikolay Borisov d549af
@@ -486,6 +493,11 @@ static int may_commit_transaction(struct btrfs_fs_info *fs_info,
Nikolay Borisov d549af
 		ticket = list_first_entry(&space_info->tickets,
Nikolay Borisov d549af
 					  struct reserve_ticket, list);
Nikolay Borisov d549af
 	bytes_needed = (ticket) ? ticket->bytes : 0;
Nikolay Borisov d549af
+
Nikolay Borisov d549af
+	if (bytes_needed > cur_free_bytes)
Nikolay Borisov d549af
+		bytes_needed -= cur_free_bytes;
Nikolay Borisov d549af
+	else
Nikolay Borisov d549af
+		bytes_needed = 0;
Nikolay Borisov d549af
 	spin_unlock(&space_info->lock);
Nikolay Borisov d549af
 
Nikolay Borisov d549af
 	if (!bytes_needed)
Nikolay Borisov d549af