Commit 8d7b7ac3 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: Device state is now a runtime option



Other options can normally be set at runtime via sysfs, no reason for
this one not to be as well - it just doesn't support the degraded flags
argument this way, that requires the ioctl.

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 7b84d934
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -482,9 +482,16 @@ void bch2_opts_to_text(struct printbuf *out,

int bch2_opt_check_may_set(struct bch_fs *c, struct bch_dev *ca, int id, u64 v)
{
	lockdep_assert_held(&c->state_lock);

	int ret = 0;

	switch (id) {
	case Opt_state:
		if (ca)
			return __bch2_dev_set_state(c, ca, v, BCH_FORCE_IF_DEGRADED);
		break;

	case Opt_compression:
	case Opt_background_compression:
		ret = bch2_check_set_has_compressed_data(c, v);
+1 −1
Original line number Diff line number Diff line
@@ -495,7 +495,7 @@ enum fsck_err_opts {
	  NULL,		"Skip submit_bio() for data reads and writes, "	\
			"for performance testing purposes")		\
	x(state,			u64,				\
	  OPT_DEVICE,							\
	  OPT_DEVICE|OPT_RUNTIME,					\
	  OPT_STR(bch2_member_states),					\
	  BCH_MEMBER_STATE,		BCH_MEMBER_STATE_rw,		\
	  "state",	"rw,ro,failed,spare")				\
+3 −0
Original line number Diff line number Diff line
@@ -631,6 +631,8 @@ static ssize_t sysfs_opt_store(struct bch_fs *c,
	if (unlikely(!bch2_write_ref_tryget(c, BCH_WRITE_REF_sysfs)))
		return -EROFS;

	down_write(&c->state_lock);

	char *tmp = kstrdup(buf, GFP_KERNEL);
	if (!tmp) {
		ret = -ENOMEM;
@@ -664,6 +666,7 @@ static ssize_t sysfs_opt_store(struct bch_fs *c,

	ret = size;
err:
	up_write(&c->state_lock);
	bch2_write_ref_put(c, BCH_WRITE_REF_sysfs);
	return ret;
}