]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Reset journal flush delay to default value if zeroed
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 21 Mar 2022 07:03:03 +0000 (03:03 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:28 +0000 (17:09 -0400)
We've been seeing a very strange bug where journal flush & reclaim delay
end up getting inexplicably zeroed, in the superblock. We're now
validating all the options in bch2_validate_super(), and 0 is no longer
a valid value for those options, but we need to be careful not to
prevent people's filesystems from mounting because of the new
validation.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/super-io.c

index 224653f129f8554591358e25584877bbccd1b125..6d54319a95e67d37a445b57de573cbcad8e3a346 100644 (file)
@@ -253,7 +253,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;
@@ -330,6 +331,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;
 
@@ -696,7 +709,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);
@@ -808,7 +821,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);