diff --git a/lib/bdev/virtio/bdev_virtio.h b/lib/bdev/virtio/bdev_virtio.h index 079bdf604..c1f63d998 100644 --- a/lib/bdev/virtio/bdev_virtio.h +++ b/lib/bdev/virtio/bdev_virtio.h @@ -116,6 +116,13 @@ int bdev_virtio_pci_scsi_dev_create(const char *name, struct spdk_pci_addr *pci_ void bdev_virtio_scsi_dev_remove(const char *name, bdev_virtio_remove_cb cb_fn, void *cb_arg); +/** + * List all created Virtio-SCSI devices. + * + * \param write_ctx JSON context to write into + */ +void bdev_virtio_scsi_dev_list(struct spdk_json_write_ctx *write_ctx); + /** * Connect to a vhost-user Unix domain socket and create a Virtio BLK bdev. * diff --git a/lib/bdev/virtio/bdev_virtio_rpc.c b/lib/bdev/virtio/bdev_virtio_rpc.c index 06f655208..589bc87a2 100644 --- a/lib/bdev/virtio/bdev_virtio_rpc.c +++ b/lib/bdev/virtio/bdev_virtio_rpc.c @@ -265,6 +265,28 @@ invalid: } SPDK_RPC_REGISTER("remove_virtio_scsi_bdev", spdk_rpc_remove_virtio_scsi_bdev); +static void +spdk_rpc_get_virtio_scsi_devs(struct spdk_jsonrpc_request *request, + const struct spdk_json_val *params) +{ + struct spdk_json_write_ctx *w; + + if (params != NULL) { + spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, + "get_virtio_scsi_devs requires no parameters"); + return; + } + + w = spdk_jsonrpc_begin_result(request); + if (w == NULL) { + return; + } + + bdev_virtio_scsi_dev_list(w); + spdk_jsonrpc_end_result(request, w); +} +SPDK_RPC_REGISTER("get_virtio_scsi_devs", spdk_rpc_get_virtio_scsi_devs) + struct rpc_construct_virtio_blk_dev { char *path; char *pci_address; diff --git a/lib/bdev/virtio/bdev_virtio_scsi.c b/lib/bdev/virtio/bdev_virtio_scsi.c index 760bd8b6c..28ee48305 100644 --- a/lib/bdev/virtio/bdev_virtio_scsi.c +++ b/lib/bdev/virtio/bdev_virtio_scsi.c @@ -1933,4 +1933,27 @@ bdev_virtio_scsi_dev_remove(const char *name, bdev_virtio_remove_cb cb_fn, void pthread_mutex_unlock(&g_virtio_scsi_mutex); } +void +bdev_virtio_scsi_dev_list(struct spdk_json_write_ctx *w) +{ + struct virtio_scsi_dev *svdev; + + spdk_json_write_array_begin(w); + + pthread_mutex_lock(&g_virtio_scsi_mutex); + TAILQ_FOREACH(svdev, &g_virtio_scsi_devs, tailq) { + spdk_json_write_object_begin(w); + + spdk_json_write_name(w, "name"); + spdk_json_write_string(w, svdev->vdev.name); + + virtio_dev_dump_json_config(&svdev->vdev, w); + + spdk_json_write_object_end(w); + } + pthread_mutex_unlock(&g_virtio_scsi_mutex); + + spdk_json_write_array_end(w); +} + SPDK_LOG_REGISTER_COMPONENT("virtio", SPDK_LOG_VIRTIO) diff --git a/scripts/rpc.py b/scripts/rpc.py index 6f0439e18..442dd1c8f 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -762,6 +762,12 @@ if __name__ == "__main__": It will be inhereted by all created bdevs, which are named n the following format: t""") p.set_defaults(func=construct_virtio_pci_scsi_bdev) + def get_virtio_scsi_devs(args): + print_dict(rpc.vhost.get_virtio_scsi_devs(args)) + + p = subparsers.add_parser('get_virtio_scsi_devs', help='List all Virtio-SCSI devices.') + p.set_defaults(func=get_virtio_scsi_devs) + def remove_virtio_scsi_bdev(args): rpc.vhost.remove_virtio_scsi_bdev(args) diff --git a/scripts/rpc/vhost.py b/scripts/rpc/vhost.py index fa5a6f201..b513af60f 100755 --- a/scripts/rpc/vhost.py +++ b/scripts/rpc/vhost.py @@ -79,6 +79,10 @@ def remove_virtio_scsi_bdev(args): return args.client.call('remove_virtio_scsi_bdev', params) +def get_virtio_scsi_devs(args): + return args.client.call('get_virtio_scsi_devs') + + def construct_virtio_user_blk_bdev(args): params = { 'path': args.path,