Commit f3bda421 authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba
Browse files

btrfs: use the same helper for data and metadata reservations



Now that data reservations follow the same pattern as metadata
reservations we can simply rename __reserve_metadata_bytes to
__reserve_bytes and use that helper for data reservations.

Things to keep in mind, btrfs_can_overcommit() returns 0 for data,
because we can never overcommit.  We also will never pass in FLUSH_ALL
for data, so we'll simply be added to the priority list and go straight
into handle_reserve_ticket.

Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
Tested-by: default avatarNikolay Borisov <nborisov@suse.com>
Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 0532a6f8
Loading
Loading
Loading
Loading
+13 −33
Original line number Diff line number Diff line
@@ -1249,9 +1249,8 @@ static inline bool is_normal_flushing(enum btrfs_reserve_flush_enum flush)
 * regain reservations will be made and this will fail if there is not enough
 * space already.
 */
static int __reserve_metadata_bytes(struct btrfs_fs_info *fs_info,
				    struct btrfs_space_info *space_info,
				    u64 orig_bytes,
static int __reserve_bytes(struct btrfs_fs_info *fs_info,
			   struct btrfs_space_info *space_info, u64 orig_bytes,
			   enum btrfs_reserve_flush_enum flush)
{
	struct reserve_ticket ticket;
@@ -1364,8 +1363,7 @@ int btrfs_reserve_metadata_bytes(struct btrfs_root *root,
	struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
	int ret;

	ret = __reserve_metadata_bytes(fs_info, block_rsv->space_info,
				       orig_bytes, flush);
	ret = __reserve_bytes(fs_info, block_rsv->space_info, orig_bytes, flush);
	if (ret == -ENOSPC &&
	    unlikely(root->orphan_cleanup_state == ORPHAN_CLEANUP_STARTED)) {
		if (block_rsv != global_rsv &&
@@ -1397,36 +1395,18 @@ int btrfs_reserve_data_bytes(struct btrfs_fs_info *fs_info, u64 bytes,
			     enum btrfs_reserve_flush_enum flush)
{
	struct btrfs_space_info *data_sinfo = fs_info->data_sinfo;
	u64 used;
	int ret = -ENOSPC;
	bool pending_tickets;
	int ret;

	ASSERT(flush == BTRFS_RESERVE_FLUSH_DATA ||
	       flush == BTRFS_RESERVE_FLUSH_FREE_SPACE_INODE);
	ASSERT(!current->journal_info || flush != BTRFS_RESERVE_FLUSH_DATA);

	spin_lock(&data_sinfo->lock);
	used = btrfs_space_info_used(data_sinfo, true);
	pending_tickets = !list_empty(&data_sinfo->tickets) ||
			  !list_empty(&data_sinfo->priority_tickets);

	if (pending_tickets || used + bytes > data_sinfo->total_bytes) {
		struct reserve_ticket ticket;

		init_waitqueue_head(&ticket.wait);
		ticket.bytes = bytes;
		ticket.error = 0;
		list_add_tail(&ticket.list, &data_sinfo->priority_tickets);
		data_sinfo->reclaim_size += bytes;
		spin_unlock(&data_sinfo->lock);

		ret = handle_reserve_ticket(fs_info, data_sinfo, &ticket, flush);
	} else {
		btrfs_space_info_update_bytes_may_use(fs_info, data_sinfo, bytes);
		ret = 0;
		spin_unlock(&data_sinfo->lock);
	}
	if (ret)
		trace_btrfs_space_reservation(fs_info,
					      "space_info:enospc",
	ret = __reserve_bytes(fs_info, data_sinfo, bytes, flush);
	if (ret == -ENOSPC) {
		trace_btrfs_space_reservation(fs_info, "space_info:enospc",
					      data_sinfo->flags, bytes, 1);
		if (btrfs_test_opt(fs_info, ENOSPC_DEBUG))
			btrfs_dump_space_info(fs_info, data_sinfo, bytes, 0);
	}
	return ret;
}