diff options
-rw-r--r-- | fs/bcachefs/bcachefs.h | 12 | ||||
-rw-r--r-- | fs/bcachefs/dirent.c | 12 | ||||
-rw-r--r-- | fs/bcachefs/errcode.h | 7 | ||||
-rw-r--r-- | fs/bcachefs/fs-io.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/fs.c | 8 | ||||
-rw-r--r-- | fs/bcachefs/inode.c | 15 | ||||
-rw-r--r-- | fs/bcachefs/super.c | 2 |
7 files changed, 32 insertions, 26 deletions
diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h index f4edbe2a14fd..004044e105ea 100644 --- a/fs/bcachefs/bcachefs.h +++ b/fs/bcachefs/bcachefs.h @@ -1283,13 +1283,13 @@ static inline bool bch2_discard_opt_enabled(struct bch_fs *c, struct bch_dev *ca : ca->mi.discard; } -static inline bool bch2_fs_casefold_enabled(struct bch_fs *c) +static inline int bch2_fs_casefold_enabled(struct bch_fs *c) { -#if IS_ENABLED(CONFIG_UNICODE) - return !c->opts.casefold_disabled; -#else - return false; -#endif + if (!IS_ENABLED(CONFIG_UNICODE)) + return bch_err_throw(c, no_casefolding_without_utf8); + if (!c->opts.casefold_disabled) + return bch_err_throw(c, casefolding_disabled); + return 0; } #endif /* _BCACHEFS_H */ diff --git a/fs/bcachefs/dirent.c b/fs/bcachefs/dirent.c index a18d0f78704d..ccbb0127b724 100644 --- a/fs/bcachefs/dirent.c +++ b/fs/bcachefs/dirent.c @@ -18,11 +18,12 @@ int bch2_casefold(struct btree_trans *trans, const struct bch_hash_info *info, { *out_cf = (struct qstr) QSTR_INIT(NULL, 0); - if (!bch2_fs_casefold_enabled(trans->c)) - return -EOPNOTSUPP; + int ret = bch2_fs_casefold_enabled(trans->c); + if (ret) + return ret; unsigned char *buf = bch2_trans_kmalloc(trans, BCH_NAME_MAX + 1); - int ret = PTR_ERR_OR_ZERO(buf); + ret = PTR_ERR_OR_ZERO(buf); if (ret) return ret; @@ -251,8 +252,9 @@ int bch2_dirent_init_name(struct bch_fs *c, offsetof(struct bch_dirent, d_name) - name->len); } else { - if (!bch2_fs_casefold_enabled(c)) - return -EOPNOTSUPP; + int ret = bch2_fs_casefold_enabled(c); + if (ret) + return ret; memcpy(&dirent->v.d_cf_name_block.d_names[0], name->name, name->len); diff --git a/fs/bcachefs/errcode.h b/fs/bcachefs/errcode.h index 86a842f1e88e..d27b94a6610a 100644 --- a/fs/bcachefs/errcode.h +++ b/fs/bcachefs/errcode.h @@ -5,6 +5,7 @@ #define BCH_ERRCODES() \ x(ERANGE, ERANGE_option_too_small) \ x(ERANGE, ERANGE_option_too_big) \ + x(ERANGE, projid_too_big) \ x(EINVAL, injected) \ x(BCH_ERR_injected, injected_fs_start) \ x(EINVAL, mount_option) \ @@ -216,6 +217,12 @@ x(EINVAL, erasure_coding_found_btree_node) \ x(EINVAL, option_negative) \ x(EOPNOTSUPP, may_not_use_incompat_feature) \ + x(EOPNOTSUPP, no_casefolding_without_utf8) \ + x(EOPNOTSUPP, casefolding_disabled) \ + x(EOPNOTSUPP, casefold_opt_is_dir_only) \ + x(EOPNOTSUPP, unsupported_fsx_flag) \ + x(EOPNOTSUPP, unsupported_fa_flag) \ + x(EOPNOTSUPP, unsupported_fallocate_mode) \ x(EROFS, erofs_trans_commit) \ x(EROFS, erofs_no_writes) \ x(EROFS, erofs_journal_err) \ diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c index a233f45875e9..dc5f713e209c 100644 --- a/fs/bcachefs/fs-io.c +++ b/fs/bcachefs/fs-io.c @@ -841,7 +841,7 @@ long bch2_fallocate_dispatch(struct file *file, int mode, else if (mode == FALLOC_FL_COLLAPSE_RANGE) ret = bchfs_fcollapse_finsert(inode, offset, len, false); else - ret = -EOPNOTSUPP; + ret = bch_err_throw(c, unsupported_fallocate_mode); err: bch2_pagecache_block_put(inode); inode_unlock(&inode->v); diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c index cd8347063e80..f9bc99eb2d02 100644 --- a/fs/bcachefs/fs.c +++ b/fs/bcachefs/fs.c @@ -1693,10 +1693,10 @@ static int bch2_fileattr_set(struct mnt_idmap *idmap, s.mask = map_defined(bch_flags_to_xflags); s.flags |= map_flags_rev(bch_flags_to_xflags, fa->fsx_xflags); if (fa->fsx_xflags) - return -EOPNOTSUPP; + return bch_err_throw(c, unsupported_fsx_flag); if (fa->fsx_projid >= U32_MAX) - return -EINVAL; + return bch_err_throw(c, projid_too_big); /* * inode fields accessible via the xattr interface are stored with a +1 @@ -1719,7 +1719,7 @@ static int bch2_fileattr_set(struct mnt_idmap *idmap, s.flags |= map_flags_rev(bch_flags_to_uflags, fa->flags); if (fa->flags) - return -EOPNOTSUPP; + return bch_err_throw(c, unsupported_fa_flag); } mutex_lock(&inode->ei_update_lock); @@ -2564,7 +2564,7 @@ got_sb: sb->s_shrink->seeks = 0; #if IS_ENABLED(CONFIG_UNICODE) - if (bch2_fs_casefold_enabled(c)) + if (!bch2_fs_casefold_enabled(c)) sb->s_encoding = c->cf_encoding; generic_set_sb_d_ops(sb); #endif diff --git a/fs/bcachefs/inode.c b/fs/bcachefs/inode.c index 6e08c7a26f4d..99cd2a47f853 100644 --- a/fs/bcachefs/inode.c +++ b/fs/bcachefs/inode.c @@ -1265,18 +1265,15 @@ int bch2_inode_set_casefold(struct btree_trans *trans, subvol_inum inum, { struct bch_fs *c = trans->c; -#if !IS_ENABLED(CONFIG_UNICODE) - bch_err(c, "Cannot use casefolding on a kernel without CONFIG_UNICODE"); - return -EOPNOTSUPP; -#endif - - if (c->opts.casefold_disabled) - return -EOPNOTSUPP; + int ret = bch2_fs_casefold_enabled(c); + if (ret) { + bch_err_ratelimited(c, "Cannot enable casefolding: %s", bch2_err_str(ret)); + return ret; + } - int ret = 0; /* Not supported on individual files. */ if (!S_ISDIR(bi->bi_mode)) - return -EOPNOTSUPP; + return bch_err_throw(c, casefold_opt_is_dir_only); /* * Make sure the dir is empty, as otherwise we'd need to diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c index 5e90f64bd5f4..6980cd5b0ca8 100644 --- a/fs/bcachefs/super.c +++ b/fs/bcachefs/super.c @@ -1025,7 +1025,7 @@ static struct bch_fs *bch2_fs_alloc(struct bch_sb *sb, struct bch_opts *opts, } #if IS_ENABLED(CONFIG_UNICODE) - if (bch2_fs_casefold_enabled(c)) { + if (!bch2_fs_casefold_enabled(c)) { /* Default encoding until we can potentially have more as an option. */ c->cf_encoding = utf8_load(BCH_FS_DEFAULT_UTF8_ENCODING); if (IS_ERR(c->cf_encoding)) { |