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
554555static 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
655664static 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,
10511065no_iref :
10521066 btrfs_release_path (path );
10531067err_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