Commit 6422bf81 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

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: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent bafd41b4
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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)			\
+3 −2
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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))
+6 −4
Original line number Diff line number Diff line
@@ -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));
+4 −4
Original line number Diff line number Diff line
@@ -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,
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);
}