diff --git a/module/bdev/nvme/vbdev_opal.c b/module/bdev/nvme/vbdev_opal.c index fc4986066..68281c92b 100644 --- a/module/bdev/nvme/vbdev_opal.c +++ b/module/bdev/nvme/vbdev_opal.c @@ -40,21 +40,16 @@ /* OPAL locking range only supports operations on nsid=1 for now */ #define NSID_SUPPORTED 1 -struct spdk_vbdev_opal_config { - char *nvme_ctrlr_name; - uint8_t locking_range_id; - uint64_t range_start; - uint64_t range_length; - SPDK_BDEV_PART_TAILQ part_tailq; - struct vbdev_opal_part_base *opal_base; -}; - struct opal_vbdev { char *name; struct nvme_bdev_ctrlr *nvme_ctrlr; struct spdk_opal_dev *opal_dev; struct spdk_bdev_part *bdev_part; - struct spdk_vbdev_opal_config cfg; + + uint8_t locking_range_id; + uint64_t range_start; + uint64_t range_length; + struct vbdev_opal_part_base *opal_base; TAILQ_ENTRY(opal_vbdev) tailq; }; @@ -75,6 +70,7 @@ struct vbdev_opal_channel { struct vbdev_opal_part_base { char *nvme_ctrlr_name; struct spdk_bdev_part_base *part_base; + SPDK_BDEV_PART_TAILQ part_tailq; TAILQ_ENTRY(vbdev_opal_part_base) tailq; }; @@ -89,7 +85,6 @@ vbdev_opal_delete(struct opal_vbdev *opal_bdev) { TAILQ_REMOVE(&g_opal_vbdev, opal_bdev, tailq); free(opal_bdev->name); - free(opal_bdev->cfg.nvme_ctrlr_name); free(opal_bdev); opal_bdev = NULL; } @@ -253,7 +248,7 @@ vbdev_opal_get_info_from_bdev(const char *opal_bdev_name, const char *password) return NULL; } - locking_range_id = vbdev->cfg.locking_range_id; + locking_range_id = vbdev->locking_range_id; rc = spdk_opal_cmd_get_locking_range_info(nvme_ctrlr->opal_dev, password, OPAL_ADMIN1, locking_range_id); if (rc) { @@ -319,13 +314,6 @@ static struct spdk_bdev_module opal_if = { SPDK_BDEV_MODULE_REGISTER(opal, &opal_if) -static void -vbdev_opal_free_bdev(struct opal_vbdev *opal_bdev) -{ - free(opal_bdev->cfg.nvme_ctrlr_name); - free(opal_bdev); -} - int vbdev_opal_create(const char *nvme_ctrlr_name, uint32_t nsid, uint8_t locking_range_id, uint64_t range_start, uint64_t range_length, const char *password) @@ -335,9 +323,8 @@ vbdev_opal_create(const char *nvme_ctrlr_name, uint32_t nsid, uint8_t locking_ra char *base_bdev_name; struct nvme_bdev_ctrlr *nvme_ctrlr; struct opal_vbdev *opal_bdev; - struct vbdev_opal_part_base *opal_part_base; + struct vbdev_opal_part_base *opal_part_base = NULL; struct spdk_bdev_part *part_bdev; - struct spdk_vbdev_opal_config *cfg; struct nvme_bdev *nvme_bdev; if (nsid != NSID_SUPPORTED) { @@ -362,17 +349,9 @@ vbdev_opal_create(const char *nvme_ctrlr_name, uint32_t nsid, uint8_t locking_ra return -ENOMEM; } - cfg = &opal_bdev->cfg; - cfg->nvme_ctrlr_name = strdup(nvme_ctrlr_name); - if (!cfg->nvme_ctrlr_name) { - SPDK_ERRLOG("allocation for nvme_ctrlr_name failed\n"); - free(opal_bdev); - return -ENOMEM; - } - - cfg->locking_range_id = locking_range_id; - cfg->range_start = range_start; - cfg->range_length = range_length; + opal_bdev->locking_range_id = locking_range_id; + opal_bdev->range_start = range_start; + opal_bdev->range_length = range_length; opal_bdev->nvme_ctrlr = nvme_ctrlr; opal_bdev->opal_dev = nvme_ctrlr->opal_dev; @@ -384,53 +363,53 @@ vbdev_opal_create(const char *nvme_ctrlr_name, uint32_t nsid, uint8_t locking_ra /* traverse base list to see if part_base is already create for this base bdev */ TAILQ_FOREACH(opal_part_base, &g_opal_base, tailq) { if (!strcmp(spdk_bdev_part_base_get_bdev_name(opal_part_base->part_base), base_bdev_name)) { - cfg->opal_base = opal_part_base; + break; } } /* If there is not a corresponding opal_part_base, a new opal_part_base will be created. For each new part_base, there will be one tailq to store all the parts of this base */ - if (cfg->opal_base == NULL) { - TAILQ_INIT(&cfg->part_tailq); + if (opal_part_base == NULL) { opal_part_base = calloc(1, sizeof(*opal_part_base)); if (opal_part_base == NULL) { SPDK_ERRLOG("Could not allocate opal_part_base\n"); - vbdev_opal_free_bdev(opal_bdev); + free(opal_bdev); return -ENOMEM; } + TAILQ_INIT(&opal_part_base->part_tailq); opal_part_base->part_base = spdk_bdev_part_base_construct(spdk_bdev_get_by_name(base_bdev_name), vbdev_opal_base_bdev_hotremove_cb, &opal_if, - &opal_vbdev_fn_table, &cfg->part_tailq, vbdev_opal_base_free, opal_part_base, - sizeof(struct vbdev_opal_channel), NULL, NULL); + &opal_vbdev_fn_table, &opal_part_base->part_tailq, vbdev_opal_base_free, + opal_part_base, sizeof(struct vbdev_opal_channel), NULL, NULL); if (opal_part_base->part_base == NULL) { SPDK_ERRLOG("Could not allocate part_base\n"); - vbdev_opal_free_bdev(opal_bdev); + free(opal_bdev); free(opal_part_base); return -ENOMEM; } - opal_part_base->nvme_ctrlr_name = strdup(cfg->nvme_ctrlr_name); + opal_part_base->nvme_ctrlr_name = strdup(nvme_ctrlr_name); if (opal_part_base->nvme_ctrlr_name == NULL) { - vbdev_opal_free_bdev(opal_bdev); + free(opal_bdev); spdk_bdev_part_base_free(opal_part_base->part_base); return -ENOMEM; } - cfg->opal_base = opal_part_base; TAILQ_INSERT_TAIL(&g_opal_base, opal_part_base, tailq); } - assert(cfg->opal_base != NULL); + assert(opal_part_base != NULL); + opal_bdev->opal_base = opal_part_base; part_bdev = calloc(1, sizeof(struct spdk_bdev_part)); if (!part_bdev) { SPDK_ERRLOG("Could not allocate part_bdev\n"); - vbdev_opal_free_bdev(opal_bdev); + free(opal_bdev); return -ENOMEM; } TAILQ_INSERT_TAIL(&g_opal_vbdev, opal_bdev, tailq); opal_vbdev_name = spdk_sprintf_alloc("%sr%" PRIu8, base_bdev_name, - cfg->locking_range_id); /* e.g.: nvme0n1r1 */ + opal_bdev->locking_range_id); /* e.g.: nvme0n1r1 */ if (opal_vbdev_name == NULL) { SPDK_ERRLOG("Could not allocate opal_vbdev_name\n"); rc = -ENOMEM; @@ -439,14 +418,15 @@ vbdev_opal_create(const char *nvme_ctrlr_name, uint32_t nsid, uint8_t locking_ra opal_bdev->name = opal_vbdev_name; rc = spdk_opal_cmd_setup_locking_range(opal_bdev->opal_dev, OPAL_ADMIN1, - cfg->locking_range_id, cfg->range_start, cfg->range_length, password); + opal_bdev->locking_range_id, opal_bdev->range_start, + opal_bdev->range_length, password); if (rc) { SPDK_ERRLOG("Error construct %s\n", opal_vbdev_name); goto err; } - rc = spdk_bdev_part_construct(part_bdev, cfg->opal_base->part_base, opal_vbdev_name, - cfg->range_start, cfg->range_length, "Opal locking range"); + rc = spdk_bdev_part_construct(part_bdev, opal_bdev->opal_base->part_base, opal_vbdev_name, + opal_bdev->range_start, opal_bdev->range_length, "Opal locking range"); if (rc) { SPDK_ERRLOG("Could not allocate bdev part\n"); goto err; @@ -473,12 +453,11 @@ static void vbdev_opal_destruct_bdev(struct opal_vbdev *opal_bdev) { struct spdk_bdev_part *part = opal_bdev->bdev_part; - struct spdk_vbdev_opal_config *cfg = &opal_bdev->cfg; - assert(cfg->opal_base != NULL); + assert(opal_bdev->opal_base != NULL); assert(part != NULL); - if (cfg->range_start == spdk_bdev_part_get_offset_blocks(part)) { + if (opal_bdev->range_start == spdk_bdev_part_get_offset_blocks(part)) { spdk_bdev_unregister(spdk_bdev_part_get_bdev(part), NULL, NULL); } vbdev_opal_delete(opal_bdev); @@ -487,7 +466,6 @@ vbdev_opal_destruct_bdev(struct opal_vbdev *opal_bdev) int vbdev_opal_destruct(const char *bdev_name, const char *password) { - struct spdk_vbdev_opal_config *cfg; struct nvme_bdev_ctrlr *nvme_ctrlr; int locking_range_id; int rc; @@ -505,8 +483,7 @@ vbdev_opal_destruct(const char *bdev_name, const char *password) goto err; } - cfg = &opal_bdev->cfg; - locking_range_id = cfg->locking_range_id; + locking_range_id = opal_bdev->locking_range_id; nvme_ctrlr = opal_bdev->nvme_ctrlr; if (nvme_ctrlr == NULL) { @@ -583,7 +560,7 @@ vbdev_opal_set_lock_state(const char *bdev_name, uint16_t user_id, const char *p return -EINVAL; } - locking_range_id = opal_bdev->cfg.locking_range_id; + locking_range_id = opal_bdev->locking_range_id; rc = spdk_opal_cmd_lock_unlock(nvme_ctrlr->opal_dev, user_id, state_flag, locking_range_id, password); if (rc) { @@ -632,7 +609,7 @@ vbdev_opal_enable_new_user(const char *bdev_name, const char *admin_password, ui return rc; } - locking_range_id = opal_bdev->cfg.locking_range_id; + locking_range_id = opal_bdev->locking_range_id; rc = spdk_opal_cmd_add_user_to_locking_range(nvme_ctrlr->opal_dev, user_id, locking_range_id, OPAL_READONLY, admin_password); if (rc) {