Loading fs/bcachefs/journal_io.c +7 −43 Original line number Diff line number Diff line Loading @@ -1089,6 +1089,13 @@ static int journal_read_bucket(struct bch_dev *ca, goto err; } if (le64_to_cpu(j->seq) > ja->highest_seq_found) { ja->highest_seq_found = le64_to_cpu(j->seq); ja->cur_idx = bucket; ja->sectors_free = ca->mi.bucket_size - bucket_remainder(ca, offset) - sectors; } /* * This happens sometimes if we don't have discards on - * when we've partially overwritten a bucket with new Loading Loading @@ -1157,8 +1164,6 @@ static CLOSURE_CALLBACK(bch2_journal_read_device) struct bch_fs *c = ca->fs; struct journal_list *jlist = container_of(cl->parent, struct journal_list, cl); struct journal_replay *r, **_r; struct genradix_iter iter; struct journal_read_buf buf = { NULL, 0 }; unsigned i; int ret = 0; Loading @@ -1178,47 +1183,6 @@ static CLOSURE_CALLBACK(bch2_journal_read_device) goto err; } ja->sectors_free = ca->mi.bucket_size; mutex_lock(&jlist->lock); genradix_for_each_reverse(&c->journal_entries, iter, _r) { r = *_r; if (!r) continue; darray_for_each(r->ptrs, i) if (i->dev == ca->dev_idx) { unsigned wrote = bucket_remainder(ca, i->sector) + vstruct_sectors(&r->j, c->block_bits); ja->cur_idx = i->bucket; ja->sectors_free = ca->mi.bucket_size - wrote; goto found; } } found: mutex_unlock(&jlist->lock); if (ja->bucket_seq[ja->cur_idx] && ja->sectors_free == ca->mi.bucket_size) { #if 0 /* * Debug code for ZNS support, where we (probably) want to be * correlated where we stopped in the journal to the zone write * points: */ bch_err(c, "ja->sectors_free == ca->mi.bucket_size"); bch_err(c, "cur_idx %u/%u", ja->cur_idx, ja->nr); for (i = 0; i < 3; i++) { unsigned idx = (ja->cur_idx + ja->nr - 1 + i) % ja->nr; bch_err(c, "bucket_seq[%u] = %llu", idx, ja->bucket_seq[idx]); } #endif ja->sectors_free = 0; } /* * Set dirty_idx to indicate the entire journal is full and needs to be * reclaimed - journal reclaim will immediately reclaim whatever isn't Loading fs/bcachefs/journal_types.h +1 −0 Original line number Diff line number Diff line Loading @@ -327,6 +327,7 @@ struct journal_device { /* for bch_journal_read_device */ struct closure read; u64 highest_seq_found; }; /* Loading Loading
fs/bcachefs/journal_io.c +7 −43 Original line number Diff line number Diff line Loading @@ -1089,6 +1089,13 @@ static int journal_read_bucket(struct bch_dev *ca, goto err; } if (le64_to_cpu(j->seq) > ja->highest_seq_found) { ja->highest_seq_found = le64_to_cpu(j->seq); ja->cur_idx = bucket; ja->sectors_free = ca->mi.bucket_size - bucket_remainder(ca, offset) - sectors; } /* * This happens sometimes if we don't have discards on - * when we've partially overwritten a bucket with new Loading Loading @@ -1157,8 +1164,6 @@ static CLOSURE_CALLBACK(bch2_journal_read_device) struct bch_fs *c = ca->fs; struct journal_list *jlist = container_of(cl->parent, struct journal_list, cl); struct journal_replay *r, **_r; struct genradix_iter iter; struct journal_read_buf buf = { NULL, 0 }; unsigned i; int ret = 0; Loading @@ -1178,47 +1183,6 @@ static CLOSURE_CALLBACK(bch2_journal_read_device) goto err; } ja->sectors_free = ca->mi.bucket_size; mutex_lock(&jlist->lock); genradix_for_each_reverse(&c->journal_entries, iter, _r) { r = *_r; if (!r) continue; darray_for_each(r->ptrs, i) if (i->dev == ca->dev_idx) { unsigned wrote = bucket_remainder(ca, i->sector) + vstruct_sectors(&r->j, c->block_bits); ja->cur_idx = i->bucket; ja->sectors_free = ca->mi.bucket_size - wrote; goto found; } } found: mutex_unlock(&jlist->lock); if (ja->bucket_seq[ja->cur_idx] && ja->sectors_free == ca->mi.bucket_size) { #if 0 /* * Debug code for ZNS support, where we (probably) want to be * correlated where we stopped in the journal to the zone write * points: */ bch_err(c, "ja->sectors_free == ca->mi.bucket_size"); bch_err(c, "cur_idx %u/%u", ja->cur_idx, ja->nr); for (i = 0; i < 3; i++) { unsigned idx = (ja->cur_idx + ja->nr - 1 + i) % ja->nr; bch_err(c, "bucket_seq[%u] = %llu", idx, ja->bucket_seq[idx]); } #endif ja->sectors_free = 0; } /* * Set dirty_idx to indicate the entire journal is full and needs to be * reclaimed - journal reclaim will immediately reclaim whatever isn't Loading
fs/bcachefs/journal_types.h +1 −0 Original line number Diff line number Diff line Loading @@ -327,6 +327,7 @@ struct journal_device { /* for bch_journal_read_device */ struct closure read; u64 highest_seq_found; }; /* Loading