Skip to content

Commit 8cdd746

Browse files
francispravin5igaw
authored andcommitted
libnvme: add EMVS support to sanitize command
Add Enter Media Verification State (EMVS) support to sanitize command. TP4152 - Post-Sanitize Media Verification 2024.04.01 Ratified. Signed-off-by: Francis Pravin <[email protected]> Reviewed-by: Steven Seungcheol Lee <[email protected]>
1 parent d678aa0 commit 8cdd746

4 files changed

Lines changed: 25 additions & 10 deletions

File tree

src/nvme/api-types.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,7 @@ struct nvme_get_property_args {
511511
* @owpass: Overwrite pass count
512512
* @oipbp: Set to overwrite invert pattern between passes
513513
* @nodas: Set to not deallocate blocks after sanitizing
514+
* @emvs: Set to enter media verification state
514515
*/
515516
struct nvme_sanitize_nvm_args {
516517
__u32 *result;
@@ -523,6 +524,7 @@ struct nvme_sanitize_nvm_args {
523524
__u8 owpass;
524525
bool oipbp;
525526
bool nodas;
527+
bool emvs;
526528
};
527529

528530
/**

src/nvme/ioctl.c

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1641,12 +1641,25 @@ int nvme_get_property(struct nvme_get_property_args *args)
16411641

16421642
int nvme_sanitize_nvm(struct nvme_sanitize_nvm_args *args)
16431643
{
1644-
__u32 cdw10 = NVME_SET(args->sanact, SANITIZE_CDW10_SANACT) |
1645-
NVME_SET(!!args->ause, SANITIZE_CDW10_AUSE) |
1646-
NVME_SET(args->owpass, SANITIZE_CDW10_OWPASS) |
1647-
NVME_SET(!!args->oipbp, SANITIZE_CDW10_OIPBP) |
1648-
NVME_SET(!!args->nodas, SANITIZE_CDW10_NODAS);
1649-
__u32 cdw11 = args->ovrpat;
1644+
const size_t size_v1 = sizeof_args(struct nvme_sanitize_nvm_args, nodas, __u64);
1645+
const size_t size_v2 = sizeof_args(struct nvme_sanitize_nvm_args, emvs, __u64);
1646+
__u32 cdw10, cdw11;
1647+
1648+
if (args->args_size < size_v1 || args->args_size > size_v2) {
1649+
errno = EINVAL;
1650+
return -1;
1651+
}
1652+
1653+
cdw10 = NVME_SET(args->sanact, SANITIZE_CDW10_SANACT) |
1654+
NVME_SET(!!args->ause, SANITIZE_CDW10_AUSE) |
1655+
NVME_SET(args->owpass, SANITIZE_CDW10_OWPASS) |
1656+
NVME_SET(!!args->oipbp, SANITIZE_CDW10_OIPBP) |
1657+
NVME_SET(!!args->nodas, SANITIZE_CDW10_NODAS);
1658+
1659+
if (args->args_size == size_v2)
1660+
cdw10 |= NVME_SET(!!args->emvs, SANITIZE_CDW10_EMVS);
1661+
1662+
cdw11 = args->ovrpat;
16501663

16511664
struct nvme_passthru_cmd cmd = {
16521665
.opcode = nvme_admin_sanitize_nvm,
@@ -1655,10 +1668,6 @@ int nvme_sanitize_nvm(struct nvme_sanitize_nvm_args *args)
16551668
.timeout_ms = args->timeout,
16561669
};
16571670

1658-
if (args->args_size < sizeof(*args)) {
1659-
errno = EINVAL;
1660-
return -1;
1661-
}
16621671
return nvme_submit_admin_passthru(args->fd, &cmd, args->result);
16631672
}
16641673

src/nvme/ioctl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,11 +285,13 @@ enum nvme_cmd_dword_fields {
285285
NVME_SANITIZE_CDW10_OWPASS_SHIFT = 4,
286286
NVME_SANITIZE_CDW10_OIPBP_SHIFT = 8,
287287
NVME_SANITIZE_CDW10_NODAS_SHIFT = 9,
288+
NVME_SANITIZE_CDW10_EMVS_SHIFT = 10,
288289
NVME_SANITIZE_CDW10_SANACT_MASK = 0x7,
289290
NVME_SANITIZE_CDW10_AUSE_MASK = 0x1,
290291
NVME_SANITIZE_CDW10_OWPASS_MASK = 0xf,
291292
NVME_SANITIZE_CDW10_OIPBP_MASK = 0x1,
292293
NVME_SANITIZE_CDW10_NODAS_MASK = 0x1,
294+
NVME_SANITIZE_CDW10_EMVS_MASK = 0x1,
293295
NVME_SECURITY_NSSF_SHIFT = 0,
294296
NVME_SECURITY_SPSP0_SHIFT = 8,
295297
NVME_SECURITY_SPSP1_SHIFT = 16,

src/nvme/types.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8257,12 +8257,14 @@ enum nvme_directive_send_identify_endir {
82578257
* @NVME_SANITIZE_SANACT_START_BLOCK_ERASE: Start a Block Erase sanitize operation.
82588258
* @NVME_SANITIZE_SANACT_START_OVERWRITE: Start an Overwrite sanitize operation.
82598259
* @NVME_SANITIZE_SANACT_START_CRYPTO_ERASE: Start a Crypto Erase sanitize operation.
8260+
* @NVME_SANITIZE_SANACT_EXIT_MEDIA_VERIF: Exit Media Verification State
82608261
*/
82618262
enum nvme_sanitize_sanact {
82628263
NVME_SANITIZE_SANACT_EXIT_FAILURE = 1,
82638264
NVME_SANITIZE_SANACT_START_BLOCK_ERASE = 2,
82648265
NVME_SANITIZE_SANACT_START_OVERWRITE = 3,
82658266
NVME_SANITIZE_SANACT_START_CRYPTO_ERASE = 4,
8267+
NVME_SANITIZE_SANACT_EXIT_MEDIA_VERIF = 5,
82668268
};
82678269

82688270
/**

0 commit comments

Comments
 (0)