提交 03235279 编写于 作者: J Josef Bacik 提交者: David Sterba

btrfs: factor out the ticket flush handling

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: NJosef Bacik <josef@toxicpanda.com>
Reviewed-by: NDavid Sterba <dsterba@suse.com>
Signed-off-by: NDavid Sterba <dsterba@suse.com>
上级 374bf9c5
......@@ -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);
}
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册