]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sed-opal: refactor (split) IOC_OPAL_LR_SETUP internals.
authorOndrej Kozina <okozina@redhat.com>
Fri, 6 Feb 2026 14:17:59 +0000 (15:17 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 9 Mar 2026 20:29:59 +0000 (14:29 -0600)
IOC_OPAL_LR_SETUP is used to set up a locking range entirely under a
single authority (usually Admin1), but for Single User Mode (SUM),
the permissions for attributes (RangeStart, RangeLength)
and (ReadLockEnable, WriteLockEnable, ReadLocked, WriteLocked)
may be split between two different authorities. Typically, it is Admin1
for the former and the User associated with the LockingRange in SUM
for the latter.

This commit only splits the internals in preparation for the introduction
of separate ioctls for setting RangeStart, RangeLength and the rest
using new ioctl calls.

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

index 5d06f5f433bf920f180ab226972fc9e4c436dea9..7be72f621952c4c80e55e52cbff56232130e9a76 100644 (file)
@@ -1518,7 +1518,7 @@ static inline int enable_global_lr(struct opal_dev *dev, u8 *uid,
        return err;
 }
 
-static int setup_locking_range(struct opal_dev *dev, void *data)
+static int setup_enable_range(struct opal_dev *dev, void *data)
 {
        u8 uid[OPAL_UID_LENGTH];
        struct opal_user_lr_setup *setup = data;
@@ -1532,38 +1532,47 @@ static int setup_locking_range(struct opal_dev *dev, void *data)
 
        if (lr == 0)
                err = enable_global_lr(dev, uid, setup);
-       else {
-               err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
+       else
+               err = generic_lr_enable_disable(dev, uid, !!setup->RLE, !!setup->WLE, 0, 0);
+       if (err) {
+               pr_debug("Failed to create enable lr command.\n");
+               return err;
+       }
 
-               add_token_u8(&err, dev, OPAL_STARTNAME);
-               add_token_u8(&err, dev, OPAL_VALUES);
-               add_token_u8(&err, dev, OPAL_STARTLIST);
+       return finalize_and_send(dev, parse_and_check_status);
+}
 
-               add_token_u8(&err, dev, OPAL_STARTNAME);
-               add_token_u8(&err, dev, OPAL_RANGESTART);
-               add_token_u64(&err, dev, setup->range_start);
-               add_token_u8(&err, dev, OPAL_ENDNAME);
+static int setup_locking_range_start_length(struct opal_dev *dev, void *data)
+{
+       int err;
+       u8 uid[OPAL_UID_LENGTH];
+       struct opal_user_lr_setup *setup = data;
 
-               add_token_u8(&err, dev, OPAL_STARTNAME);
-               add_token_u8(&err, dev, OPAL_RANGELENGTH);
-               add_token_u64(&err, dev, setup->range_length);
-               add_token_u8(&err, dev, OPAL_ENDNAME);
+       err = build_locking_range(uid, sizeof(uid), setup->session.opal_key.lr);
+       if (err)
+               return err;
 
-               add_token_u8(&err, dev, OPAL_STARTNAME);
-               add_token_u8(&err, dev, OPAL_READLOCKENABLED);
-               add_token_u64(&err, dev, !!setup->RLE);
-               add_token_u8(&err, dev, OPAL_ENDNAME);
+       err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
 
-               add_token_u8(&err, dev, OPAL_STARTNAME);
-               add_token_u8(&err, dev, OPAL_WRITELOCKENABLED);
-               add_token_u64(&err, dev, !!setup->WLE);
-               add_token_u8(&err, dev, OPAL_ENDNAME);
+       add_token_u8(&err, dev, OPAL_STARTNAME);
+       add_token_u8(&err, dev, OPAL_VALUES);
+       add_token_u8(&err, dev, OPAL_STARTLIST);
+
+       add_token_u8(&err, dev, OPAL_STARTNAME);
+       add_token_u8(&err, dev, OPAL_RANGESTART);
+       add_token_u64(&err, dev, setup->range_start);
+       add_token_u8(&err, dev, OPAL_ENDNAME);
+
+       add_token_u8(&err, dev, OPAL_STARTNAME);
+       add_token_u8(&err, dev, OPAL_RANGELENGTH);
+       add_token_u64(&err, dev, setup->range_length);
+       add_token_u8(&err, dev, OPAL_ENDNAME);
+
+       add_token_u8(&err, dev, OPAL_ENDLIST);
+       add_token_u8(&err, dev, OPAL_ENDNAME);
 
-               add_token_u8(&err, dev, OPAL_ENDLIST);
-               add_token_u8(&err, dev, OPAL_ENDNAME);
-       }
        if (err) {
-               pr_debug("Error building Setup Locking range command.\n");
+               pr_debug("Error building Setup Locking RangeStartLength command.\n");
                return err;
        }
 
@@ -3058,7 +3067,12 @@ static int opal_setup_locking_range(struct opal_dev *dev,
 {
        const struct opal_step lr_steps[] = {
                { start_auth_opal_session, &opal_lrs->session },
-               { setup_locking_range, opal_lrs },
+               { setup_locking_range_start_length, opal_lrs },
+               { setup_enable_range, opal_lrs },
+               { end_opal_session, }
+       }, lr_global_steps[] = {
+               { start_auth_opal_session, &opal_lrs->session },
+               { setup_enable_range, opal_lrs },
                { end_opal_session, }
        };
        int ret;
@@ -3068,7 +3082,10 @@ static int opal_setup_locking_range(struct opal_dev *dev,
                return ret;
        mutex_lock(&dev->dev_lock);
        setup_opal_dev(dev);
-       ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps));
+       if (opal_lrs->session.opal_key.lr == 0)
+               ret = execute_steps(dev, lr_global_steps, ARRAY_SIZE(lr_global_steps));
+       else
+               ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps));
        mutex_unlock(&dev->dev_lock);
 
        return ret;