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: add IOC_OPAL_REACTIVATE_LSP.

This adds the 'Reactivate' method as described in the
"TCG Storage Opal SSC Feature Set: Single User Mode"
document (ch. 3.1.1.1).

The method enables switching an already active SED OPAL2 device,
with appropriate firmware support for Single User Mode (SUM),
to or from SUM.

Signed-off-by: Ondrej Kozina <okozina@redhat.com>
Reviewed-and-tested-by: Milan Broz <gmazyland@gmail.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>

authored by

Ondrej Kozina and committed by
Jens Axboe
aca086ff c6c9dc91

+115
+1
block/opal_proto.h
··· 155 155 OPAL_AUTHENTICATE, 156 156 OPAL_RANDOM, 157 157 OPAL_ERASE, 158 + OPAL_REACTIVATE, 158 159 }; 159 160 160 161 enum opal_token {
+99
block/sed-opal.c
··· 220 220 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x01 }, 221 221 [OPAL_ERASE] = 222 222 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x03 }, 223 + [OPAL_REACTIVATE] = 224 + { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x01 }, 223 225 }; 224 226 225 227 static int end_opal_session_error(struct opal_dev *dev); ··· 2289 2287 return finalize_and_send(dev, parse_and_check_status); 2290 2288 } 2291 2289 2290 + static int reactivate_lsp(struct opal_dev *dev, void *data) 2291 + { 2292 + struct opal_lr_react *opal_react = data; 2293 + u8 user_lr[OPAL_UID_LENGTH]; 2294 + int err, i; 2295 + 2296 + err = cmd_start(dev, opaluid[OPAL_THISSP_UID], 2297 + opalmethod[OPAL_REACTIVATE]); 2298 + 2299 + if (err) { 2300 + pr_debug("Error building Reactivate LockingSP command.\n"); 2301 + return err; 2302 + } 2303 + 2304 + /* 2305 + * If neither 'entire_table' nor 'num_lrs' is set, the device 2306 + * gets reactivated with SUM disabled. Only Admin1PIN will change 2307 + * if set. 2308 + */ 2309 + if (opal_react->entire_table) { 2310 + /* Entire Locking table (all locking ranges) will be put in SUM. */ 2311 + add_token_u8(&err, dev, OPAL_STARTNAME); 2312 + add_token_u64(&err, dev, OPAL_SUM_SET_LIST); 2313 + add_token_bytestring(&err, dev, opaluid[OPAL_LOCKING_TABLE], OPAL_UID_LENGTH); 2314 + add_token_u8(&err, dev, OPAL_ENDNAME); 2315 + } else if (opal_react->num_lrs) { 2316 + /* Subset of Locking table (selected locking range(s)) to be put in SUM */ 2317 + err = build_locking_range(user_lr, sizeof(user_lr), 2318 + opal_react->lr[0]); 2319 + if (err) 2320 + return err; 2321 + 2322 + add_token_u8(&err, dev, OPAL_STARTNAME); 2323 + add_token_u64(&err, dev, OPAL_SUM_SET_LIST); 2324 + 2325 + add_token_u8(&err, dev, OPAL_STARTLIST); 2326 + add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH); 2327 + for (i = 1; i < opal_react->num_lrs; i++) { 2328 + user_lr[7] = opal_react->lr[i]; 2329 + add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH); 2330 + } 2331 + add_token_u8(&err, dev, OPAL_ENDLIST); 2332 + add_token_u8(&err, dev, OPAL_ENDNAME); 2333 + } 2334 + 2335 + /* Skipping the rangle policy parameter is same as setting its value to zero */ 2336 + if (opal_react->range_policy && (opal_react->num_lrs || opal_react->entire_table)) { 2337 + add_token_u8(&err, dev, OPAL_STARTNAME); 2338 + add_token_u64(&err, dev, OPAL_SUM_RANGE_POLICY); 2339 + add_token_u8(&err, dev, 1); 2340 + add_token_u8(&err, dev, OPAL_ENDNAME); 2341 + } 2342 + 2343 + /* 2344 + * Optional parameter. If set, it changes the Admin1 PIN even when SUM 2345 + * is being disabled. 2346 + */ 2347 + if (opal_react->new_admin_key.key_len) { 2348 + add_token_u8(&err, dev, OPAL_STARTNAME); 2349 + add_token_u64(&err, dev, OPAL_SUM_ADMIN1_PIN); 2350 + add_token_bytestring(&err, dev, opal_react->new_admin_key.key, 2351 + opal_react->new_admin_key.key_len); 2352 + add_token_u8(&err, dev, OPAL_ENDNAME); 2353 + } 2354 + 2355 + return finalize_and_send(dev, parse_and_check_status); 2356 + } 2357 + 2292 2358 /* Determine if we're in the Manufactured Inactive or Active state */ 2293 2359 static int get_lsp_lifecycle(struct opal_dev *dev, void *data) 2294 2360 { ··· 3027 2957 return ret; 3028 2958 } 3029 2959 2960 + static int opal_reactivate_lsp(struct opal_dev *dev, 2961 + struct opal_lr_react *opal_lr_react) 2962 + { 2963 + const struct opal_step active_steps[] = { 2964 + { start_admin1LSP_opal_session, &opal_lr_react->key }, 2965 + { reactivate_lsp, opal_lr_react }, 2966 + /* No end_opal_session. The controller terminates the session */ 2967 + }; 2968 + int ret; 2969 + 2970 + /* use either 'entire_table' parameter or set of locking ranges */ 2971 + if (opal_lr_react->num_lrs > OPAL_MAX_LRS || 2972 + (opal_lr_react->num_lrs && opal_lr_react->entire_table)) 2973 + return -EINVAL; 2974 + 2975 + ret = opal_get_key(dev, &opal_lr_react->key); 2976 + if (ret) 2977 + return ret; 2978 + mutex_lock(&dev->dev_lock); 2979 + setup_opal_dev(dev); 2980 + ret = execute_steps(dev, active_steps, ARRAY_SIZE(active_steps)); 2981 + mutex_unlock(&dev->dev_lock); 2982 + 2983 + return ret; 2984 + } 2985 + 3030 2986 static int opal_setup_locking_range(struct opal_dev *dev, 3031 2987 struct opal_user_lr_setup *opal_lrs) 3032 2988 { ··· 3410 3314 break; 3411 3315 case IOC_OPAL_SET_SID_PW: 3412 3316 ret = opal_set_new_sid_pw(dev, p); 3317 + break; 3318 + case IOC_OPAL_REACTIVATE_LSP: 3319 + ret = opal_reactivate_lsp(dev, p); 3413 3320 break; 3414 3321 3415 3322 default:
+1
include/linux/sed-opal.h
··· 53 53 case IOC_OPAL_DISCOVERY: 54 54 case IOC_OPAL_REVERT_LSP: 55 55 case IOC_OPAL_SET_SID_PW: 56 + case IOC_OPAL_REACTIVATE_LSP: 56 57 return true; 57 58 } 58 59 return false;
+14
include/uapi/linux/sed-opal.h
··· 74 74 __u8 align[2]; /* Align to 8 byte boundary */ 75 75 }; 76 76 77 + struct opal_lr_react { 78 + struct opal_key key; 79 + struct opal_key new_admin_key; /* Set new Admin1 PIN if key_len is > 0 */ 80 + __u8 num_lrs; /* 81 + * Configure selected ranges (from lr[]) in SUM. 82 + * If num_lrs > 0 the 'entire_table' must be 0 83 + */ 84 + __u8 lr[OPAL_MAX_LRS]; 85 + __u8 range_policy; /* Set RangeStartRangeLengthPolicy parameter */ 86 + __u8 entire_table; /* Set all locking objects in SUM */ 87 + __u8 align[4]; /* Align to 8 byte boundary */ 88 + }; 89 + 77 90 struct opal_session_info { 78 91 __u32 sum; 79 92 __u32 who; ··· 229 216 #define IOC_OPAL_DISCOVERY _IOW('p', 239, struct opal_discovery) 230 217 #define IOC_OPAL_REVERT_LSP _IOW('p', 240, struct opal_revert_lsp) 231 218 #define IOC_OPAL_SET_SID_PW _IOW('p', 241, struct opal_new_pw) 219 + #define IOC_OPAL_REACTIVATE_LSP _IOW('p', 242, struct opal_lr_react) 232 220 233 221 #endif /* _UAPI_SED_OPAL_H */