]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sed-opal: add IOC_OPAL_ENABLE_DISABLE_LR.
authorOndrej Kozina <okozina@redhat.com>
Fri, 6 Feb 2026 14:18:01 +0000 (15:18 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 9 Mar 2026 20:29:59 +0000 (14:29 -0600)
This ioctl is used to set up RLE (read lock enabled) and WLE (write
lock enabled) parameters of the Locking object.

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.

With the IOC_OPAL_ENABLE_DISABLE_LR ioctl, the opal_user_lr_setup
members 'range_start' and 'range_length' of the ioctl argument are
ignored.

Signed-off-by: Ondrej Kozina <okozina@redhat.com>
Reviewed-and-tested-by: Milan Broz <gmazyland@gmail.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/sed-opal.c
include/linux/sed-opal.h
include/uapi/linux/sed-opal.h

index 55c8a0953d78fa36967114794bfe4999ffd93648..53a73422911e0acb718325f5b544592b74eec750 100644 (file)
@@ -3116,6 +3116,27 @@ static int opal_setup_locking_range_start_length(struct opal_dev *dev,
        return ret;
 }
 
+static int opal_enable_disable_range(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_enable_range, opal_lrs },
+               { end_opal_session, }
+       };
+       int ret;
+
+       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)
@@ -3459,6 +3480,9 @@ int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *arg)
        case IOC_OPAL_LR_SET_START_LEN:
                ret = opal_setup_locking_range_start_length(dev, p);
                break;
+       case IOC_OPAL_ENABLE_DISABLE_LR:
+               ret = opal_enable_disable_range(dev, p);
+               break;
 
        default:
                break;
index a0df6819b0a93c40ee51d80517c90955daedf928..1d63479838cfffea32e6855a65604a2dc1dffae7 100644 (file)
@@ -55,6 +55,7 @@ static inline bool is_sed_ioctl(unsigned int cmd)
        case IOC_OPAL_SET_SID_PW:
        case IOC_OPAL_REACTIVATE_LSP:
        case IOC_OPAL_LR_SET_START_LEN:
+       case IOC_OPAL_ENABLE_DISABLE_LR:
                return true;
        }
        return false;
index 82de38f3fbeb8e216e9a4258badeff2054f0ba88..bde023ae22955fa0a6e3f74f646e7642fd7da617 100644 (file)
@@ -231,5 +231,6 @@ 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)
+#define IOC_OPAL_ENABLE_DISABLE_LR  _IOW('p', 244, struct opal_user_lr_setup)
 
 #endif /* _UAPI_SED_OPAL_H */