summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-03-21 03:06:23 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2022-03-21 03:06:23 -0400
commitb2a9318aa86edfe267805890c5ff1511caa59e70 (patch)
treebc15071dde9d9c101c746513c8ea5788f11efe03
parent74148a8ee52526c44752f1773365963f18734ac9 (diff)
Update bcachefs sources to 367a8fad45 bcachefs: Reset journal flush delay to default value if zeroed
-rw-r--r--.bcachefs_revision2
-rw-r--r--libbcachefs/journal_io.c12
-rw-r--r--libbcachefs/opts.c4
-rw-r--r--libbcachefs/super-io.c19
4 files changed, 29 insertions, 8 deletions
diff --git a/.bcachefs_revision b/.bcachefs_revision
index 3072ae81..9f55ecef 100644
--- a/.bcachefs_revision
+++ b/.bcachefs_revision
@@ -1 +1 @@
-0e705f5944069d3ded1d9238f7805dd210e79a25
+367a8fad45924ce9fbe808964d1783c391a11bea
diff --git a/libbcachefs/journal_io.c b/libbcachefs/journal_io.c
index fca9bc47..e61b8893 100644
--- a/libbcachefs/journal_io.c
+++ b/libbcachefs/journal_io.c
@@ -966,8 +966,16 @@ static void bch2_journal_read_device(struct closure *cl)
}
mutex_unlock(&jlist->lock);
- BUG_ON(ja->bucket_seq[ja->cur_idx] &&
- ja->sectors_free == ca->mi.bucket_size);
+ if (ja->bucket_seq[ja->cur_idx] &&
+ ja->sectors_free == ca->mi.bucket_size) {
+ 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 - 1 + i;
+ bch_err(c, "bucket_seq[%u] = %llu", idx, ja->bucket_seq[idx]);
+ }
+ ja->sectors_free = 0;
+ }
/*
* Set dirty_idx to indicate the entire journal is full and needs to be
diff --git a/libbcachefs/opts.c b/libbcachefs/opts.c
index a71054cf..77fbb7d2 100644
--- a/libbcachefs/opts.c
+++ b/libbcachefs/opts.c
@@ -9,10 +9,10 @@
#include "super-io.h"
#include "util.h"
-#define x(t, n) #t,
+#define x(t, n) [n] = #t,
const char * const bch2_metadata_versions[] = {
- BCH_MEMBER_STATES()
+ BCH_METADATA_VERSIONS()
NULL
};
diff --git a/libbcachefs/super-io.c b/libbcachefs/super-io.c
index c917bdda..be61c20b 100644
--- a/libbcachefs/super-io.c
+++ b/libbcachefs/super-io.c
@@ -248,7 +248,8 @@ static int validate_sb_layout(struct bch_sb_layout *layout, struct printbuf *out
return 0;
}
-static int bch2_sb_validate(struct bch_sb_handle *disk_sb, struct printbuf *out)
+static int bch2_sb_validate(struct bch_sb_handle *disk_sb, struct printbuf *out,
+ int rw)
{
struct bch_sb *sb = disk_sb->sb;
struct bch_sb_field *f;
@@ -325,6 +326,18 @@ static int bch2_sb_validate(struct bch_sb_handle *disk_sb, struct printbuf *out)
return -EINVAL;
}
+ if (rw == READ) {
+ /*
+ * Been seeing a bug where these are getting inexplicably
+ * zeroed, so we'r now validating them, but we have to be
+ * careful not to preven people's filesystems from mounting:
+ */
+ if (!BCH_SB_JOURNAL_FLUSH_DELAY(sb))
+ SET_BCH_SB_JOURNAL_FLUSH_DELAY(sb, 1000);
+ if (!BCH_SB_JOURNAL_RECLAIM_DELAY(sb))
+ SET_BCH_SB_JOURNAL_RECLAIM_DELAY(sb, 1000);
+ }
+
for (opt_id = 0; opt_id < bch2_opts_nr; opt_id++) {
const struct bch_option *opt = bch2_opt_table + opt_id;
@@ -691,7 +704,7 @@ got_super:
ret = 0;
sb->have_layout = true;
- ret = bch2_sb_validate(sb, &err);
+ ret = bch2_sb_validate(sb, &err, READ);
if (ret) {
printk(KERN_ERR "bcachefs (%s): error validating superblock: %s",
path, err.buf);
@@ -807,7 +820,7 @@ int bch2_write_super(struct bch_fs *c)
for_each_online_member(ca, c, i) {
printbuf_reset(&err);
- ret = bch2_sb_validate(&ca->disk_sb, &err);
+ ret = bch2_sb_validate(&ca->disk_sb, &err, WRITE);
if (ret) {
bch2_fs_inconsistent(c, "sb invalid before write: %s", err.buf);
percpu_ref_put(&ca->io_ref);