bdev_xnvme: free bdev_xnvme structure after device is fully unregistered
Fix for the issue 2702. spdk_bdev plugin crashes while handling xnvme devices. xnvme_queue_term gets invoked after the bdev_xnvme_free executes and frees the xnvme structures. xnvme_queue_term references the xnvme->dev structure, after it is freed, resulting in a segmentation fault. Implemented a bdev_xnvme_destruct_cb, that frees the xnvme structures after the xnvme_queue_term invokes and the device is fully unregistered. Signed-off-by: Krishna Kanth Reddy <krish.reddy@samsung.com> Change-Id: I9338c84baf4b61ec2e0d324e67bfefcb96485156 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14680 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
This commit is contained in:
parent
f1bec928d1
commit
78ff96bb73
@ -105,14 +105,21 @@ bdev_xnvme_io_type_supported(void *ctx, enum spdk_bdev_io_type io_type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
bdev_xnvme_destruct_cb(void *io_device)
|
||||||
|
{
|
||||||
|
struct bdev_xnvme *xnvme = io_device;
|
||||||
|
|
||||||
|
TAILQ_REMOVE(&g_xnvme_bdev_head, xnvme, link);
|
||||||
|
bdev_xnvme_free(xnvme);
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
bdev_xnvme_destruct(void *ctx)
|
bdev_xnvme_destruct(void *ctx)
|
||||||
{
|
{
|
||||||
struct bdev_xnvme *xnvme = ctx;
|
struct bdev_xnvme *xnvme = ctx;
|
||||||
|
|
||||||
TAILQ_REMOVE(&g_xnvme_bdev_head, xnvme, link);
|
spdk_io_device_unregister(xnvme, bdev_xnvme_destruct_cb);
|
||||||
spdk_io_device_unregister(xnvme, NULL);
|
|
||||||
bdev_xnvme_free(xnvme);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user