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

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
...@@ -1249,10 +1249,9 @@ static inline bool is_normal_flushing(enum btrfs_reserve_flush_enum flush) ...@@ -1249,10 +1249,9 @@ 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 * regain reservations will be made and this will fail if there is not enough
* space already. * space already.
*/ */
static int __reserve_metadata_bytes(struct btrfs_fs_info *fs_info, static int __reserve_bytes(struct btrfs_fs_info *fs_info,
struct btrfs_space_info *space_info, struct btrfs_space_info *space_info, u64 orig_bytes,
u64 orig_bytes, enum btrfs_reserve_flush_enum flush)
enum btrfs_reserve_flush_enum flush)
{ {
struct reserve_ticket ticket; struct reserve_ticket ticket;
u64 used; u64 used;
...@@ -1364,8 +1363,7 @@ int btrfs_reserve_metadata_bytes(struct btrfs_root *root, ...@@ -1364,8 +1363,7 @@ int btrfs_reserve_metadata_bytes(struct btrfs_root *root,
struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv; struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv;
int ret; int ret;
ret = __reserve_metadata_bytes(fs_info, block_rsv->space_info, ret = __reserve_bytes(fs_info, block_rsv->space_info, orig_bytes, flush);
orig_bytes, flush);
if (ret == -ENOSPC && if (ret == -ENOSPC &&
unlikely(root->orphan_cleanup_state == ORPHAN_CLEANUP_STARTED)) { unlikely(root->orphan_cleanup_state == ORPHAN_CLEANUP_STARTED)) {
if (block_rsv != global_rsv && if (block_rsv != global_rsv &&
...@@ -1397,36 +1395,18 @@ int btrfs_reserve_data_bytes(struct btrfs_fs_info *fs_info, u64 bytes, ...@@ -1397,36 +1395,18 @@ int btrfs_reserve_data_bytes(struct btrfs_fs_info *fs_info, u64 bytes,
enum btrfs_reserve_flush_enum flush) enum btrfs_reserve_flush_enum flush)
{ {
struct btrfs_space_info *data_sinfo = fs_info->data_sinfo; struct btrfs_space_info *data_sinfo = fs_info->data_sinfo;
u64 used; int ret;
int ret = -ENOSPC;
bool pending_tickets;
ASSERT(flush == BTRFS_RESERVE_FLUSH_DATA ||
flush == BTRFS_RESERVE_FLUSH_FREE_SPACE_INODE);
ASSERT(!current->journal_info || flush != BTRFS_RESERVE_FLUSH_DATA); ASSERT(!current->journal_info || flush != BTRFS_RESERVE_FLUSH_DATA);
spin_lock(&data_sinfo->lock); ret = __reserve_bytes(fs_info, data_sinfo, bytes, flush);
used = btrfs_space_info_used(data_sinfo, true); if (ret == -ENOSPC) {
pending_tickets = !list_empty(&data_sinfo->tickets) || trace_btrfs_space_reservation(fs_info, "space_info:enospc",
!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",
data_sinfo->flags, bytes, 1); 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; return ret;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment