summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/bcachefs/bcachefs.h12
-rw-r--r--fs/bcachefs/dirent.c12
-rw-r--r--fs/bcachefs/errcode.h7
-rw-r--r--fs/bcachefs/fs-io.c2
-rw-r--r--fs/bcachefs/fs.c8
-rw-r--r--fs/bcachefs/inode.c15
-rw-r--r--fs/bcachefs/super.c2
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)) {