]> git.dujemihanovic.xyz Git - linux.git/commitdiff
btrfs: factor out the ticket flush handling
authorJosef Bacik <josef@toxicpanda.com>
Thu, 1 Aug 2019 22:19:35 +0000 (18:19 -0400)
committerDavid Sterba <dsterba@suse.com>
Mon, 9 Sep 2019 12:59:10 +0000 (14:59 +0200)
We're going to make this logic a little more complicated for evict, so
factor the ticket flushing/waiting code out of __reserve_metadata_bytes.
This has no functional change.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/space-info.c

index bf2fde3fe7823cca3b9b1e772e78d09c546946dd..8e00f53601ffa565552e0e1bd9009eaac2019df4 100644 (file)
@@ -903,6 +903,47 @@ static void wait_reserve_ticket(struct btrfs_fs_info *fs_info,
        spin_unlock(&space_info->lock);
 }
 
+/**
+ * handle_reserve_ticket - do the appropriate flushing and waiting for a ticket
+ * @fs_info - the fs
+ * @space_info - the space_info for the reservation
+ * @ticket - the ticket for the reservation
+ * @flush - how much we can flush
+ *
+ * This does the work of figuring out how to flush for the ticket, waiting for
+ * the reservation, and returning the appropriate error if there is one.
+ */
+static int handle_reserve_ticket(struct btrfs_fs_info *fs_info,
+                                struct btrfs_space_info *space_info,
+                                struct reserve_ticket *ticket,
+                                enum btrfs_reserve_flush_enum flush)
+{
+       u64 reclaim_bytes = 0;
+       int ret;
+
+       if (flush == BTRFS_RESERVE_FLUSH_ALL)
+               wait_reserve_ticket(fs_info, space_info, ticket);
+       else
+               priority_reclaim_metadata_space(fs_info, space_info, ticket);
+
+       spin_lock(&space_info->lock);
+       ret = ticket->error;
+       if (ticket->bytes || ticket->error) {
+               if (ticket->bytes < ticket->orig_bytes)
+                       reclaim_bytes = ticket->orig_bytes - ticket->bytes;
+               list_del_init(&ticket->list);
+               if (!ret)
+                       ret = -ENOSPC;
+       }
+       spin_unlock(&space_info->lock);
+
+       if (reclaim_bytes)
+               btrfs_space_info_add_old_bytes(fs_info, space_info,
+                                              reclaim_bytes);
+       ASSERT(list_empty(&ticket->list));
+       return ret;
+}
+
 /**
  * reserve_metadata_bytes - try to reserve bytes from the block_rsv's space
  * @root - the root we're allocating for
@@ -925,7 +966,6 @@ static int __reserve_metadata_bytes(struct btrfs_fs_info *fs_info,
 {
        struct reserve_ticket ticket;
        u64 used;
-       u64 reclaim_bytes = 0;
        int ret = 0;
 
        ASSERT(orig_bytes);
@@ -997,27 +1037,7 @@ static int __reserve_metadata_bytes(struct btrfs_fs_info *fs_info,
        if (!ret || flush == BTRFS_RESERVE_NO_FLUSH)
                return ret;
 
-       if (flush == BTRFS_RESERVE_FLUSH_ALL)
-               wait_reserve_ticket(fs_info, space_info, &ticket);
-       else
-               priority_reclaim_metadata_space(fs_info, space_info, &ticket);
-
-       spin_lock(&space_info->lock);
-       ret = ticket.error;
-       if (ticket.bytes || ticket.error) {
-               if (ticket.bytes < orig_bytes)
-                       reclaim_bytes = orig_bytes - ticket.bytes;
-               list_del_init(&ticket.list);
-               if (!ret)
-                       ret = -ENOSPC;
-       }
-       spin_unlock(&space_info->lock);
-
-       if (reclaim_bytes)
-               btrfs_space_info_add_old_bytes(fs_info, space_info,
-                                              reclaim_bytes);
-       ASSERT(list_empty(&ticket.list));
-       return ret;
+       return handle_reserve_ticket(fs_info, space_info, &ticket, flush);
 }
 
 /**