Skip to content

Commit 95ffc7f

Browse files
author
Kent Overstreet
committed
bcachefs: journal_keys now uses darray helpers
nice bit of code cleanup Signed-off-by: Kent Overstreet <[email protected]>
1 parent 894d062 commit 95ffc7f

File tree

2 files changed

+25
-61
lines changed

2 files changed

+25
-61
lines changed

fs/bcachefs/btree_journal_iter.c

Lines changed: 23 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,6 @@ static int journal_sort_key_cmp(const void *_l, const void *_r)
467467
void bch2_journal_keys_put(struct bch_fs *c)
468468
{
469469
struct journal_keys *keys = &c->journal_keys;
470-
struct journal_key *i;
471470

472471
BUG_ON(atomic_read(&keys->ref) <= 0);
473472

@@ -477,7 +476,7 @@ void bch2_journal_keys_put(struct bch_fs *c)
477476
move_gap(keys->data, keys->nr, keys->size, keys->gap, keys->nr);
478477
keys->gap = keys->nr;
479478

480-
for (i = keys->data; i < keys->data + keys->nr; i++)
479+
darray_for_each(*keys, i)
481480
if (i->allocated)
482481
kfree(i->k);
483482

@@ -490,17 +489,16 @@ void bch2_journal_keys_put(struct bch_fs *c)
490489

491490
static void __journal_keys_sort(struct journal_keys *keys)
492491
{
493-
struct journal_key *src, *dst;
494-
495492
sort(keys->data, keys->nr, sizeof(keys->data[0]), journal_sort_key_cmp, NULL);
496493

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;
502500

503-
*dst++ = *src++;
501+
*dst++ = *src;
504502
}
505503

506504
keys->nr = dst - keys->data;
@@ -511,39 +509,7 @@ int bch2_journal_keys_sort(struct bch_fs *c)
511509
struct genradix_iter iter;
512510
struct journal_replay *i, **_i;
513511
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;
547513

548514
genradix_for_each(&c->journal_entries, iter, _i) {
549515
i = *_i;
@@ -554,31 +520,33 @@ int bch2_journal_keys_sort(struct bch_fs *c)
554520
cond_resched();
555521

556522
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) {
568524
.btree_id = entry->btree_id,
569525
.level = entry->level,
570526
.k = k,
571527
.journal_seq = le64_to_cpu(i->j.seq),
572528
.journal_offset = k->_data - i->j._data,
573529
};
574530

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+
575543
nr_read++;
576544
}
577545
}
578546

579547
__journal_keys_sort(keys);
580548
keys->gap = keys->nr;
581549

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);
583551
return 0;
584552
}

fs/bcachefs/recovery.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,7 @@ static void drop_alloc_keys(struct journal_keys *keys)
7070
*/
7171
static void zero_out_btree_mem_ptr(struct journal_keys *keys)
7272
{
73-
struct journal_key *i;
74-
75-
for (i = keys->data; i < keys->data + keys->nr; i++)
73+
darray_for_each(*keys, i)
7674
if (i->k->k.type == KEY_TYPE_btree_ptr_v2)
7775
bkey_i_to_btree_ptr_v2(i->k)->v.mem_ptr = 0;
7876
}
@@ -177,11 +175,9 @@ static int bch2_journal_replay(struct bch_fs *c)
177175
* efficient - better locality of btree access - but some might fail if
178176
* that would cause a journal deadlock.
179177
*/
180-
for (size_t i = 0; i < keys->nr; i++) {
178+
darray_for_each(*keys, k) {
181179
cond_resched();
182180

183-
struct journal_key *k = keys->data + i;
184-
185181
/* Skip fastpath if we're low on space in the journal */
186182
ret = c->journal.watermark ? -1 :
187183
commit_do(trans, NULL, NULL,

0 commit comments

Comments
 (0)