diff --git a/etc/spdk/vhost.conf.in b/etc/spdk/vhost.conf.in index fb258e3ad..1f1f65650 100644 --- a/etc/spdk/vhost.conf.in +++ b/etc/spdk/vhost.conf.in @@ -114,13 +114,13 @@ Name vhost.0 # Assign devices from backend # Use the first malloc device - Dev0 Malloc0 + Dev 0 Malloc0 # Use the first AIO device - #Dev1 AIO0 + #Dev 1 AIO0 # Use the frist Nvme device - #Dev2 Nvme0n1 + #Dev 2 Nvme0n1 # Use the third partition from second Nvme device - #Dev3 Nvme1n1p2 + #Dev 3 Nvme1n1p2 # Start the poller for this vhost controller on one of the cores in # this cpumask. By default, it not specified, will use any core in the diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index f08af822c..da08fefd8 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -794,13 +794,11 @@ spdk_vhost_scsi_ctrlr_construct(const char *name, uint64_t cpumask) return -ENOSPC; } - vdev = rte_zmalloc(NULL, sizeof(*vdev), RTE_CACHE_LINE_SIZE); - if (vdev == NULL) { - SPDK_ERRLOG("Couldn't allocate memory for vhost dev\n"); - return -ENOMEM; + if (snprintf(path, sizeof(path), "%s%s", dev_dirname, name) >= (int)sizeof(path)) { + SPDK_ERRLOG("Resulting socket path for controller %s is too long: %s%s\n", name, dev_dirname, name); + return -EINVAL; } - snprintf(path, sizeof(path), "%s%s", dev_dirname, name); /* Register vhost(cuse or user) driver to handle vhost messages. */ if (access(path, F_OK) != -1) { if (unlink(path) != 0) @@ -813,6 +811,12 @@ spdk_vhost_scsi_ctrlr_construct(const char *name, uint64_t cpumask) return -EIO; } + vdev = rte_zmalloc(NULL, sizeof(*vdev), RTE_CACHE_LINE_SIZE); + if (vdev == NULL) { + SPDK_ERRLOG("Couldn't allocate memory for vhost dev\n"); + return -ENOMEM; + } + spdk_vhost_ctrlrs[ctrlr_num] = vdev; vdev->name = strdup(name); vdev->cpumask = cpumask; @@ -865,8 +869,8 @@ spdk_vhost_scsi_ctrlr_add_dev(const char *ctrlr_name, unsigned scsi_dev_num, con return -EINVAL; } - if (scsi_dev_num > SPDK_VHOST_SCSI_CTRLR_MAX_DEVS) { - SPDK_ERRLOG("Controller %d device num too big (max %d)\n", scsi_dev_num, + if (scsi_dev_num >= SPDK_VHOST_SCSI_CTRLR_MAX_DEVS) { + SPDK_ERRLOG("Controller %d device number too big (max %d)\n", scsi_dev_num, SPDK_VHOST_SCSI_CTRLR_MAX_DEVS); return -EINVAL; } @@ -874,6 +878,9 @@ spdk_vhost_scsi_ctrlr_add_dev(const char *ctrlr_name, unsigned scsi_dev_num, con if (lun_name == NULL) { SPDK_ERRLOG("No lun name specified \n"); return -EINVAL; + } else if (strlen(lun_name) >= SPDK_SCSI_DEV_MAX_NAME) { + SPDK_ERRLOG("LUN name '%s' too long (max %d).\n", lun_name, SPDK_SCSI_DEV_MAX_NAME - 1); + return -1; } vdev = spdk_vhost_scsi_ctrlr_find(ctrlr_name); @@ -895,7 +902,7 @@ spdk_vhost_scsi_ctrlr_add_dev(const char *ctrlr_name, unsigned scsi_dev_num, con /* * At this stage only one LUN per device */ - snprintf(dev_name, sizeof(dev_name), "Dev%u", scsi_dev_num); + snprintf(dev_name, sizeof(dev_name), "Dev %u", scsi_dev_num); lun_id_list[0] = 0; lun_names_list[0] = (char *)lun_name; @@ -955,9 +962,9 @@ spdk_vhost_scsi_ctrlr_get_cpumask(struct spdk_vhost_scsi_ctrlr *ctrlr) static int spdk_vhost_scsi_controller_construct(void) { struct spdk_conf_section *sp = spdk_conf_first_section(NULL); - int i; + int i, dev_num; unsigned ctrlr_num = 0; - char *lun_name, dev_name[LUN_DEV_NAME_SIZE]; + char *lun_name, *dev_num_str; char *cpumask_str; char *name; uint64_t cpumask; @@ -969,9 +976,9 @@ static int spdk_vhost_scsi_controller_construct(void) } if (sscanf(spdk_conf_section_get_name(sp), "VhostScsi%u", &ctrlr_num) != 1) { - SPDK_WARNLOG("Ignoring section that don't match VhostScsi controller template: %s\n", - spdk_conf_section_get_name(sp)); - continue; + SPDK_ERRLOG("Section '%s' has non-numeric suffix.\n", + spdk_conf_section_get_name(sp)); + return -1; } name = spdk_conf_section_get_val(sp, "Name"); @@ -979,7 +986,7 @@ static int spdk_vhost_scsi_controller_construct(void) if (cpumask_str == NULL) { cpumask = spdk_app_get_core_mask(); } else if (spdk_vhost_parse_core_mask(cpumask_str, &cpumask)) { - SPDK_ERRLOG("Error parsing cpumask while creating controller\n"); + SPDK_ERRLOG("%s: Error parsing cpumask '%s' while creating controller\n", name, cpumask_str); return -1; } @@ -987,14 +994,24 @@ static int spdk_vhost_scsi_controller_construct(void) return -1; } - for (i = 0; i < SPDK_VHOST_SCSI_CTRLR_MAX_DEVS; i++) { - snprintf(dev_name, sizeof(dev_name), "Dev%d", i); - lun_name = spdk_conf_section_get_val(sp, dev_name); - if (lun_name == NULL) { - continue; + for (i = 0; spdk_conf_section_get_nval(sp, "Dev", i) != NULL; i++) { + dev_num_str = spdk_conf_section_get_nmval(sp, "Dev", i, 0); + if (dev_num_str == NULL) { + SPDK_ERRLOG("%s: Invalid or missing Dev number\n", name); + return -1; } - if (spdk_vhost_scsi_ctrlr_add_dev(name, i, lun_name) < 0) { + dev_num = (int)strtol(dev_num_str, NULL, 10); + lun_name = spdk_conf_section_get_nmval(sp, "Dev", i, 1); + if (lun_name == NULL) { + SPDK_ERRLOG("%s: Invalid or missing LUN name for dev %d\n", name, dev_num); + return -1; + } else if (spdk_conf_section_get_nmval(sp, "Dev", i, 2)) { + SPDK_ERRLOG("%s: Only one LUN per vhost SCSI device supported\n", name); + return -1; + } + + if (spdk_vhost_scsi_ctrlr_add_dev(name, dev_num, lun_name) < 0) { return -1; } } diff --git a/test/vhost/ext4test/vhost.conf b/test/vhost/ext4test/vhost.conf index 1b41af505..faaac43d1 100644 --- a/test/vhost/ext4test/vhost.conf +++ b/test/vhost/ext4test/vhost.conf @@ -43,5 +43,5 @@ [VhostScsi0] Name naa.123 - Dev0 Nvme0n1 - Dev1 Malloc0 + Dev 0 Nvme0n1 + Dev 1 Malloc0