From 48834f0daadea606a1faf7623d3900f7c0601365 Mon Sep 17 00:00:00 2001 From: Pawel Wodkowski Date: Mon, 28 Jan 2019 22:30:36 +0100 Subject: [PATCH] vhost-scsi: use first free SCSI target ID if -1 specified Fixes #328 Change-Id: I34b816a31a51d1a8aa4c61285e01d0249c283f53 Signed-off-by: Pawel Wodkowski Reviewed-on: https://review.gerrithub.io/c/442434 Tested-by: SPDK CI Jenkins Reviewed-by: Darek Stojaczyk Reviewed-by: Jim Harris --- doc/jsonrpc.md | 8 ++++++-- include/spdk/vhost.h | 13 ++++++++++--- lib/vhost/vhost_rpc.c | 6 +++--- lib/vhost/vhost_scsi.c | 25 +++++++++++++++++++------ scripts/rpc.py | 8 ++++---- test/json_config/json_config.sh | 2 +- 6 files changed, 43 insertions(+), 19 deletions(-) diff --git a/doc/jsonrpc.md b/doc/jsonrpc.md index c790dff69..da0a96bb3 100644 --- a/doc/jsonrpc.md +++ b/doc/jsonrpc.md @@ -4094,9 +4094,13 @@ In vhost target `ctrlr` create SCSI target with ID `scsi_target_num` and add `bd Name | Optional | Type | Description ----------------------- | -------- | ----------- | ----------- ctrlr | Required | string | Controller name -scsi_target_num | Required | number | SCSI target ID between 0 and 7 +scsi_target_num | Required | number | SCSI target ID between 0 and 7 or -1 to use first free ID. bdev_name | Required | string | Name of bdev to expose as a LUN 0 +### Response + +SCSI target ID. + ### Example Example request: @@ -4121,7 +4125,7 @@ response: { "jsonrpc": "2.0", "id": 1, - "result": true + "result": 1 } ~~~ diff --git a/include/spdk/vhost.h b/include/spdk/vhost.h index eaf8d966f..3f6495395 100644 --- a/include/spdk/vhost.h +++ b/include/spdk/vhost.h @@ -207,12 +207,19 @@ int spdk_vhost_scsi_dev_construct(const char *name, const char *cpumask); * automatically detected by the other side. * * \param vdev vhost SCSI device. - * \param scsi_tgt_num slot to attach to. + * \param scsi_tgt_num slot to attach to or negative value to use first free. * \param bdev_name name of the SPDK bdev to associate with SCSI LUN0. * - * \return 0 on success, negative errno on error. + * \return value >= 0 on success - the SCSI target ID, negative errno code: + * -EINVAL - one of the arguments is invalid: + * - vdev is not vhost SCSI device + * - SCSI target ID is out of range + * - bdev name is NULL + * - can't create SCSI LUN because of other errors e.g.: bdev does not exist + * -ENOSPC - scsi_tgt_num is -1 and maximum targets in vhost SCSI device reached + * -EEXIST - SCSI target ID already exists */ -int spdk_vhost_scsi_dev_add_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tgt_num, +int spdk_vhost_scsi_dev_add_tgt(struct spdk_vhost_dev *vdev, int scsi_tgt_num, const char *bdev_name); /** diff --git a/lib/vhost/vhost_rpc.c b/lib/vhost/vhost_rpc.c index 8bcbb7343..774a2c24a 100644 --- a/lib/vhost/vhost_rpc.c +++ b/lib/vhost/vhost_rpc.c @@ -103,7 +103,7 @@ SPDK_RPC_REGISTER("construct_vhost_scsi_controller", spdk_rpc_construct_vhost_sc struct rpc_add_vhost_scsi_ctrlr_lun { char *ctrlr; - uint32_t scsi_target_num; + int32_t scsi_target_num; char *bdev_name; struct spdk_jsonrpc_request *request; @@ -119,7 +119,7 @@ free_rpc_add_vhost_scsi_ctrlr_lun(struct rpc_add_vhost_scsi_ctrlr_lun *req) static const struct spdk_json_object_decoder rpc_vhost_add_lun[] = { {"ctrlr", offsetof(struct rpc_add_vhost_scsi_ctrlr_lun, ctrlr), spdk_json_decode_string }, - {"scsi_target_num", offsetof(struct rpc_add_vhost_scsi_ctrlr_lun, scsi_target_num), spdk_json_decode_uint32}, + {"scsi_target_num", offsetof(struct rpc_add_vhost_scsi_ctrlr_lun, scsi_target_num), spdk_json_decode_int32}, {"bdev_name", offsetof(struct rpc_add_vhost_scsi_ctrlr_lun, bdev_name), spdk_json_decode_string }, }; @@ -148,7 +148,7 @@ spdk_rpc_add_vhost_scsi_lun_cb(struct spdk_vhost_dev *vdev, void *arg) return -1; } - spdk_json_write_bool(w, true); + spdk_json_write_int32(w, rc); spdk_jsonrpc_end_result(request, w); return 0; diff --git a/lib/vhost/vhost_scsi.c b/lib/vhost/vhost_scsi.c index 9988435d2..1e74c0ec5 100644 --- a/lib/vhost/vhost_scsi.c +++ b/lib/vhost/vhost_scsi.c @@ -938,7 +938,7 @@ spdk_vhost_scsi_session_add_tgt(struct spdk_vhost_dev *vdev, } int -spdk_vhost_scsi_dev_add_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tgt_num, +spdk_vhost_scsi_dev_add_tgt(struct spdk_vhost_dev *vdev, int scsi_tgt_num, const char *bdev_name) { struct spdk_vhost_scsi_dev *svdev; @@ -952,10 +952,23 @@ spdk_vhost_scsi_dev_add_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tgt_num, return -EINVAL; } - if (scsi_tgt_num >= SPDK_VHOST_SCSI_CTRLR_MAX_DEVS) { - SPDK_ERRLOG("Controller %d target number too big (max %d)\n", scsi_tgt_num, - SPDK_VHOST_SCSI_CTRLR_MAX_DEVS); - return -EINVAL; + if (scsi_tgt_num < 0) { + for (scsi_tgt_num = 0; scsi_tgt_num < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; scsi_tgt_num++) { + if (svdev->scsi_dev_state[scsi_tgt_num].dev == NULL) { + break; + } + } + + if (scsi_tgt_num == SPDK_VHOST_SCSI_CTRLR_MAX_DEVS) { + SPDK_ERRLOG("Controller %s - all targets already in use.\n", vdev->name); + return -ENOSPC; + } + } else { + if (scsi_tgt_num >= SPDK_VHOST_SCSI_CTRLR_MAX_DEVS) { + SPDK_ERRLOG("Controller %s target %d number too big (max %d)\n", vdev->name, scsi_tgt_num, + SPDK_VHOST_SCSI_CTRLR_MAX_DEVS); + return -EINVAL; + } } if (bdev_name == NULL) { @@ -993,7 +1006,7 @@ spdk_vhost_scsi_dev_add_tgt(struct spdk_vhost_dev *vdev, unsigned scsi_tgt_num, spdk_vhost_dev_foreach_session(vdev, spdk_vhost_scsi_session_add_tgt, (void *)(uintptr_t)scsi_tgt_num); - return 0; + return scsi_tgt_num; } static int diff --git a/scripts/rpc.py b/scripts/rpc.py index 1dbf33ee3..9c37a5502 100755 --- a/scripts/rpc.py +++ b/scripts/rpc.py @@ -1580,10 +1580,10 @@ Format: 'user:u1 secret:s1 muser:mu1 msecret:ms1,user:u2 secret:s2 muser:mu2 mse p.set_defaults(func=construct_vhost_scsi_controller) def add_vhost_scsi_lun(args): - rpc.vhost.add_vhost_scsi_lun(args.client, - ctrlr=args.ctrlr, - scsi_target_num=args.scsi_target_num, - bdev_name=args.bdev_name) + print(rpc.vhost.add_vhost_scsi_lun(args.client, + ctrlr=args.ctrlr, + scsi_target_num=args.scsi_target_num, + bdev_name=args.bdev_name)) p = subparsers.add_parser('add_vhost_scsi_lun', help='Add lun to vhost controller') diff --git a/test/json_config/json_config.sh b/test/json_config/json_config.sh index 843c23527..270b71b29 100755 --- a/test/json_config/json_config.sh +++ b/test/json_config/json_config.sh @@ -198,7 +198,7 @@ function create_vhost_subsystem_config() { tgt_rpc construct_vhost_scsi_controller VhostScsiCtrlr0 tgt_rpc add_vhost_scsi_lun VhostScsiCtrlr0 0 MallocForVhost0p3 - tgt_rpc add_vhost_scsi_lun VhostScsiCtrlr0 1 MallocForVhost0p4 + tgt_rpc add_vhost_scsi_lun VhostScsiCtrlr0 -1 MallocForVhost0p4 tgt_rpc set_vhost_controller_coalescing VhostScsiCtrlr0 1 100 tgt_rpc construct_vhost_blk_controller VhostBlkCtrlr0 MallocForVhost0p5