@@ -467,7 +467,6 @@ static int journal_sort_key_cmp(const void *_l, const void *_r)
467
467
void bch2_journal_keys_put (struct bch_fs * c )
468
468
{
469
469
struct journal_keys * keys = & c -> journal_keys ;
470
- struct journal_key * i ;
471
470
472
471
BUG_ON (atomic_read (& keys -> ref ) <= 0 );
473
472
@@ -477,7 +476,7 @@ void bch2_journal_keys_put(struct bch_fs *c)
477
476
move_gap (keys -> data , keys -> nr , keys -> size , keys -> gap , keys -> nr );
478
477
keys -> gap = keys -> nr ;
479
478
480
- for ( i = keys -> data ; i < keys -> data + keys -> nr ; i ++ )
479
+ darray_for_each ( * keys , i )
481
480
if (i -> allocated )
482
481
kfree (i -> k );
483
482
@@ -490,17 +489,16 @@ void bch2_journal_keys_put(struct bch_fs *c)
490
489
491
490
static void __journal_keys_sort (struct journal_keys * keys )
492
491
{
493
- struct journal_key * src , * dst ;
494
-
495
492
sort (keys -> data , keys -> nr , sizeof (keys -> data [0 ]), journal_sort_key_cmp , NULL );
496
493
497
- src = dst = keys -> data ;
498
- while (src < keys -> data + keys -> nr ) {
499
- while (src + 1 < keys -> data + keys -> nr &&
500
- !journal_key_cmp (src , src + 1 ))
501
- src ++ ;
494
+ struct journal_key * dst = keys -> data ;
495
+
496
+ darray_for_each (* keys , src ) {
497
+ if (src + 1 < & darray_top (* keys ) &&
498
+ !journal_key_cmp (src , src + 1 ))
499
+ continue ;
502
500
503
- * dst ++ = * src ++ ;
501
+ * dst ++ = * src ;
504
502
}
505
503
506
504
keys -> nr = dst - keys -> data ;
@@ -511,39 +509,7 @@ int bch2_journal_keys_sort(struct bch_fs *c)
511
509
struct genradix_iter iter ;
512
510
struct journal_replay * i , * * _i ;
513
511
struct journal_keys * keys = & c -> journal_keys ;
514
- size_t nr_keys = 0 , nr_read = 0 ;
515
-
516
- genradix_for_each (& c -> journal_entries , iter , _i ) {
517
- i = * _i ;
518
-
519
- if (!i || i -> ignore )
520
- continue ;
521
-
522
- for_each_jset_key (k , entry , & i -> j )
523
- nr_keys ++ ;
524
- }
525
-
526
- if (!nr_keys )
527
- return 0 ;
528
-
529
- keys -> size = roundup_pow_of_two (nr_keys );
530
-
531
- keys -> data = kvmalloc_array (keys -> size , sizeof (keys -> data [0 ]), GFP_KERNEL );
532
- if (!keys -> data ) {
533
- bch_err (c , "Failed to allocate buffer for sorted journal keys (%zu keys); trying slowpath" ,
534
- nr_keys );
535
-
536
- do {
537
- keys -> size >>= 1 ;
538
- keys -> data = kvmalloc_array (keys -> size , sizeof (keys -> data [0 ]), GFP_KERNEL );
539
- } while (!keys -> data && keys -> size > nr_keys / 8 );
540
-
541
- if (!keys -> data ) {
542
- bch_err (c , "Failed to allocate %zu size buffer for sorted journal keys; exiting" ,
543
- keys -> size );
544
- return - BCH_ERR_ENOMEM_journal_keys_sort ;
545
- }
546
- }
512
+ size_t nr_read = 0 ;
547
513
548
514
genradix_for_each (& c -> journal_entries , iter , _i ) {
549
515
i = * _i ;
@@ -554,31 +520,33 @@ int bch2_journal_keys_sort(struct bch_fs *c)
554
520
cond_resched ();
555
521
556
522
for_each_jset_key (k , entry , & i -> j ) {
557
- if (keys -> nr == keys -> size ) {
558
- __journal_keys_sort (keys );
559
-
560
- if (keys -> nr > keys -> size * 7 / 8 ) {
561
- bch_err (c , "Too many journal keys for slowpath; have %zu compacted, buf size %zu, processed %zu/%zu" ,
562
- keys -> nr , keys -> size , nr_read , nr_keys );
563
- return - BCH_ERR_ENOMEM_journal_keys_sort ;
564
- }
565
- }
566
-
567
- keys -> data [keys -> nr ++ ] = (struct journal_key ) {
523
+ struct journal_key n = (struct journal_key ) {
568
524
.btree_id = entry -> btree_id ,
569
525
.level = entry -> level ,
570
526
.k = k ,
571
527
.journal_seq = le64_to_cpu (i -> j .seq ),
572
528
.journal_offset = k -> _data - i -> j ._data ,
573
529
};
574
530
531
+ if (darray_push (keys , n )) {
532
+ __journal_keys_sort (keys );
533
+
534
+ if (keys -> nr * 8 > keys -> size * 7 ) {
535
+ bch_err (c , "Too many journal keys for slowpath; have %zu compacted, buf size %zu, processed %zu keys at seq %llu" ,
536
+ keys -> nr , keys -> size , nr_read , le64_to_cpu (i -> j .seq ));
537
+ return - BCH_ERR_ENOMEM_journal_keys_sort ;
538
+ }
539
+
540
+ BUG_ON (darray_push (keys , n ));
541
+ }
542
+
575
543
nr_read ++ ;
576
544
}
577
545
}
578
546
579
547
__journal_keys_sort (keys );
580
548
keys -> gap = keys -> nr ;
581
549
582
- bch_verbose (c , "Journal keys: %zu read, %zu after sorting and compacting" , nr_keys , keys -> nr );
550
+ bch_verbose (c , "Journal keys: %zu read, %zu after sorting and compacting" , nr_read , keys -> nr );
583
551
return 0 ;
584
552
}
0 commit comments