@@ -314,39 +314,6 @@ static int comp_refs(struct btrfs_delayed_ref_node *ref1,
314
314
return 0 ;
315
315
}
316
316
317
- /* insert a new ref to head ref rbtree */
318
- static struct btrfs_delayed_ref_head * htree_insert (struct rb_root_cached * root ,
319
- struct rb_node * node )
320
- {
321
- struct rb_node * * p = & root -> rb_root .rb_node ;
322
- struct rb_node * parent_node = NULL ;
323
- struct btrfs_delayed_ref_head * entry ;
324
- struct btrfs_delayed_ref_head * ins ;
325
- u64 bytenr ;
326
- bool leftmost = true;
327
-
328
- ins = rb_entry (node , struct btrfs_delayed_ref_head , href_node );
329
- bytenr = ins -> bytenr ;
330
- while (* p ) {
331
- parent_node = * p ;
332
- entry = rb_entry (parent_node , struct btrfs_delayed_ref_head ,
333
- href_node );
334
-
335
- if (bytenr < entry -> bytenr ) {
336
- p = & (* p )-> rb_left ;
337
- } else if (bytenr > entry -> bytenr ) {
338
- p = & (* p )-> rb_right ;
339
- leftmost = false;
340
- } else {
341
- return entry ;
342
- }
343
- }
344
-
345
- rb_link_node (node , parent_node , p );
346
- rb_insert_color_cached (node , root , leftmost );
347
- return NULL ;
348
- }
349
-
350
317
static struct btrfs_delayed_ref_node * tree_insert (struct rb_root_cached * root ,
351
318
struct btrfs_delayed_ref_node * ins )
352
319
{
@@ -381,18 +348,11 @@ static struct btrfs_delayed_ref_node* tree_insert(struct rb_root_cached *root,
381
348
static struct btrfs_delayed_ref_head * find_first_ref_head (
382
349
struct btrfs_delayed_ref_root * dr )
383
350
{
384
- struct rb_node * n ;
385
- struct btrfs_delayed_ref_head * entry ;
351
+ unsigned long from = 0 ;
386
352
387
353
lockdep_assert_held (& dr -> lock );
388
354
389
- n = rb_first_cached (& dr -> href_root );
390
- if (!n )
391
- return NULL ;
392
-
393
- entry = rb_entry (n , struct btrfs_delayed_ref_head , href_node );
394
-
395
- return entry ;
355
+ return xa_find (& dr -> head_refs , & from , ULONG_MAX , XA_PRESENT );
396
356
}
397
357
398
358
/*
@@ -405,35 +365,22 @@ static struct btrfs_delayed_ref_head *find_ref_head(
405
365
struct btrfs_delayed_ref_root * dr , u64 bytenr ,
406
366
bool return_bigger )
407
367
{
408
- struct rb_root * root = & dr -> href_root . rb_root ;
409
- struct rb_node * n ;
368
+ const unsigned long target_index = ( bytenr >> fs_info -> sectorsize_bits ) ;
369
+ unsigned long found_index = target_index ;
410
370
struct btrfs_delayed_ref_head * entry ;
411
371
412
372
lockdep_assert_held (& dr -> lock );
413
373
414
- n = root -> rb_node ;
415
- entry = NULL ;
416
- while (n ) {
417
- entry = rb_entry (n , struct btrfs_delayed_ref_head , href_node );
374
+ entry = xa_find (& dr -> head_refs , & found_index , ULONG_MAX , XA_PRESENT );
375
+ if (!entry )
376
+ return NULL ;
377
+
378
+ ASSERT (found_index >= target_index );
418
379
419
- if (bytenr < entry -> bytenr )
420
- n = n -> rb_left ;
421
- else if (bytenr > entry -> bytenr )
422
- n = n -> rb_right ;
423
- else
424
- return entry ;
425
- }
426
- if (entry && return_bigger ) {
427
- if (bytenr > entry -> bytenr ) {
428
- n = rb_next (& entry -> href_node );
429
- if (!n )
430
- return NULL ;
431
- entry = rb_entry (n , struct btrfs_delayed_ref_head ,
432
- href_node );
433
- }
434
- return entry ;
435
- }
436
- return NULL ;
380
+ if (found_index != target_index && !return_bigger )
381
+ return NULL ;
382
+
383
+ return entry ;
437
384
}
438
385
439
386
static bool btrfs_delayed_ref_lock (struct btrfs_delayed_ref_root * delayed_refs ,
@@ -448,7 +395,7 @@ static bool btrfs_delayed_ref_lock(struct btrfs_delayed_ref_root *delayed_refs,
448
395
449
396
mutex_lock (& head -> mutex );
450
397
spin_lock (& delayed_refs -> lock );
451
- if (RB_EMPTY_NODE ( & head -> href_node ) ) {
398
+ if (! head -> tracked ) {
452
399
mutex_unlock (& head -> mutex );
453
400
btrfs_put_delayed_ref_head (head );
454
401
return false;
@@ -567,35 +514,27 @@ struct btrfs_delayed_ref_head *btrfs_select_ref_head(
567
514
struct btrfs_delayed_ref_root * delayed_refs )
568
515
{
569
516
struct btrfs_delayed_ref_head * head ;
517
+ unsigned long start_index ;
518
+ unsigned long found_index ;
519
+ bool found_head = false;
570
520
bool locked ;
571
521
572
522
spin_lock (& delayed_refs -> lock );
573
523
again :
574
- head = find_ref_head (fs_info , delayed_refs ,
575
- delayed_refs -> run_delayed_start , true);
576
- if (!head && delayed_refs -> run_delayed_start != 0 ) {
577
- delayed_refs -> run_delayed_start = 0 ;
578
- head = find_first_ref_head (delayed_refs );
579
- }
580
- if (!head ) {
581
- spin_unlock (& delayed_refs -> lock );
582
- return NULL ;
524
+ start_index = (delayed_refs -> run_delayed_start >> fs_info -> sectorsize_bits );
525
+ xa_for_each_start (& delayed_refs -> head_refs , found_index , head , start_index ) {
526
+ if (!head -> processing ) {
527
+ found_head = true;
528
+ break ;
529
+ }
583
530
}
584
-
585
- while (head -> processing ) {
586
- struct rb_node * node ;
587
-
588
- node = rb_next (& head -> href_node );
589
- if (!node ) {
590
- if (delayed_refs -> run_delayed_start == 0 ) {
591
- spin_unlock (& delayed_refs -> lock );
592
- return NULL ;
593
- }
594
- delayed_refs -> run_delayed_start = 0 ;
595
- goto again ;
531
+ if (!found_head ) {
532
+ if (delayed_refs -> run_delayed_start == 0 ) {
533
+ spin_unlock (& delayed_refs -> lock );
534
+ return NULL ;
596
535
}
597
- head = rb_entry ( node , struct btrfs_delayed_ref_head ,
598
- href_node ) ;
536
+ delayed_refs -> run_delayed_start = 0 ;
537
+ goto again ;
599
538
}
600
539
601
540
head -> processing = true;
@@ -632,11 +571,13 @@ void btrfs_delete_ref_head(const struct btrfs_fs_info *fs_info,
632
571
struct btrfs_delayed_ref_root * delayed_refs ,
633
572
struct btrfs_delayed_ref_head * head )
634
573
{
574
+ const unsigned long index = (head -> bytenr >> fs_info -> sectorsize_bits );
575
+
635
576
lockdep_assert_held (& delayed_refs -> lock );
636
577
lockdep_assert_held (& head -> lock );
637
578
638
- rb_erase_cached ( & head -> href_node , & delayed_refs -> href_root );
639
- RB_CLEAR_NODE ( & head -> href_node ) ;
579
+ xa_erase ( & delayed_refs -> head_refs , index );
580
+ head -> tracked = false ;
640
581
delayed_refs -> num_heads -- ;
641
582
if (!head -> processing )
642
583
delayed_refs -> num_heads_ready -- ;
@@ -845,7 +786,7 @@ static void init_delayed_ref_head(struct btrfs_delayed_ref_head *head_ref,
845
786
head_ref -> is_system = (generic_ref -> ref_root == BTRFS_CHUNK_TREE_OBJECTID );
846
787
head_ref -> ref_tree = RB_ROOT_CACHED ;
847
788
INIT_LIST_HEAD (& head_ref -> ref_add_list );
848
- RB_CLEAR_NODE ( & head_ref -> href_node ) ;
789
+ head_ref -> tracked = false ;
849
790
head_ref -> processing = false;
850
791
head_ref -> total_ref_mod = count_mod ;
851
792
spin_lock_init (& head_ref -> lock );
@@ -883,11 +824,24 @@ add_delayed_ref_head(struct btrfs_trans_handle *trans,
883
824
struct btrfs_fs_info * fs_info = trans -> fs_info ;
884
825
struct btrfs_delayed_ref_head * existing ;
885
826
struct btrfs_delayed_ref_root * delayed_refs ;
827
+ const unsigned long index = (head_ref -> bytenr >> fs_info -> sectorsize_bits );
886
828
bool qrecord_inserted = false;
887
829
888
830
delayed_refs = & trans -> transaction -> delayed_refs ;
889
831
lockdep_assert_held (& delayed_refs -> lock );
890
832
833
+ #if BITS_PER_LONG == 32
834
+ if (head_ref -> bytenr >= MAX_LFS_FILESIZE ) {
835
+ if (qrecord )
836
+ xa_release (& delayed_refs -> dirty_extents , index );
837
+ btrfs_err_rl (fs_info ,
838
+ "delayed ref head %llu is beyond 32bit page cache and xarray index limit" ,
839
+ head_ref -> bytenr );
840
+ btrfs_err_32bit_limit (fs_info );
841
+ return ERR_PTR (- EOVERFLOW );
842
+ }
843
+ #endif
844
+
891
845
/* Record qgroup extent info if provided */
892
846
if (qrecord ) {
893
847
int ret ;
@@ -896,8 +850,7 @@ add_delayed_ref_head(struct btrfs_trans_handle *trans,
896
850
head_ref -> bytenr );
897
851
if (ret ) {
898
852
/* Clean up if insertion fails or item exists. */
899
- xa_release (& delayed_refs -> dirty_extents ,
900
- head_ref -> bytenr >> fs_info -> sectorsize_bits );
853
+ xa_release (& delayed_refs -> dirty_extents , index );
901
854
/* Caller responsible for freeing qrecord on error. */
902
855
if (ret < 0 )
903
856
return ERR_PTR (ret );
@@ -909,8 +862,7 @@ add_delayed_ref_head(struct btrfs_trans_handle *trans,
909
862
910
863
trace_add_delayed_ref_head (fs_info , head_ref , action );
911
864
912
- existing = htree_insert (& delayed_refs -> href_root ,
913
- & head_ref -> href_node );
865
+ existing = xa_load (& delayed_refs -> head_refs , index );
914
866
if (existing ) {
915
867
update_existing_head_ref (trans , existing , head_ref );
916
868
/*
@@ -920,6 +872,19 @@ add_delayed_ref_head(struct btrfs_trans_handle *trans,
920
872
kmem_cache_free (btrfs_delayed_ref_head_cachep , head_ref );
921
873
head_ref = existing ;
922
874
} else {
875
+ existing = xa_store (& delayed_refs -> head_refs , index , head_ref , GFP_ATOMIC );
876
+ if (xa_is_err (existing )) {
877
+ /* Memory was preallocated by the caller. */
878
+ ASSERT (xa_err (existing ) != - ENOMEM );
879
+ return ERR_PTR (xa_err (existing ));
880
+ } else if (WARN_ON (existing )) {
881
+ /*
882
+ * Shouldn't happen we just did a lookup before under
883
+ * delayed_refs->lock.
884
+ */
885
+ return ERR_PTR (- EEXIST );
886
+ }
887
+ head_ref -> tracked = true;
923
888
/*
924
889
* We reserve the amount of bytes needed to delete csums when
925
890
* adding the ref head and not when adding individual drop refs
@@ -1040,6 +1005,8 @@ static int add_delayed_ref(struct btrfs_trans_handle *trans,
1040
1005
struct btrfs_delayed_ref_head * new_head_ref ;
1041
1006
struct btrfs_delayed_ref_root * delayed_refs ;
1042
1007
struct btrfs_qgroup_extent_record * record = NULL ;
1008
+ const unsigned long index = (generic_ref -> bytenr >> fs_info -> sectorsize_bits );
1009
+ bool qrecord_reserved = false;
1043
1010
bool qrecord_inserted ;
1044
1011
int action = generic_ref -> action ;
1045
1012
bool merged ;
@@ -1055,25 +1022,32 @@ static int add_delayed_ref(struct btrfs_trans_handle *trans,
1055
1022
goto free_node ;
1056
1023
}
1057
1024
1025
+ delayed_refs = & trans -> transaction -> delayed_refs ;
1026
+
1058
1027
if (btrfs_qgroup_full_accounting (fs_info ) && !generic_ref -> skip_qgroup ) {
1059
1028
record = kzalloc (sizeof (* record ), GFP_NOFS );
1060
1029
if (!record ) {
1061
1030
ret = - ENOMEM ;
1062
1031
goto free_head_ref ;
1063
1032
}
1064
- if (xa_reserve (& trans -> transaction -> delayed_refs .dirty_extents ,
1065
- generic_ref -> bytenr >> fs_info -> sectorsize_bits ,
1066
- GFP_NOFS )) {
1033
+ if (xa_reserve (& delayed_refs -> dirty_extents , index , GFP_NOFS )) {
1067
1034
ret = - ENOMEM ;
1068
1035
goto free_record ;
1069
1036
}
1037
+ qrecord_reserved = true;
1038
+ }
1039
+
1040
+ ret = xa_reserve (& delayed_refs -> head_refs , index , GFP_NOFS );
1041
+ if (ret ) {
1042
+ if (qrecord_reserved )
1043
+ xa_release (& delayed_refs -> dirty_extents , index );
1044
+ goto free_record ;
1070
1045
}
1071
1046
1072
1047
init_delayed_ref_common (fs_info , node , generic_ref );
1073
1048
init_delayed_ref_head (head_ref , generic_ref , record , reserved );
1074
1049
head_ref -> extent_op = extent_op ;
1075
1050
1076
- delayed_refs = & trans -> transaction -> delayed_refs ;
1077
1051
spin_lock (& delayed_refs -> lock );
1078
1052
1079
1053
/*
@@ -1083,6 +1057,7 @@ static int add_delayed_ref(struct btrfs_trans_handle *trans,
1083
1057
new_head_ref = add_delayed_ref_head (trans , head_ref , record ,
1084
1058
action , & qrecord_inserted );
1085
1059
if (IS_ERR (new_head_ref )) {
1060
+ xa_release (& delayed_refs -> head_refs , index );
1086
1061
spin_unlock (& delayed_refs -> lock );
1087
1062
ret = PTR_ERR (new_head_ref );
1088
1063
goto free_record ;
@@ -1145,6 +1120,7 @@ int btrfs_add_delayed_extent_op(struct btrfs_trans_handle *trans,
1145
1120
u64 bytenr , u64 num_bytes , u8 level ,
1146
1121
struct btrfs_delayed_extent_op * extent_op )
1147
1122
{
1123
+ const unsigned long index = (bytenr >> trans -> fs_info -> sectorsize_bits );
1148
1124
struct btrfs_delayed_ref_head * head_ref ;
1149
1125
struct btrfs_delayed_ref_head * head_ref_ret ;
1150
1126
struct btrfs_delayed_ref_root * delayed_refs ;
@@ -1155,6 +1131,7 @@ int btrfs_add_delayed_extent_op(struct btrfs_trans_handle *trans,
1155
1131
.num_bytes = num_bytes ,
1156
1132
.tree_ref .level = level ,
1157
1133
};
1134
+ int ret ;
1158
1135
1159
1136
head_ref = kmem_cache_alloc (btrfs_delayed_ref_head_cachep , GFP_NOFS );
1160
1137
if (!head_ref )
@@ -1164,16 +1141,23 @@ int btrfs_add_delayed_extent_op(struct btrfs_trans_handle *trans,
1164
1141
head_ref -> extent_op = extent_op ;
1165
1142
1166
1143
delayed_refs = & trans -> transaction -> delayed_refs ;
1167
- spin_lock (& delayed_refs -> lock );
1168
1144
1145
+ ret = xa_reserve (& delayed_refs -> head_refs , index , GFP_NOFS );
1146
+ if (ret ) {
1147
+ kmem_cache_free (btrfs_delayed_ref_head_cachep , head_ref );
1148
+ return ret ;
1149
+ }
1150
+
1151
+ spin_lock (& delayed_refs -> lock );
1169
1152
head_ref_ret = add_delayed_ref_head (trans , head_ref , NULL ,
1170
1153
BTRFS_UPDATE_DELAYED_HEAD , NULL );
1171
- spin_unlock (& delayed_refs -> lock );
1172
-
1173
1154
if (IS_ERR (head_ref_ret )) {
1155
+ xa_release (& delayed_refs -> head_refs , index );
1156
+ spin_unlock (& delayed_refs -> lock );
1174
1157
kmem_cache_free (btrfs_delayed_ref_head_cachep , head_ref );
1175
1158
return PTR_ERR (head_ref_ret );
1176
1159
}
1160
+ spin_unlock (& delayed_refs -> lock );
1177
1161
1178
1162
/*
1179
1163
* Need to update the delayed_refs_rsv with any changes we may have
0 commit comments