} while (flush_state < ARRAY_SIZE(priority_flush_states));
}
-static int wait_reserve_ticket(struct btrfs_fs_info *fs_info,
- struct btrfs_space_info *space_info,
- struct reserve_ticket *ticket)
+static void wait_reserve_ticket(struct btrfs_fs_info *fs_info,
+ struct btrfs_space_info *space_info,
+ struct reserve_ticket *ticket)
{
DEFINE_WAIT(wait);
- u64 reclaim_bytes = 0;
int ret = 0;
spin_lock(&space_info->lock);
while (ticket->bytes > 0 && ticket->error == 0) {
ret = prepare_to_wait_event(&ticket->wait, &wait, TASK_KILLABLE);
if (ret) {
- ret = -EINTR;
+ ticket->error = -EINTR;
break;
}
spin_unlock(&space_info->lock);
finish_wait(&ticket->wait, &wait);
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);
-
- if (reclaim_bytes)
- btrfs_space_info_add_old_bytes(fs_info, space_info,
- reclaim_bytes);
- return ret;
}
/**
return ret;
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);
- if (ticket.bytes) {
+ ret = ticket.error;
+ if (ticket.bytes || ticket.error) {
if (ticket.bytes < orig_bytes)
reclaim_bytes = orig_bytes - ticket.bytes;
list_del_init(&ticket.list);
- ret = -ENOSPC;
+ if (!ret)
+ ret = -ENOSPC;
}
spin_unlock(&space_info->lock);