48
48
49
49
50
50
static int __btrfs_free_extent (struct btrfs_trans_handle * trans ,
51
+ struct btrfs_delayed_ref_head * href ,
51
52
struct btrfs_delayed_ref_node * node , u64 parent ,
52
53
u64 root_objectid , u64 owner_objectid ,
53
54
u64 owner_offset ,
@@ -1541,6 +1542,7 @@ static int __btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
1541
1542
}
1542
1543
1543
1544
static int run_delayed_data_ref (struct btrfs_trans_handle * trans ,
1545
+ struct btrfs_delayed_ref_head * href ,
1544
1546
struct btrfs_delayed_ref_node * node ,
1545
1547
struct btrfs_delayed_extent_op * extent_op ,
1546
1548
bool insert_reserved )
@@ -1558,6 +1560,13 @@ static int run_delayed_data_ref(struct btrfs_trans_handle *trans,
1558
1560
1559
1561
if (node -> action == BTRFS_ADD_DELAYED_REF && insert_reserved ) {
1560
1562
struct btrfs_key key ;
1563
+ struct btrfs_squota_delta delta = {
1564
+ .root = href -> owning_root ,
1565
+ .num_bytes = node -> num_bytes ,
1566
+ .rsv_bytes = href -> reserved_bytes ,
1567
+ .is_data = true,
1568
+ .is_inc = true,
1569
+ };
1561
1570
1562
1571
if (extent_op )
1563
1572
flags |= extent_op -> flags_to_set ;
@@ -1570,12 +1579,17 @@ static int run_delayed_data_ref(struct btrfs_trans_handle *trans,
1570
1579
flags , ref -> objectid ,
1571
1580
ref -> offset , & key ,
1572
1581
node -> ref_mod );
1582
+ if (!ret )
1583
+ ret = btrfs_record_squota_delta (trans -> fs_info , & delta );
1584
+ else
1585
+ btrfs_qgroup_free_refroot (trans -> fs_info , delta .root ,
1586
+ delta .rsv_bytes , BTRFS_QGROUP_RSV_DATA );
1573
1587
} else if (node -> action == BTRFS_ADD_DELAYED_REF ) {
1574
1588
ret = __btrfs_inc_extent_ref (trans , node , parent , ref -> root ,
1575
1589
ref -> objectid , ref -> offset ,
1576
1590
extent_op );
1577
1591
} else if (node -> action == BTRFS_DROP_DELAYED_REF ) {
1578
- ret = __btrfs_free_extent (trans , node , parent ,
1592
+ ret = __btrfs_free_extent (trans , href , node , parent ,
1579
1593
ref -> root , ref -> objectid ,
1580
1594
ref -> offset , extent_op );
1581
1595
} else {
@@ -1692,11 +1706,13 @@ static int run_delayed_extent_op(struct btrfs_trans_handle *trans,
1692
1706
}
1693
1707
1694
1708
static int run_delayed_tree_ref (struct btrfs_trans_handle * trans ,
1709
+ struct btrfs_delayed_ref_head * href ,
1695
1710
struct btrfs_delayed_ref_node * node ,
1696
1711
struct btrfs_delayed_extent_op * extent_op ,
1697
1712
bool insert_reserved )
1698
1713
{
1699
1714
int ret = 0 ;
1715
+ struct btrfs_fs_info * fs_info = trans -> fs_info ;
1700
1716
struct btrfs_delayed_tree_ref * ref ;
1701
1717
u64 parent = 0 ;
1702
1718
u64 ref_root = 0 ;
@@ -1716,13 +1732,23 @@ static int run_delayed_tree_ref(struct btrfs_trans_handle *trans,
1716
1732
return - EUCLEAN ;
1717
1733
}
1718
1734
if (node -> action == BTRFS_ADD_DELAYED_REF && insert_reserved ) {
1735
+ struct btrfs_squota_delta delta = {
1736
+ .root = href -> owning_root ,
1737
+ .num_bytes = fs_info -> nodesize ,
1738
+ .rsv_bytes = 0 ,
1739
+ .is_data = false,
1740
+ .is_inc = true,
1741
+ };
1742
+
1719
1743
BUG_ON (!extent_op || !extent_op -> update_flags );
1720
1744
ret = alloc_reserved_tree_block (trans , node , extent_op );
1745
+ if (!ret )
1746
+ btrfs_record_squota_delta (fs_info , & delta );
1721
1747
} else if (node -> action == BTRFS_ADD_DELAYED_REF ) {
1722
1748
ret = __btrfs_inc_extent_ref (trans , node , parent , ref_root ,
1723
1749
ref -> level , 0 , extent_op );
1724
1750
} else if (node -> action == BTRFS_DROP_DELAYED_REF ) {
1725
- ret = __btrfs_free_extent (trans , node , parent , ref_root ,
1751
+ ret = __btrfs_free_extent (trans , href , node , parent , ref_root ,
1726
1752
ref -> level , 0 , extent_op );
1727
1753
} else {
1728
1754
BUG ();
@@ -1732,6 +1758,7 @@ static int run_delayed_tree_ref(struct btrfs_trans_handle *trans,
1732
1758
1733
1759
/* helper function to actually process a single delayed ref entry */
1734
1760
static int run_one_delayed_ref (struct btrfs_trans_handle * trans ,
1761
+ struct btrfs_delayed_ref_head * href ,
1735
1762
struct btrfs_delayed_ref_node * node ,
1736
1763
struct btrfs_delayed_extent_op * extent_op ,
1737
1764
bool insert_reserved )
@@ -1746,11 +1773,11 @@ static int run_one_delayed_ref(struct btrfs_trans_handle *trans,
1746
1773
1747
1774
if (node -> type == BTRFS_TREE_BLOCK_REF_KEY ||
1748
1775
node -> type == BTRFS_SHARED_BLOCK_REF_KEY )
1749
- ret = run_delayed_tree_ref (trans , node , extent_op ,
1776
+ ret = run_delayed_tree_ref (trans , href , node , extent_op ,
1750
1777
insert_reserved );
1751
1778
else if (node -> type == BTRFS_EXTENT_DATA_REF_KEY ||
1752
1779
node -> type == BTRFS_SHARED_DATA_REF_KEY )
1753
- ret = run_delayed_data_ref (trans , node , extent_op ,
1780
+ ret = run_delayed_data_ref (trans , href , node , extent_op ,
1754
1781
insert_reserved );
1755
1782
else if (node -> type == BTRFS_EXTENT_OWNER_REF_KEY )
1756
1783
ret = 0 ;
@@ -1852,6 +1879,10 @@ u64 btrfs_cleanup_ref_head_accounting(struct btrfs_fs_info *fs_info,
1852
1879
1853
1880
return btrfs_calc_delayed_ref_csum_bytes (fs_info , nr_csums );
1854
1881
}
1882
+ if (btrfs_qgroup_mode (fs_info ) == BTRFS_QGROUP_MODE_SIMPLE &&
1883
+ head -> must_insert_reserved && head -> is_data )
1884
+ btrfs_qgroup_free_refroot (fs_info , head -> owning_root ,
1885
+ head -> reserved_bytes , BTRFS_QGROUP_RSV_DATA );
1855
1886
1856
1887
return 0 ;
1857
1888
}
@@ -2000,10 +2031,11 @@ static int btrfs_run_delayed_refs_for_head(struct btrfs_trans_handle *trans,
2000
2031
locked_ref -> extent_op = NULL ;
2001
2032
spin_unlock (& locked_ref -> lock );
2002
2033
2003
- ret = run_one_delayed_ref (trans , ref , extent_op ,
2034
+ ret = run_one_delayed_ref (trans , locked_ref , ref , extent_op ,
2004
2035
must_insert_reserved );
2005
2036
btrfs_delayed_refs_rsv_release (fs_info , 1 , 0 );
2006
2037
* bytes_released += btrfs_calc_delayed_ref_bytes (fs_info , 1 );
2038
+
2007
2039
btrfs_free_delayed_extent_op (extent_op );
2008
2040
if (ret ) {
2009
2041
unselect_delayed_ref_head (delayed_refs , locked_ref );
@@ -2916,11 +2948,12 @@ u64 btrfs_get_extent_owner_root(struct btrfs_fs_info *fs_info,
2916
2948
}
2917
2949
2918
2950
static int do_free_extent_accounting (struct btrfs_trans_handle * trans ,
2919
- u64 bytenr , u64 num_bytes , bool is_data )
2951
+ u64 bytenr , struct btrfs_squota_delta * delta )
2920
2952
{
2921
2953
int ret ;
2954
+ u64 num_bytes = delta -> num_bytes ;
2922
2955
2923
- if (is_data ) {
2956
+ if (delta -> is_data ) {
2924
2957
struct btrfs_root * csum_root ;
2925
2958
2926
2959
csum_root = btrfs_csum_root (trans -> fs_info , bytenr );
@@ -2937,6 +2970,12 @@ static int do_free_extent_accounting(struct btrfs_trans_handle *trans,
2937
2970
}
2938
2971
}
2939
2972
2973
+ ret = btrfs_record_squota_delta (trans -> fs_info , delta );
2974
+ if (ret ) {
2975
+ btrfs_abort_transaction (trans , ret );
2976
+ return ret ;
2977
+ }
2978
+
2940
2979
ret = add_to_free_space_tree (trans , bytenr , num_bytes );
2941
2980
if (ret ) {
2942
2981
btrfs_abort_transaction (trans , ret );
@@ -3017,6 +3056,7 @@ static int do_free_extent_accounting(struct btrfs_trans_handle *trans,
3017
3056
* And that (13631488 EXTENT_DATA_REF <HASH>) gets removed.
3018
3057
*/
3019
3058
static int __btrfs_free_extent (struct btrfs_trans_handle * trans ,
3059
+ struct btrfs_delayed_ref_head * href ,
3020
3060
struct btrfs_delayed_ref_node * node , u64 parent ,
3021
3061
u64 root_objectid , u64 owner_objectid ,
3022
3062
u64 owner_offset ,
@@ -3040,6 +3080,7 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
3040
3080
u64 bytenr = node -> bytenr ;
3041
3081
u64 num_bytes = node -> num_bytes ;
3042
3082
bool skinny_metadata = btrfs_fs_incompat (info , SKINNY_METADATA );
3083
+ u64 delayed_ref_root = href -> owning_root ;
3043
3084
3044
3085
extent_root = btrfs_extent_root (info , bytenr );
3045
3086
ASSERT (extent_root );
@@ -3240,6 +3281,14 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
3240
3281
}
3241
3282
}
3242
3283
} else {
3284
+ struct btrfs_squota_delta delta = {
3285
+ .root = delayed_ref_root ,
3286
+ .num_bytes = num_bytes ,
3287
+ .rsv_bytes = 0 ,
3288
+ .is_data = is_data ,
3289
+ .is_inc = false,
3290
+ };
3291
+
3243
3292
/* In this branch refs == 1 */
3244
3293
if (found_extent ) {
3245
3294
if (is_data && refs_to_drop !=
@@ -3278,6 +3327,16 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
3278
3327
num_to_del = 2 ;
3279
3328
}
3280
3329
}
3330
+ /*
3331
+ * We can't infer the data owner from the delayed ref, so we need
3332
+ * to try to get it from the owning ref item.
3333
+ *
3334
+ * If it is not present, then that extent was not written under
3335
+ * simple quotas mode, so we don't need to account for its deletion.
3336
+ */
3337
+ if (is_data )
3338
+ delta .root = btrfs_get_extent_owner_root (trans -> fs_info ,
3339
+ leaf , extent_slot );
3281
3340
3282
3341
ret = btrfs_del_items (trans , extent_root , path , path -> slots [0 ],
3283
3342
num_to_del );
@@ -3287,7 +3346,7 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans,
3287
3346
}
3288
3347
btrfs_release_path (path );
3289
3348
3290
- ret = do_free_extent_accounting (trans , bytenr , num_bytes , is_data );
3349
+ ret = do_free_extent_accounting (trans , bytenr , & delta );
3291
3350
}
3292
3351
btrfs_release_path (path );
3293
3352
@@ -4862,6 +4921,13 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans,
4862
4921
int ret ;
4863
4922
struct btrfs_block_group * block_group ;
4864
4923
struct btrfs_space_info * space_info ;
4924
+ struct btrfs_squota_delta delta = {
4925
+ .root = root_objectid ,
4926
+ .num_bytes = ins -> offset ,
4927
+ .rsv_bytes = 0 ,
4928
+ .is_data = true,
4929
+ .is_inc = true,
4930
+ };
4865
4931
4866
4932
/*
4867
4933
* Mixed block groups will exclude before processing the log so we only
@@ -4890,6 +4956,7 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans,
4890
4956
offset , ins , 1 );
4891
4957
if (ret )
4892
4958
btrfs_pin_extent (trans , ins -> objectid , ins -> offset , 1 );
4959
+ ret = btrfs_record_squota_delta (fs_info , & delta );
4893
4960
btrfs_put_block_group (block_group );
4894
4961
return ret ;
4895
4962
}
0 commit comments