]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bcachefs: bch2_request_incompat_feature() now returns error code
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 28 Feb 2025 23:59:58 +0000 (18:59 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 15 Mar 2025 01:02:15 +0000 (21:02 -0400)
For future usage, we'll want a dedicated error code for better
debugging.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/errcode.h
fs/bcachefs/fs-ioctl.c
fs/bcachefs/reflink.c
fs/bcachefs/super-io.c
fs/bcachefs/super-io.h

index 20bfdee42309d92ae5cee080bf3c42f85ed141e9..9e19bc37aa72cc215055a81d894e621c6543d2f3 100644 (file)
        x(EINVAL,                       no_resize_with_buckets_nouse)           \
        x(EINVAL,                       inode_unpack_error)                     \
        x(EINVAL,                       varint_decode_error)                    \
+       x(EOPNOTSUPP,                   may_not_use_incompat_feature)           \
        x(EROFS,                        erofs_trans_commit)                     \
        x(EROFS,                        erofs_no_writes)                        \
        x(EROFS,                        erofs_journal_err)                      \
index 4465a2a821e37edebf2b04cb6de4e110d688cc72..17c035f9d629178032c391bfec6ebaf4788de8c7 100644 (file)
@@ -69,8 +69,9 @@ static int bch2_inode_flags_set(struct btree_trans *trans,
                if (ret < 0)
                        return ret;
 
-               if (!bch2_request_incompat_feature(c,bcachefs_metadata_version_casefolding))
-                       return -EOPNOTSUPP;
+               ret = bch2_request_incompat_feature(c,bcachefs_metadata_version_casefolding);
+               if (ret)
+                       return ret;
 
                bch2_check_set_feature(c, BCH_FEATURE_casefolding);
 #else
index 50118661e64bfc5115dd617ca1de5b6c60004946..68172c6eba211153fded8cea8e33b6a34b84e751 100644 (file)
@@ -606,7 +606,7 @@ s64 bch2_remap_range(struct bch_fs *c,
        u64 dst_done = 0;
        u32 dst_snapshot, src_snapshot;
        bool reflink_p_may_update_opts_field =
-               bch2_request_incompat_feature(c, bcachefs_metadata_version_reflink_p_may_update_opts);
+               !bch2_request_incompat_feature(c, bcachefs_metadata_version_reflink_p_may_update_opts);
        int ret = 0, ret2 = 0;
 
        if (!bch2_write_ref_tryget(c, BCH_WRITE_REF_reflink))
index 7e726b3dc6f4c1c92e301b471991a9ca604031d8..7bd2d3d842956404bec7264e40f0020f8c1d3749 100644 (file)
@@ -69,12 +69,14 @@ enum bcachefs_metadata_version bch2_latest_compatible_version(enum bcachefs_meta
        return v;
 }
 
-bool bch2_set_version_incompat(struct bch_fs *c, enum bcachefs_metadata_version version)
+int bch2_set_version_incompat(struct bch_fs *c, enum bcachefs_metadata_version version)
 {
-       bool ret = (c->sb.features & BIT_ULL(BCH_FEATURE_incompat_version_field)) &&
-                  version <= c->sb.version_incompat_allowed;
+       int ret = ((c->sb.features & BIT_ULL(BCH_FEATURE_incompat_version_field)) &&
+                  version <= c->sb.version_incompat_allowed)
+               ? 0
+               : -BCH_ERR_may_not_use_incompat_feature;
 
-       if (ret) {
+       if (!ret) {
                mutex_lock(&c->sb_lock);
                SET_BCH_SB_VERSION_INCOMPAT(c->disk_sb.sb,
                        max(BCH_SB_VERSION_INCOMPAT(c->disk_sb.sb), version));
index b4cff9ebdebbf03d2d25c834b3b5ef7b06818fb0..167dd98f893e862a62c54e4c0e165670a538c9a0 100644 (file)
@@ -21,13 +21,13 @@ static inline bool bch2_version_compatible(u16 version)
 void bch2_version_to_text(struct printbuf *, enum bcachefs_metadata_version);
 enum bcachefs_metadata_version bch2_latest_compatible_version(enum bcachefs_metadata_version);
 
-bool bch2_set_version_incompat(struct bch_fs *, enum bcachefs_metadata_version);
+int bch2_set_version_incompat(struct bch_fs *, enum bcachefs_metadata_version);
 
-static inline bool bch2_request_incompat_feature(struct bch_fs *c,
-                                                enum bcachefs_metadata_version version)
+static inline int bch2_request_incompat_feature(struct bch_fs *c,
+                                               enum bcachefs_metadata_version version)
 {
        return likely(version <= c->sb.version_incompat)
-               ? true
+               ? 0
                : bch2_set_version_incompat(c, version);
 }