mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
bcachefs: Ensure journal doesn't get stuck in nochanges mode
This tweaks the journal code to always act as if there's space available in nochanges mode, when we're not going to be doing any writes. This helps in recovering filesystems that won't mount because they need journal replay and the journal has gotten stuck. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
This commit is contained in:
parent
285b181ad4
commit
fae1157d18
@ -446,6 +446,7 @@ static inline int bch2_journal_preres_get_fast(struct journal *j,
|
||||
ret = 0;
|
||||
|
||||
if ((flags & JOURNAL_RES_GET_RESERVED) ||
|
||||
test_bit(JOURNAL_NOCHANGES, &j->flags) ||
|
||||
new.reserved + d < new.remaining) {
|
||||
new.reserved += d;
|
||||
ret = 1;
|
||||
|
@ -1512,7 +1512,7 @@ retry_alloc:
|
||||
|
||||
w->devs_written = bch2_bkey_devs(bkey_i_to_s_c(&w->key));
|
||||
|
||||
if (c->opts.nochanges)
|
||||
if (test_bit(JOURNAL_NOCHANGES, &j->flags))
|
||||
goto no_io;
|
||||
|
||||
for_each_rw_member(ca, c, i)
|
||||
|
@ -34,8 +34,10 @@ unsigned bch2_journal_dev_buckets_available(struct journal *j,
|
||||
struct journal_device *ja,
|
||||
enum journal_space_from from)
|
||||
{
|
||||
unsigned available = (journal_space_from(ja, from) -
|
||||
ja->cur_idx - 1 + ja->nr) % ja->nr;
|
||||
unsigned available = !test_bit(JOURNAL_NOCHANGES, &j->flags)
|
||||
? ((journal_space_from(ja, from) -
|
||||
ja->cur_idx - 1 + ja->nr) % ja->nr)
|
||||
: ja->nr;
|
||||
|
||||
/*
|
||||
* Don't use the last bucket unless writing the new last_seq
|
||||
|
@ -154,6 +154,7 @@ enum {
|
||||
JOURNAL_NEED_WRITE,
|
||||
JOURNAL_MAY_GET_UNRESERVED,
|
||||
JOURNAL_MAY_SKIP_FLUSH,
|
||||
JOURNAL_NOCHANGES,
|
||||
};
|
||||
|
||||
/* Embedded in struct bch_fs */
|
||||
|
@ -801,6 +801,9 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb, struct bch_opts opts)
|
||||
bch2_fs_fsio_init(c))
|
||||
goto err;
|
||||
|
||||
if (c->opts.nochanges)
|
||||
set_bit(JOURNAL_NOCHANGES, &c->journal.flags);
|
||||
|
||||
mi = bch2_sb_get_members(c->disk_sb.sb);
|
||||
for (i = 0; i < c->sb.nr_devices; i++)
|
||||
if (bch2_dev_exists(c->disk_sb.sb, mi, i) &&
|
||||
|
Loading…
Reference in New Issue
Block a user