bdev_nvme: retain nvme_ctrl after delete_bdev
When deleting bdev of NVMe type by delete_bdev rpc, if the bdev is the last one NVMe bdev of the NVMe controller, the NVMe controller will be deleted too. With this change, the nvme_ctrlr will be retained inside SPDK app after delete_bdev rpc. And the nvme_ctrlr can be deleted by delete_nvme_controller rpc. Change-Id: Icad6c24d342b9e4bcb69ec7a4b1a352c2df113f2 Signed-off-by: Liu Xiaodong <xiaodong.liu@intel.com> Reviewed-on: https://review.gerrithub.io/431582 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Chandler-Test-Pool: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
1ab092348a
commit
8fa8310be4
@ -260,6 +260,19 @@ bdev_nvme_unregister_cb(void *io_device)
|
|||||||
spdk_nvme_detach(ctrlr);
|
spdk_nvme_detach(ctrlr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
bdev_nvme_ctrlr_destruct(struct nvme_ctrlr *nvme_ctrlr)
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&g_bdev_nvme_mutex);
|
||||||
|
TAILQ_REMOVE(&g_nvme_ctrlrs, nvme_ctrlr, tailq);
|
||||||
|
pthread_mutex_unlock(&g_bdev_nvme_mutex);
|
||||||
|
spdk_io_device_unregister(nvme_ctrlr->ctrlr, bdev_nvme_unregister_cb);
|
||||||
|
spdk_poller_unregister(&nvme_ctrlr->adminq_timer_poller);
|
||||||
|
free(nvme_ctrlr->name);
|
||||||
|
free(nvme_ctrlr->bdevs);
|
||||||
|
free(nvme_ctrlr);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
bdev_nvme_destruct(void *ctx)
|
bdev_nvme_destruct(void *ctx)
|
||||||
{
|
{
|
||||||
@ -270,20 +283,16 @@ bdev_nvme_destruct(void *ctx)
|
|||||||
nvme_ctrlr->ref--;
|
nvme_ctrlr->ref--;
|
||||||
free(nvme_disk->disk.name);
|
free(nvme_disk->disk.name);
|
||||||
memset(nvme_disk, 0, sizeof(*nvme_disk));
|
memset(nvme_disk, 0, sizeof(*nvme_disk));
|
||||||
if (nvme_ctrlr->ref == 0) {
|
if (nvme_ctrlr->ref == 0 && nvme_ctrlr->destruct) {
|
||||||
TAILQ_REMOVE(&g_nvme_ctrlrs, nvme_ctrlr, tailq);
|
/* Clear destruct sign in case of reentering controller destruct */
|
||||||
|
nvme_ctrlr->destruct = false;
|
||||||
pthread_mutex_unlock(&g_bdev_nvme_mutex);
|
pthread_mutex_unlock(&g_bdev_nvme_mutex);
|
||||||
spdk_io_device_unregister(nvme_ctrlr->ctrlr, bdev_nvme_unregister_cb);
|
bdev_nvme_ctrlr_destruct(nvme_ctrlr);
|
||||||
spdk_poller_unregister(&nvme_ctrlr->adminq_timer_poller);
|
|
||||||
free(nvme_ctrlr->name);
|
|
||||||
free(nvme_ctrlr->bdevs);
|
|
||||||
free(nvme_ctrlr);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_unlock(&g_bdev_nvme_mutex);
|
pthread_mutex_unlock(&g_bdev_nvme_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -1084,6 +1093,7 @@ remove_cb(void *cb_ctx, struct spdk_nvme_ctrlr *ctrlr)
|
|||||||
pthread_mutex_lock(&g_bdev_nvme_mutex);
|
pthread_mutex_lock(&g_bdev_nvme_mutex);
|
||||||
TAILQ_FOREACH(nvme_ctrlr, &g_nvme_ctrlrs, tailq) {
|
TAILQ_FOREACH(nvme_ctrlr, &g_nvme_ctrlrs, tailq) {
|
||||||
if (nvme_ctrlr->ctrlr == ctrlr) {
|
if (nvme_ctrlr->ctrlr == ctrlr) {
|
||||||
|
nvme_ctrlr->destruct = true;
|
||||||
pthread_mutex_unlock(&g_bdev_nvme_mutex);
|
pthread_mutex_unlock(&g_bdev_nvme_mutex);
|
||||||
for (i = 0; i < nvme_ctrlr->num_ns; i++) {
|
for (i = 0; i < nvme_ctrlr->num_ns; i++) {
|
||||||
uint32_t nsid = i + 1;
|
uint32_t nsid = i + 1;
|
||||||
@ -1094,6 +1104,15 @@ remove_cb(void *cb_ctx, struct spdk_nvme_ctrlr *ctrlr)
|
|||||||
spdk_bdev_unregister(&nvme_bdev->disk, NULL, NULL);
|
spdk_bdev_unregister(&nvme_bdev->disk, NULL, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_mutex_lock(&g_bdev_nvme_mutex);
|
||||||
|
if (nvme_ctrlr->ref == 0 && nvme_ctrlr->destruct) {
|
||||||
|
nvme_ctrlr->destruct = false;
|
||||||
|
pthread_mutex_unlock(&g_bdev_nvme_mutex);
|
||||||
|
bdev_nvme_ctrlr_destruct(nvme_ctrlr);
|
||||||
|
} else {
|
||||||
|
pthread_mutex_unlock(&g_bdev_nvme_mutex);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,7 @@ struct nvme_ctrlr {
|
|||||||
struct spdk_nvme_transport_id trid;
|
struct spdk_nvme_transport_id trid;
|
||||||
char *name;
|
char *name;
|
||||||
int ref;
|
int ref;
|
||||||
|
bool destruct;
|
||||||
uint32_t num_ns;
|
uint32_t num_ns;
|
||||||
/** Array of bdevs indexed by nsid - 1 */
|
/** Array of bdevs indexed by nsid - 1 */
|
||||||
struct nvme_bdev *bdevs;
|
struct nvme_bdev *bdevs;
|
||||||
|
Loading…
Reference in New Issue
Block a user