}
int nvme_ns_create(int fd, __u64 nsze, __u64 ncap, __u8 flbas,
- __u8 dps, __u8 nmic, __u32 *result)
+ __u8 dps, __u8 nmic, __u32 timeout, __u32 *result)
{
struct nvme_id_ns ns = {
.nsze = cpu_to_le64(nsze),
.addr = (__u64)(uintptr_t) ((void *)&ns),
.cdw10 = 0,
.data_len = 0x1000,
+ .timeout_ms = timeout,
};
int err;
return err;
}
-int nvme_ns_delete(int fd, __u32 nsid)
+int nvme_ns_delete(int fd, __u32 nsid, __u32 timeout)
{
struct nvme_admin_cmd cmd = {
.opcode = nvme_admin_ns_mgmt,
.nsid = nsid,
.cdw10 = 1,
+ .timeout_ms = timeout,
};
return nvme_submit_admin_passthru(fd, &cmd);
#include "linux/nvme_ioctl.h"
#include "nvme.h"
+#define NVME_IOCTL_TIMEOUT 120000 /* in milliseconds */
+
int nvme_get_nsid(int fd);
/* Generic passthrough */
__u8 pil, __u8 ms, __u32 timeout);
int nvme_ns_create(int fd, __u64 nsze, __u64 ncap, __u8 flbas,
- __u8 dps, __u8 nmic, __u32 *result);
-int nvme_ns_delete(int fd, __u32 nsid);
+ __u8 dps, __u8 nmic, __u32 timeout, __u32 *result);
+int nvme_ns_delete(int fd, __u32 nsid, __u32 timeout);
int nvme_ns_attachment(int fd, __u32 nsid, __u16 num_ctrls,
__u16 *ctrlist, bool attach);
"becomes inactive when that namespace is detached or, if "\
"the namespace is not already inactive, once deleted.";
const char *namespace_id = "namespace to delete";
+ const char *timeout = "timeout value, in milliseconds";
int err, fd;
struct config {
__u32 namespace_id;
+ __u32 timeout;
};
struct config cfg = {
.namespace_id = 0,
+ .timeout = NVME_IOCTL_TIMEOUT,
};
const struct argconfig_commandline_options command_line_options[] = {
{"namespace-id", 'n', "NUM", CFG_POSITIVE, &cfg.namespace_id, required_argument, namespace_id},
+ {"timeout", 't', "NUM", CFG_POSITIVE, &cfg.timeout, required_argument, timeout},
{NULL}
};
goto close_fd;
}
- err = nvme_ns_delete(fd, cfg.namespace_id);
+ err = nvme_ns_delete(fd, cfg.namespace_id, cfg.timeout);
if (!err)
printf("%s: Success, deleted nsid:%d\n", cmd->name,
cfg.namespace_id);
const char *flbas = "FLBA size";
const char *dps = "data protection capabilities";
const char *nmic = "multipath and sharing capabilities";
+ const char *timeout = "timeout value, in milliseconds";
int err = 0, fd;
__u32 nsid;
__u8 flbas;
__u8 dps;
__u8 nmic;
+ __u32 timeout;
};
struct config cfg = {
+ .timeout = NVME_IOCTL_TIMEOUT,
};
const struct argconfig_commandline_options command_line_options[] = {
{"flbas", 'f', "NUM", CFG_BYTE, &cfg.flbas, required_argument, flbas},
{"dps", 'd', "NUM", CFG_BYTE, &cfg.dps, required_argument, dps},
{"nmic", 'm', "NUM", CFG_BYTE, &cfg.nmic, required_argument, nmic},
+ {"timeout", 't', "NUM", CFG_POSITIVE, &cfg.timeout, required_argument, timeout},
{NULL}
};
if (fd < 0)
return fd;
- err = nvme_ns_create(fd, cfg.nsze, cfg.ncap, cfg.flbas, cfg.dps, cfg.nmic, &nsid);
+ err = nvme_ns_create(fd, cfg.nsze, cfg.ncap, cfg.flbas, cfg.dps, cfg.nmic, cfg.timeout, &nsid);
if (!err)
printf("%s: Success, created nsid:%d\n", cmd->name, nsid);
else if (err > 0)