Commit 8e3d34a7 authored by Ondrej Kozina's avatar Ondrej Kozina Committed by Jens Axboe
Browse files

sed-opal: add IOC_OPAL_LR_SET_START_LEN ioctl.



This ioctl is used to set up locking range start (offset)
and locking range length attributes only.

In Single User Mode (SUM), if the RangeStartRangeLengthPolicy parameter
is set in the 'Reactivate' method, only Admin authority maintains the
locking range length and start (offset) attributes of Locking objects
set up for SUM. All other attributes from struct opal_user_lr_setup
(RLE - read locking enabled, WLE - write locking enabled) shall
remain in possession of the User authority associated with the Locking
object set for SUM.

Therefore, we need a separate function for setting up locking range
start and locking range length because it may require two different
authorities (and sessions) if the RangeStartRangeLengthPolicy attribute
is set.

With the IOC_OPAL_LR_SET_START_LEN ioctl, the opal_user_lr_setup
members 'RLE' and 'WLE' of the ioctl argument are ignored.

Signed-off-by: default avatarOndrej Kozina <okozina@redhat.com>
Reviewed-and-tested-by: default avatarMilan Broz <gmazyland@gmail.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 8ff71e6b
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -3091,6 +3091,31 @@ static int opal_setup_locking_range(struct opal_dev *dev,
	return ret;
}

static int opal_setup_locking_range_start_length(struct opal_dev *dev,
				    struct opal_user_lr_setup *opal_lrs)
{
	const struct opal_step lr_steps[] = {
		{ start_auth_opal_session, &opal_lrs->session },
		{ setup_locking_range_start_length, opal_lrs },
		{ end_opal_session, }
	};
	int ret;

	/* we can not set global locking range offset or length */
	if (opal_lrs->session.opal_key.lr == 0)
		return -EINVAL;

	ret = opal_get_key(dev, &opal_lrs->session.opal_key);
	if (ret)
		return ret;
	mutex_lock(&dev->dev_lock);
	setup_opal_dev(dev);
	ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps));
	mutex_unlock(&dev->dev_lock);

	return ret;
}

static int opal_locking_range_status(struct opal_dev *dev,
			  struct opal_lr_status *opal_lrst,
			  void __user *data)
@@ -3431,6 +3456,9 @@ int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *arg)
	case IOC_OPAL_REACTIVATE_LSP:
		ret = opal_reactivate_lsp(dev, p);
		break;
	case IOC_OPAL_LR_SET_START_LEN:
		ret = opal_setup_locking_range_start_length(dev, p);
		break;

	default:
		break;
+1 −0
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ static inline bool is_sed_ioctl(unsigned int cmd)
	case IOC_OPAL_REVERT_LSP:
	case IOC_OPAL_SET_SID_PW:
	case IOC_OPAL_REACTIVATE_LSP:
	case IOC_OPAL_LR_SET_START_LEN:
		return true;
	}
	return false;
+1 −0
Original line number Diff line number Diff line
@@ -230,5 +230,6 @@ struct opal_revert_lsp {
#define IOC_OPAL_REVERT_LSP         _IOW('p', 240, struct opal_revert_lsp)
#define IOC_OPAL_SET_SID_PW         _IOW('p', 241, struct opal_new_pw)
#define IOC_OPAL_REACTIVATE_LSP     _IOW('p', 242, struct opal_lr_react)
#define IOC_OPAL_LR_SET_START_LEN   _IOW('p', 243, struct opal_user_lr_setup)

#endif /* _UAPI_SED_OPAL_H */