Skip to content

Commit 4f5427c

Browse files
adam900710kdave
authored andcommitted
btrfs: delayed-inode: Use new qgroup meta rsv for delayed inode and item
Quite similar for delalloc, some modification to delayed-inode and delayed-item reservation. Also needs extra parameter for release case to distinguish normal release and error release. Signed-off-by: Qu Wenruo <[email protected]> Signed-off-by: David Sterba <[email protected]>
1 parent 43b1859 commit 4f5427c

File tree

1 file changed

+30
-16
lines changed

1 file changed

+30
-16
lines changed

fs/btrfs/delayed-inode.c

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "disk-io.h"
2424
#include "transaction.h"
2525
#include "ctree.h"
26+
#include "qgroup.h"
2627

2728
#define BTRFS_DELAYED_WRITEBACK 512
2829
#define BTRFS_DELAYED_BACKGROUND 128
@@ -552,11 +553,12 @@ static struct btrfs_delayed_item *__btrfs_next_delayed_item(
552553
}
553554

554555
static int btrfs_delayed_item_reserve_metadata(struct btrfs_trans_handle *trans,
555-
struct btrfs_fs_info *fs_info,
556+
struct btrfs_root *root,
556557
struct btrfs_delayed_item *item)
557558
{
558559
struct btrfs_block_rsv *src_rsv;
559560
struct btrfs_block_rsv *dst_rsv;
561+
struct btrfs_fs_info *fs_info = root->fs_info;
560562
u64 num_bytes;
561563
int ret;
562564

@@ -578,15 +580,17 @@ static int btrfs_delayed_item_reserve_metadata(struct btrfs_trans_handle *trans,
578580
return ret;
579581
}
580582

581-
static void btrfs_delayed_item_release_metadata(struct btrfs_fs_info *fs_info,
583+
static void btrfs_delayed_item_release_metadata(struct btrfs_root *root,
582584
struct btrfs_delayed_item *item)
583585
{
584586
struct btrfs_block_rsv *rsv;
587+
struct btrfs_fs_info *fs_info = root->fs_info;
585588

586589
if (!item->bytes_reserved)
587590
return;
588591

589592
rsv = &fs_info->delayed_block_rsv;
593+
btrfs_qgroup_convert_reserved_meta(root, item->bytes_reserved);
590594
trace_btrfs_space_reservation(fs_info, "delayed_item",
591595
item->key.objectid, item->bytes_reserved,
592596
0);
@@ -611,6 +615,9 @@ static int btrfs_delayed_inode_reserve_metadata(
611615

612616
num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1);
613617

618+
ret = btrfs_qgroup_reserve_meta_prealloc(root, num_bytes, true);
619+
if (ret < 0)
620+
return ret;
614621
/*
615622
* btrfs_dirty_inode will update the inode under btrfs_join_transaction
616623
* which doesn't reserve space for speed. This is a problem since we
@@ -630,8 +637,10 @@ static int btrfs_delayed_inode_reserve_metadata(
630637
* EAGAIN to make us stop the transaction we have, so return
631638
* ENOSPC instead so that btrfs_dirty_inode knows what to do.
632639
*/
633-
if (ret == -EAGAIN)
640+
if (ret == -EAGAIN) {
634641
ret = -ENOSPC;
642+
btrfs_qgroup_free_meta_prealloc(root, num_bytes);
643+
}
635644
if (!ret) {
636645
node->bytes_reserved = num_bytes;
637646
trace_btrfs_space_reservation(fs_info,
@@ -653,7 +662,8 @@ static int btrfs_delayed_inode_reserve_metadata(
653662
}
654663

655664
static void btrfs_delayed_inode_release_metadata(struct btrfs_fs_info *fs_info,
656-
struct btrfs_delayed_node *node)
665+
struct btrfs_delayed_node *node,
666+
bool qgroup_free)
657667
{
658668
struct btrfs_block_rsv *rsv;
659669

@@ -665,6 +675,12 @@ static void btrfs_delayed_inode_release_metadata(struct btrfs_fs_info *fs_info,
665675
node->inode_id, node->bytes_reserved, 0);
666676
btrfs_block_rsv_release(fs_info, rsv,
667677
node->bytes_reserved);
678+
if (qgroup_free)
679+
btrfs_qgroup_free_meta_prealloc(node->root,
680+
node->bytes_reserved);
681+
else
682+
btrfs_qgroup_convert_reserved_meta(node->root,
683+
node->bytes_reserved);
668684
node->bytes_reserved = 0;
669685
}
670686

@@ -766,7 +782,7 @@ static int btrfs_batch_insert_items(struct btrfs_root *root,
766782
curr->data_len);
767783
slot++;
768784

769-
btrfs_delayed_item_release_metadata(fs_info, curr);
785+
btrfs_delayed_item_release_metadata(root, curr);
770786

771787
list_del(&curr->tree_list);
772788
btrfs_release_delayed_item(curr);
@@ -788,7 +804,6 @@ static int btrfs_insert_delayed_item(struct btrfs_trans_handle *trans,
788804
struct btrfs_path *path,
789805
struct btrfs_delayed_item *delayed_item)
790806
{
791-
struct btrfs_fs_info *fs_info = root->fs_info;
792807
struct extent_buffer *leaf;
793808
char *ptr;
794809
int ret;
@@ -806,7 +821,7 @@ static int btrfs_insert_delayed_item(struct btrfs_trans_handle *trans,
806821
delayed_item->data_len);
807822
btrfs_mark_buffer_dirty(leaf);
808823

809-
btrfs_delayed_item_release_metadata(fs_info, delayed_item);
824+
btrfs_delayed_item_release_metadata(root, delayed_item);
810825
return 0;
811826
}
812827

@@ -858,7 +873,6 @@ static int btrfs_batch_delete_items(struct btrfs_trans_handle *trans,
858873
struct btrfs_path *path,
859874
struct btrfs_delayed_item *item)
860875
{
861-
struct btrfs_fs_info *fs_info = root->fs_info;
862876
struct btrfs_delayed_item *curr, *next;
863877
struct extent_buffer *leaf;
864878
struct btrfs_key key;
@@ -908,7 +922,7 @@ static int btrfs_batch_delete_items(struct btrfs_trans_handle *trans,
908922
goto out;
909923

910924
list_for_each_entry_safe(curr, next, &head, tree_list) {
911-
btrfs_delayed_item_release_metadata(fs_info, curr);
925+
btrfs_delayed_item_release_metadata(root, curr);
912926
list_del(&curr->tree_list);
913927
btrfs_release_delayed_item(curr);
914928
}
@@ -1051,7 +1065,7 @@ static int __btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
10511065
no_iref:
10521066
btrfs_release_path(path);
10531067
err_out:
1054-
btrfs_delayed_inode_release_metadata(fs_info, node);
1068+
btrfs_delayed_inode_release_metadata(fs_info, node, (ret < 0));
10551069
btrfs_release_delayed_inode(node);
10561070

10571071
return ret;
@@ -1441,7 +1455,7 @@ int btrfs_insert_delayed_dir_index(struct btrfs_trans_handle *trans,
14411455
btrfs_set_stack_dir_type(dir_item, type);
14421456
memcpy((char *)(dir_item + 1), name, name_len);
14431457

1444-
ret = btrfs_delayed_item_reserve_metadata(trans, fs_info, delayed_item);
1458+
ret = btrfs_delayed_item_reserve_metadata(trans, dir->root, delayed_item);
14451459
/*
14461460
* we have reserved enough space when we start a new transaction,
14471461
* so reserving metadata failure is impossible
@@ -1478,7 +1492,7 @@ static int btrfs_delete_delayed_insertion_item(struct btrfs_fs_info *fs_info,
14781492
return 1;
14791493
}
14801494

1481-
btrfs_delayed_item_release_metadata(fs_info, item);
1495+
btrfs_delayed_item_release_metadata(node->root, item);
14821496
btrfs_release_delayed_item(item);
14831497
mutex_unlock(&node->mutex);
14841498
return 0;
@@ -1513,7 +1527,7 @@ int btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans,
15131527

15141528
item->key = item_key;
15151529

1516-
ret = btrfs_delayed_item_reserve_metadata(trans, fs_info, item);
1530+
ret = btrfs_delayed_item_reserve_metadata(trans, dir->root, item);
15171531
/*
15181532
* we have reserved enough space when we start a new transaction,
15191533
* so reserving metadata failure is impossible.
@@ -1878,15 +1892,15 @@ static void __btrfs_kill_delayed_node(struct btrfs_delayed_node *delayed_node)
18781892
mutex_lock(&delayed_node->mutex);
18791893
curr_item = __btrfs_first_delayed_insertion_item(delayed_node);
18801894
while (curr_item) {
1881-
btrfs_delayed_item_release_metadata(fs_info, curr_item);
1895+
btrfs_delayed_item_release_metadata(root, curr_item);
18821896
prev_item = curr_item;
18831897
curr_item = __btrfs_next_delayed_item(prev_item);
18841898
btrfs_release_delayed_item(prev_item);
18851899
}
18861900

18871901
curr_item = __btrfs_first_delayed_deletion_item(delayed_node);
18881902
while (curr_item) {
1889-
btrfs_delayed_item_release_metadata(fs_info, curr_item);
1903+
btrfs_delayed_item_release_metadata(root, curr_item);
18901904
prev_item = curr_item;
18911905
curr_item = __btrfs_next_delayed_item(prev_item);
18921906
btrfs_release_delayed_item(prev_item);
@@ -1896,7 +1910,7 @@ static void __btrfs_kill_delayed_node(struct btrfs_delayed_node *delayed_node)
18961910
btrfs_release_delayed_iref(delayed_node);
18971911

18981912
if (test_bit(BTRFS_DELAYED_NODE_INODE_DIRTY, &delayed_node->flags)) {
1899-
btrfs_delayed_inode_release_metadata(fs_info, delayed_node);
1913+
btrfs_delayed_inode_release_metadata(fs_info, delayed_node, false);
19001914
btrfs_release_delayed_inode(delayed_node);
19011915
}
19021916
mutex_unlock(&delayed_node->mutex);

0 commit comments

Comments
 (0)