diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/bcachefs/bcachefs_format.h | 3 | ||||
-rw-r--r-- | fs/bcachefs/opts.c | 15 | ||||
-rw-r--r-- | fs/bcachefs/opts.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/super-io.c | 4 | ||||
-rw-r--r-- | fs/bcachefs/sysfs.c | 12 | ||||
-rw-r--r-- | fs/bcachefs/xattr.c | 10 |
6 files changed, 28 insertions, 17 deletions
diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h index d74f1e5c21e0..eb14fcf15a96 100644 --- a/fs/bcachefs/bcachefs_format.h +++ b/fs/bcachefs/bcachefs_format.h @@ -1234,7 +1234,8 @@ enum bch_sb_features { BCH_FEATURE_LZ4 = 0, BCH_FEATURE_GZIP = 1, BCH_FEATURE_ZSTD = 2, - BCH_FEATURE_ATOMIC_NLINK = 3, + BCH_FEATURE_ATOMIC_NLINK = 3, /* should have gone under compat */ + BCH_FEATURE_NR, }; /* options: */ diff --git a/fs/bcachefs/opts.c b/fs/bcachefs/opts.c index c12af1a86f0b..74e92a196ccd 100644 --- a/fs/bcachefs/opts.c +++ b/fs/bcachefs/opts.c @@ -3,6 +3,7 @@ #include <linux/kernel.h> #include "bcachefs.h" +#include "compress.h" #include "disk_groups.h" #include "opts.h" #include "super-io.h" @@ -269,6 +270,20 @@ void bch2_opt_to_text(struct printbuf *out, struct bch_fs *c, } } +int bch2_opt_check_may_set(struct bch_fs *c, int id, u64 v) +{ + int ret = 0; + + switch (id) { + case Opt_compression: + case Opt_background_compression: + ret = bch2_check_set_has_compressed_data(c, v); + break; + } + + return ret; +} + int bch2_parse_mount_opts(struct bch_opts *opts, char *options) { char *opt, *name, *val; diff --git a/fs/bcachefs/opts.h b/fs/bcachefs/opts.h index 47617cd011ff..8f4fab7f7dc8 100644 --- a/fs/bcachefs/opts.h +++ b/fs/bcachefs/opts.h @@ -269,6 +269,7 @@ int bch2_opt_parse(struct bch_fs *, const struct bch_option *, const char *, u64 void bch2_opt_to_text(struct printbuf *, struct bch_fs *, const struct bch_option *, u64, unsigned); +int bch2_opt_check_may_set(struct bch_fs *, int, u64); int bch2_parse_mount_opts(struct bch_opts *, char *); /* inode opts: */ diff --git a/fs/bcachefs/super-io.c b/fs/bcachefs/super-io.c index 0c2b20c9e8c4..22e28d1eeadc 100644 --- a/fs/bcachefs/super-io.c +++ b/fs/bcachefs/super-io.c @@ -230,6 +230,10 @@ const char *bch2_sb_validate(struct bch_sb_handle *disk_sb) le16_to_cpu(sb->version) > BCH_SB_VERSION_MAX) return "Unsupported superblock version"; + if (sb->features[1] || + (le64_to_cpu(sb->features[0]) & (~0ULL << BCH_FEATURE_NR))) + return "Filesystem has incompatible features"; + if (le16_to_cpu(sb->version) < BCH_SB_VERSION_EXTENT_MAX) { SET_BCH_SB_ENCODED_EXTENT_MAX_BITS(sb, 7); SET_BCH_SB_POSIX_ACL(sb, 1); diff --git a/fs/bcachefs/sysfs.c b/fs/bcachefs/sysfs.c index 4ca84de6ab0e..4273aad16675 100644 --- a/fs/bcachefs/sysfs.c +++ b/fs/bcachefs/sysfs.c @@ -10,7 +10,6 @@ #include "bcachefs.h" #include "alloc_background.h" -#include "compress.h" #include "sysfs.h" #include "btree_cache.h" #include "btree_io.h" @@ -581,14 +580,9 @@ STORE(bch2_fs_opts_dir) if (ret < 0) return ret; - if (id == Opt_compression || - id == Opt_background_compression) { - int ret = bch2_check_set_has_compressed_data(c, v); - if (ret) { - mutex_unlock(&c->sb_lock); - return ret; - } - } + ret = bch2_opt_check_may_set(c, id, v); + if (ret < 0) + return ret; if (opt->set_sb != SET_NO_SB_OPT) { mutex_lock(&c->sb_lock); diff --git a/fs/bcachefs/xattr.c b/fs/bcachefs/xattr.c index 7f6258e09a0d..ab358c434753 100644 --- a/fs/bcachefs/xattr.c +++ b/fs/bcachefs/xattr.c @@ -3,7 +3,6 @@ #include "bcachefs.h" #include "bkey_methods.h" #include "btree_update.h" -#include "compress.h" #include "extents.h" #include "fs.h" #include "rebalance.h" @@ -433,12 +432,9 @@ static int bch2_xattr_bcachefs_set(const struct xattr_handler *handler, if (ret < 0) return ret; - if (s.id == Opt_compression || - s.id == Opt_background_compression) { - ret = bch2_check_set_has_compressed_data(c, s.v); - if (ret) - return ret; - } + ret = bch2_opt_check_may_set(c, s.id, s.v); + if (ret < 0) + return ret; s.defined = true; } else { |