bcachefs: bch2_request_incompat_feature() now returns error code
For future usage, we'll want a dedicated error code for better debugging. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
@@ -206,6 +206,7 @@
|
||||
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) \
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user