Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

sed-opal: refactor (split) IOC_OPAL_LR_SETUP internals.

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>

authored by

Ondrej Kozina and committed by
Jens Axboe
8ff71e6b aca086ff

+51 -34
+51 -34
block/sed-opal.c
··· 1518 1518 return err; 1519 1519 } 1520 1520 1521 - static int setup_locking_range(struct opal_dev *dev, void *data) 1521 + static int setup_enable_range(struct opal_dev *dev, void *data) 1522 1522 { 1523 1523 u8 uid[OPAL_UID_LENGTH]; 1524 1524 struct opal_user_lr_setup *setup = data; ··· 1532 1532 1533 1533 if (lr == 0) 1534 1534 err = enable_global_lr(dev, uid, setup); 1535 - else { 1536 - err = cmd_start(dev, uid, opalmethod[OPAL_SET]); 1537 - 1538 - add_token_u8(&err, dev, OPAL_STARTNAME); 1539 - add_token_u8(&err, dev, OPAL_VALUES); 1540 - add_token_u8(&err, dev, OPAL_STARTLIST); 1541 - 1542 - add_token_u8(&err, dev, OPAL_STARTNAME); 1543 - add_token_u8(&err, dev, OPAL_RANGESTART); 1544 - add_token_u64(&err, dev, setup->range_start); 1545 - add_token_u8(&err, dev, OPAL_ENDNAME); 1546 - 1547 - add_token_u8(&err, dev, OPAL_STARTNAME); 1548 - add_token_u8(&err, dev, OPAL_RANGELENGTH); 1549 - add_token_u64(&err, dev, setup->range_length); 1550 - add_token_u8(&err, dev, OPAL_ENDNAME); 1551 - 1552 - add_token_u8(&err, dev, OPAL_STARTNAME); 1553 - add_token_u8(&err, dev, OPAL_READLOCKENABLED); 1554 - add_token_u64(&err, dev, !!setup->RLE); 1555 - add_token_u8(&err, dev, OPAL_ENDNAME); 1556 - 1557 - add_token_u8(&err, dev, OPAL_STARTNAME); 1558 - add_token_u8(&err, dev, OPAL_WRITELOCKENABLED); 1559 - add_token_u64(&err, dev, !!setup->WLE); 1560 - add_token_u8(&err, dev, OPAL_ENDNAME); 1561 - 1562 - add_token_u8(&err, dev, OPAL_ENDLIST); 1563 - add_token_u8(&err, dev, OPAL_ENDNAME); 1564 - } 1535 + else 1536 + err = generic_lr_enable_disable(dev, uid, !!setup->RLE, !!setup->WLE, 0, 0); 1565 1537 if (err) { 1566 - pr_debug("Error building Setup Locking range command.\n"); 1538 + pr_debug("Failed to create enable lr command.\n"); 1539 + return err; 1540 + } 1541 + 1542 + return finalize_and_send(dev, parse_and_check_status); 1543 + } 1544 + 1545 + static int setup_locking_range_start_length(struct opal_dev *dev, void *data) 1546 + { 1547 + int err; 1548 + u8 uid[OPAL_UID_LENGTH]; 1549 + struct opal_user_lr_setup *setup = data; 1550 + 1551 + err = build_locking_range(uid, sizeof(uid), setup->session.opal_key.lr); 1552 + if (err) 1553 + return err; 1554 + 1555 + err = cmd_start(dev, uid, opalmethod[OPAL_SET]); 1556 + 1557 + add_token_u8(&err, dev, OPAL_STARTNAME); 1558 + add_token_u8(&err, dev, OPAL_VALUES); 1559 + add_token_u8(&err, dev, OPAL_STARTLIST); 1560 + 1561 + add_token_u8(&err, dev, OPAL_STARTNAME); 1562 + add_token_u8(&err, dev, OPAL_RANGESTART); 1563 + add_token_u64(&err, dev, setup->range_start); 1564 + add_token_u8(&err, dev, OPAL_ENDNAME); 1565 + 1566 + add_token_u8(&err, dev, OPAL_STARTNAME); 1567 + add_token_u8(&err, dev, OPAL_RANGELENGTH); 1568 + add_token_u64(&err, dev, setup->range_length); 1569 + add_token_u8(&err, dev, OPAL_ENDNAME); 1570 + 1571 + add_token_u8(&err, dev, OPAL_ENDLIST); 1572 + add_token_u8(&err, dev, OPAL_ENDNAME); 1573 + 1574 + if (err) { 1575 + pr_debug("Error building Setup Locking RangeStartLength command.\n"); 1567 1576 return err; 1568 1577 } 1569 1578 ··· 3067 3058 { 3068 3059 const struct opal_step lr_steps[] = { 3069 3060 { start_auth_opal_session, &opal_lrs->session }, 3070 - { setup_locking_range, opal_lrs }, 3061 + { setup_locking_range_start_length, opal_lrs }, 3062 + { setup_enable_range, opal_lrs }, 3063 + { end_opal_session, } 3064 + }, lr_global_steps[] = { 3065 + { start_auth_opal_session, &opal_lrs->session }, 3066 + { setup_enable_range, opal_lrs }, 3071 3067 { end_opal_session, } 3072 3068 }; 3073 3069 int ret; ··· 3082 3068 return ret; 3083 3069 mutex_lock(&dev->dev_lock); 3084 3070 setup_opal_dev(dev); 3085 - ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps)); 3071 + if (opal_lrs->session.opal_key.lr == 0) 3072 + ret = execute_steps(dev, lr_global_steps, ARRAY_SIZE(lr_global_steps)); 3073 + else 3074 + ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps)); 3086 3075 mutex_unlock(&dev->dev_lock); 3087 3076 3088 3077 return ret;