#include <err.h>
#include <stdlib.h>
#include <string.h>
#include "libnvme_test_common.h"
typedef enum {
RESET_ACT_EMPTY = 0,
RESET_ACT_DEFAULT
} reset_action_t;
static bool
device_reset_cb(nvme_ctrl_t *ctrl, const nvme_ns_disc_t *disc,
void *arg)
{
const uint32_t nsid = nvme_ns_disc_nsid(disc);
if (!libnvme_test_setup_ns(ctrl, NVME_NS_DISC_F_ALL, nsid,
UINT32_MAX)) {
exit(EXIT_FAILURE);
}
return (true);
}
static void
device_reset_create(nvme_ctrl_t *ctrl)
{
nvme_ctrl_info_t *info;
uint32_t lba, nsid;
uint64_t size;
nvme_uint128_t cap;
if (!nvme_ctrl_info_snap(ctrl, &info)) {
libnvme_test_ctrl_fatal(ctrl, "failed to get info snapshot");
}
if (!libnvme_test_lbaf(info, NVME_TEST_LBA_SIZE, &lba)) {
errx(EXIT_FAILURE, "failed to find 4K LBA format, cannot "
"continue");
}
if (!nvme_ctrl_info_cap(info, &cap)) {
libnvme_test_ctrl_info_fatal(info, "failed to get device "
"capacity");
}
if (cap.hi != 0) {
errx(EXIT_FAILURE, "encountered device with > uint64_t "
"capacity, this program needs to be updated to deal with "
"that");
}
size = cap.lo / NVME_TEST_LBA_SIZE;
if (!libnvme_test_ns_create(ctrl, size, lba, &nsid, NULL)) {
exit(EXIT_FAILURE);
}
if (!libnvme_test_setup_ns(ctrl, NVME_NS_DISC_F_ACTIVE, nsid,
UINT32_MAX)) {
exit(EXIT_FAILURE);
}
nvme_ctrl_info_free(info);
}
int
main(void)
{
nvme_t *nvme;
nvme_ctrl_t *ctrl;
libnvme_test_init(&nvme, &ctrl);
if (!nvme_ctrl_lock(ctrl, NVME_LOCK_L_WRITE, NVME_LOCK_F_DONT_BLOCK)) {
libnvme_test_ctrl_fatal(ctrl, "failed to obtain write lock");
}
if (!nvme_ns_discover(ctrl, NVME_NS_DISC_F_ALL,
device_reset_cb, NULL)) {
libnvme_test_ctrl_fatal(ctrl, "failed to iterate namespaces");
}
device_reset_create(ctrl);
nvme_ctrl_unlock(ctrl);
nvme_ctrl_fini(ctrl);
nvme_fini(nvme);
return (EXIT_SUCCESS);
}