btrfs: move btrfs_space_info_add_*_bytes to space-info.c
Now that we've moved all the pre-requisite stuff, move these two functions. Reviewed-by: Nikolay Borisov <nborisov@suse.com> Signed-off-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Родитель
bb96c4e574
Коммит
b338b013e1
|
@ -4485,14 +4485,6 @@ skip_async:
|
|||
}
|
||||
}
|
||||
|
||||
struct reserve_ticket {
|
||||
u64 orig_bytes;
|
||||
u64 bytes;
|
||||
int error;
|
||||
struct list_head list;
|
||||
wait_queue_head_t wait;
|
||||
};
|
||||
|
||||
/**
|
||||
* maybe_commit_transaction - possibly commit the transaction if its ok to
|
||||
* @root - the root we're allocating for
|
||||
|
@ -5211,109 +5203,6 @@ int btrfs_delayed_refs_rsv_refill(struct btrfs_fs_info *fs_info,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is for space we already have accounted in space_info->bytes_may_use, so
|
||||
* basically when we're returning space from block_rsv's.
|
||||
*/
|
||||
void btrfs_space_info_add_old_bytes(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_space_info *space_info,
|
||||
u64 num_bytes)
|
||||
{
|
||||
struct reserve_ticket *ticket;
|
||||
struct list_head *head;
|
||||
u64 used;
|
||||
enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_NO_FLUSH;
|
||||
bool check_overcommit = false;
|
||||
|
||||
spin_lock(&space_info->lock);
|
||||
head = &space_info->priority_tickets;
|
||||
|
||||
/*
|
||||
* If we are over our limit then we need to check and see if we can
|
||||
* overcommit, and if we can't then we just need to free up our space
|
||||
* and not satisfy any requests.
|
||||
*/
|
||||
used = btrfs_space_info_used(space_info, true);
|
||||
if (used - num_bytes >= space_info->total_bytes)
|
||||
check_overcommit = true;
|
||||
again:
|
||||
while (!list_empty(head) && num_bytes) {
|
||||
ticket = list_first_entry(head, struct reserve_ticket,
|
||||
list);
|
||||
/*
|
||||
* We use 0 bytes because this space is already reserved, so
|
||||
* adding the ticket space would be a double count.
|
||||
*/
|
||||
if (check_overcommit &&
|
||||
!btrfs_can_overcommit(fs_info, space_info, 0, flush, false))
|
||||
break;
|
||||
if (num_bytes >= ticket->bytes) {
|
||||
list_del_init(&ticket->list);
|
||||
num_bytes -= ticket->bytes;
|
||||
ticket->bytes = 0;
|
||||
space_info->tickets_id++;
|
||||
wake_up(&ticket->wait);
|
||||
} else {
|
||||
ticket->bytes -= num_bytes;
|
||||
num_bytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_bytes && head == &space_info->priority_tickets) {
|
||||
head = &space_info->tickets;
|
||||
flush = BTRFS_RESERVE_FLUSH_ALL;
|
||||
goto again;
|
||||
}
|
||||
btrfs_space_info_update_bytes_may_use(fs_info, space_info, -num_bytes);
|
||||
trace_btrfs_space_reservation(fs_info, "space_info",
|
||||
space_info->flags, num_bytes, 0);
|
||||
spin_unlock(&space_info->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is for newly allocated space that isn't accounted in
|
||||
* space_info->bytes_may_use yet. So if we allocate a chunk or unpin an extent
|
||||
* we use this helper.
|
||||
*/
|
||||
void btrfs_space_info_add_new_bytes(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_space_info *space_info,
|
||||
u64 num_bytes)
|
||||
{
|
||||
struct reserve_ticket *ticket;
|
||||
struct list_head *head = &space_info->priority_tickets;
|
||||
|
||||
again:
|
||||
while (!list_empty(head) && num_bytes) {
|
||||
ticket = list_first_entry(head, struct reserve_ticket,
|
||||
list);
|
||||
if (num_bytes >= ticket->bytes) {
|
||||
trace_btrfs_space_reservation(fs_info, "space_info",
|
||||
space_info->flags,
|
||||
ticket->bytes, 1);
|
||||
list_del_init(&ticket->list);
|
||||
num_bytes -= ticket->bytes;
|
||||
btrfs_space_info_update_bytes_may_use(fs_info,
|
||||
space_info, ticket->bytes);
|
||||
ticket->bytes = 0;
|
||||
space_info->tickets_id++;
|
||||
wake_up(&ticket->wait);
|
||||
} else {
|
||||
trace_btrfs_space_reservation(fs_info, "space_info",
|
||||
space_info->flags,
|
||||
num_bytes, 1);
|
||||
btrfs_space_info_update_bytes_may_use(fs_info,
|
||||
space_info, num_bytes);
|
||||
ticket->bytes -= num_bytes;
|
||||
num_bytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_bytes && head == &space_info->priority_tickets) {
|
||||
head = &space_info->tickets;
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
|
||||
static u64 block_rsv_release_bytes(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_block_rsv *block_rsv,
|
||||
struct btrfs_block_rsv *dest, u64 num_bytes,
|
||||
|
|
|
@ -240,3 +240,109 @@ int btrfs_can_overcommit(struct btrfs_fs_info *fs_info,
|
|||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is for space we already have accounted in space_info->bytes_may_use, so
|
||||
* basically when we're returning space from block_rsv's.
|
||||
*/
|
||||
void btrfs_space_info_add_old_bytes(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_space_info *space_info,
|
||||
u64 num_bytes)
|
||||
{
|
||||
struct reserve_ticket *ticket;
|
||||
struct list_head *head;
|
||||
u64 used;
|
||||
enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_NO_FLUSH;
|
||||
bool check_overcommit = false;
|
||||
|
||||
spin_lock(&space_info->lock);
|
||||
head = &space_info->priority_tickets;
|
||||
|
||||
/*
|
||||
* If we are over our limit then we need to check and see if we can
|
||||
* overcommit, and if we can't then we just need to free up our space
|
||||
* and not satisfy any requests.
|
||||
*/
|
||||
used = btrfs_space_info_used(space_info, true);
|
||||
if (used - num_bytes >= space_info->total_bytes)
|
||||
check_overcommit = true;
|
||||
again:
|
||||
while (!list_empty(head) && num_bytes) {
|
||||
ticket = list_first_entry(head, struct reserve_ticket,
|
||||
list);
|
||||
/*
|
||||
* We use 0 bytes because this space is already reserved, so
|
||||
* adding the ticket space would be a double count.
|
||||
*/
|
||||
if (check_overcommit &&
|
||||
!btrfs_can_overcommit(fs_info, space_info, 0, flush,
|
||||
false))
|
||||
break;
|
||||
if (num_bytes >= ticket->bytes) {
|
||||
list_del_init(&ticket->list);
|
||||
num_bytes -= ticket->bytes;
|
||||
ticket->bytes = 0;
|
||||
space_info->tickets_id++;
|
||||
wake_up(&ticket->wait);
|
||||
} else {
|
||||
ticket->bytes -= num_bytes;
|
||||
num_bytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_bytes && head == &space_info->priority_tickets) {
|
||||
head = &space_info->tickets;
|
||||
flush = BTRFS_RESERVE_FLUSH_ALL;
|
||||
goto again;
|
||||
}
|
||||
btrfs_space_info_update_bytes_may_use(fs_info, space_info, -num_bytes);
|
||||
trace_btrfs_space_reservation(fs_info, "space_info",
|
||||
space_info->flags, num_bytes, 0);
|
||||
spin_unlock(&space_info->lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is for newly allocated space that isn't accounted in
|
||||
* space_info->bytes_may_use yet. So if we allocate a chunk or unpin an extent
|
||||
* we use this helper.
|
||||
*/
|
||||
void btrfs_space_info_add_new_bytes(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_space_info *space_info,
|
||||
u64 num_bytes)
|
||||
{
|
||||
struct reserve_ticket *ticket;
|
||||
struct list_head *head = &space_info->priority_tickets;
|
||||
|
||||
again:
|
||||
while (!list_empty(head) && num_bytes) {
|
||||
ticket = list_first_entry(head, struct reserve_ticket,
|
||||
list);
|
||||
if (num_bytes >= ticket->bytes) {
|
||||
trace_btrfs_space_reservation(fs_info, "space_info",
|
||||
space_info->flags,
|
||||
ticket->bytes, 1);
|
||||
list_del_init(&ticket->list);
|
||||
num_bytes -= ticket->bytes;
|
||||
btrfs_space_info_update_bytes_may_use(fs_info,
|
||||
space_info,
|
||||
ticket->bytes);
|
||||
ticket->bytes = 0;
|
||||
space_info->tickets_id++;
|
||||
wake_up(&ticket->wait);
|
||||
} else {
|
||||
trace_btrfs_space_reservation(fs_info, "space_info",
|
||||
space_info->flags,
|
||||
num_bytes, 1);
|
||||
btrfs_space_info_update_bytes_may_use(fs_info,
|
||||
space_info,
|
||||
num_bytes);
|
||||
ticket->bytes -= num_bytes;
|
||||
num_bytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_bytes && head == &space_info->priority_tickets) {
|
||||
head = &space_info->tickets;
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -69,6 +69,14 @@ struct btrfs_space_info {
|
|||
struct kobject *block_group_kobjs[BTRFS_NR_RAID_TYPES];
|
||||
};
|
||||
|
||||
struct reserve_ticket {
|
||||
u64 orig_bytes;
|
||||
u64 bytes;
|
||||
int error;
|
||||
struct list_head list;
|
||||
wait_queue_head_t wait;
|
||||
};
|
||||
|
||||
static inline bool btrfs_mixed_space_info(struct btrfs_space_info *space_info)
|
||||
{
|
||||
return ((space_info->flags & BTRFS_BLOCK_GROUP_METADATA) &&
|
||||
|
|
Загрузка…
Ссылка в новой задаче