Commit 374bf9c5 authored by Josef Bacik's avatar Josef Bacik Committed by David Sterba

btrfs: unify error handling for ticket flushing

Currently we handle the cleanup of errored out tickets in both the
priority flush path and the normal flushing path.  This is the same code
in both places, so just refactor so we don't duplicate the cleanup work.
Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 844245b4
...@@ -878,20 +878,19 @@ static void priority_reclaim_metadata_space(struct btrfs_fs_info *fs_info, ...@@ -878,20 +878,19 @@ static void priority_reclaim_metadata_space(struct btrfs_fs_info *fs_info,
} while (flush_state < ARRAY_SIZE(priority_flush_states)); } while (flush_state < ARRAY_SIZE(priority_flush_states));
} }
static int wait_reserve_ticket(struct btrfs_fs_info *fs_info, static void wait_reserve_ticket(struct btrfs_fs_info *fs_info,
struct btrfs_space_info *space_info, struct btrfs_space_info *space_info,
struct reserve_ticket *ticket) struct reserve_ticket *ticket)
{ {
DEFINE_WAIT(wait); DEFINE_WAIT(wait);
u64 reclaim_bytes = 0;
int ret = 0; int ret = 0;
spin_lock(&space_info->lock); spin_lock(&space_info->lock);
while (ticket->bytes > 0 && ticket->error == 0) { while (ticket->bytes > 0 && ticket->error == 0) {
ret = prepare_to_wait_event(&ticket->wait, &wait, TASK_KILLABLE); ret = prepare_to_wait_event(&ticket->wait, &wait, TASK_KILLABLE);
if (ret) { if (ret) {
ret = -EINTR; ticket->error = -EINTR;
break; break;
} }
spin_unlock(&space_info->lock); spin_unlock(&space_info->lock);
...@@ -901,18 +900,7 @@ static int wait_reserve_ticket(struct btrfs_fs_info *fs_info, ...@@ -901,18 +900,7 @@ static int wait_reserve_ticket(struct btrfs_fs_info *fs_info,
finish_wait(&ticket->wait, &wait); finish_wait(&ticket->wait, &wait);
spin_lock(&space_info->lock); spin_lock(&space_info->lock);
} }
if (!ret)
ret = ticket->error;
if (!list_empty(&ticket->list))
list_del_init(&ticket->list);
if (ticket->bytes && ticket->bytes < ticket->orig_bytes)
reclaim_bytes = ticket->orig_bytes - ticket->bytes;
spin_unlock(&space_info->lock); spin_unlock(&space_info->lock);
if (reclaim_bytes)
btrfs_space_info_add_old_bytes(fs_info, space_info,
reclaim_bytes);
return ret;
} }
/** /**
...@@ -1010,16 +998,18 @@ static int __reserve_metadata_bytes(struct btrfs_fs_info *fs_info, ...@@ -1010,16 +998,18 @@ static int __reserve_metadata_bytes(struct btrfs_fs_info *fs_info,
return ret; return ret;
if (flush == BTRFS_RESERVE_FLUSH_ALL) if (flush == BTRFS_RESERVE_FLUSH_ALL)
return wait_reserve_ticket(fs_info, space_info, &ticket); wait_reserve_ticket(fs_info, space_info, &ticket);
else
priority_reclaim_metadata_space(fs_info, space_info, &ticket);
ret = 0;
priority_reclaim_metadata_space(fs_info, space_info, &ticket);
spin_lock(&space_info->lock); spin_lock(&space_info->lock);
if (ticket.bytes) { ret = ticket.error;
if (ticket.bytes || ticket.error) {
if (ticket.bytes < orig_bytes) if (ticket.bytes < orig_bytes)
reclaim_bytes = orig_bytes - ticket.bytes; reclaim_bytes = orig_bytes - ticket.bytes;
list_del_init(&ticket.list); list_del_init(&ticket.list);
ret = -ENOSPC; if (!ret)
ret = -ENOSPC;
} }
spin_unlock(&space_info->lock); spin_unlock(&space_info->lock);
......
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