bdev: change name and product_name to char *

Dynamically allocate bdev names to remove the arbitrary 16-character
name length limit.

All of the existing product_names are constant strings, so those can
just use string literals instead of a copy per bdev.

Change-Id: I3280da67a4fcf2e4ec8ee8193362ca1b96a9c0cb
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/363601
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Daniel Verkamp 2017-06-02 10:25:43 -07:00
parent 7bc1a7d1a6
commit bac4c02bc4
10 changed files with 81 additions and 29 deletions

View File

@ -79,9 +79,6 @@
* must be passed to the bdev database via spdk_bdev_register().
*/
#define SPDK_BDEV_MAX_NAME_LENGTH 16
#define SPDK_BDEV_MAX_PRODUCT_NAME_LENGTH 50
/** Block device module */
struct spdk_bdev_module_if {
/**
@ -170,10 +167,10 @@ struct spdk_bdev {
void *ctxt;
/** Unique name for this block device. */
char name[SPDK_BDEV_MAX_NAME_LENGTH];
char *name;
/** Unique product name for this kind of block device. */
char product_name[SPDK_BDEV_MAX_PRODUCT_NAME_LENGTH];
char *product_name;
/** Size in bytes of a logical block for the backend */
uint32_t blocklen;

View File

@ -332,6 +332,7 @@ static void aio_free_disk(struct file_disk *fdisk)
{
if (fdisk == NULL)
return;
free(fdisk->disk.name);
free(fdisk);
}
@ -355,8 +356,11 @@ create_aio_disk(const char *name, const char *fname)
fdisk->size = spdk_fd_get_size(fdisk->fd);
TAILQ_INIT(&fdisk->sync_completion_list);
snprintf(fdisk->disk.name, SPDK_BDEV_MAX_NAME_LENGTH, "%s", name);
snprintf(fdisk->disk.product_name, SPDK_BDEV_MAX_PRODUCT_NAME_LENGTH, "AIO disk");
fdisk->disk.name = strdup(name);
if (!fdisk->disk.name) {
goto error_return;
}
fdisk->disk.product_name = "AIO disk";
fdisk->disk.need_aligned_buffer = 1;
fdisk->disk.write_cache = 1;

View File

@ -60,7 +60,6 @@ struct file_disk {
struct spdk_bdev disk;
const char *file;
int fd;
char disk_name[SPDK_BDEV_MAX_NAME_LENGTH];
uint64_t size;
/**

View File

@ -123,7 +123,7 @@ spdk_bdev_get_by_name(const char *bdev_name)
struct spdk_bdev *bdev = spdk_bdev_first();
while (bdev != NULL) {
if (strncmp(bdev_name, bdev->name, sizeof(bdev->name)) == 0) {
if (strcmp(bdev_name, bdev->name) == 0) {
return bdev;
}
bdev = spdk_bdev_next(bdev);

View File

@ -40,6 +40,7 @@
#include "spdk/conf.h"
#include "spdk/endian.h"
#include "spdk/nvme_spec.h"
#include "spdk/string.h"
#include "spdk_internal/bdev.h"
#include "spdk_internal/log.h"
@ -120,6 +121,17 @@ vbdev_error_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev
pthread_mutex_unlock(&g_vbdev_error_mutex);
}
static void
vbdev_error_disk_free(struct vbdev_error_disk *disk)
{
if (!disk) {
return;
}
free(disk->disk.name);
free(disk);
}
static void
vbdev_error_free(struct vbdev_error_disk *error_disk)
{
@ -130,7 +142,7 @@ vbdev_error_free(struct vbdev_error_disk *error_disk)
TAILQ_REMOVE(&g_vbdev_error_disks, error_disk, tailq);
spdk_bdev_unclaim(error_disk->base_bdev);
free(error_disk);
vbdev_error_disk_free(error_disk);
}
static int
@ -203,8 +215,12 @@ spdk_vbdev_error_create(struct spdk_bdev *base_bdev)
disk->base_bdev = base_bdev;
memcpy(&disk->disk, base_bdev, sizeof(*base_bdev));
snprintf(disk->disk.name, sizeof(disk->disk.name), "EE_%s", base_bdev->name);
snprintf(disk->disk.product_name, sizeof(disk->disk.product_name), "Error Injection Disk");
disk->disk.name = spdk_sprintf_alloc("EE_%s", base_bdev->name);
if (!disk->disk.name) {
rc = -ENOMEM;
goto cleanup;
}
disk->disk.product_name = "Error Injection Disk";
disk->disk.ctxt = disk;
disk->disk.fn_table = &vbdev_error_fn_table;
@ -215,7 +231,7 @@ spdk_vbdev_error_create(struct spdk_bdev *base_bdev)
rc = 0;
return rc;
cleanup:
free(disk);
vbdev_error_disk_free(disk);
return rc;
}

View File

@ -41,6 +41,7 @@
#include "spdk/env.h"
#include "spdk/copy_engine.h"
#include "spdk/io_channel.h"
#include "spdk/string.h"
#include "spdk_internal/bdev.h"
#include "spdk_internal/log.h"
@ -124,13 +125,24 @@ blockdev_malloc_delete_from_list(struct malloc_disk *malloc_disk)
}
}
static void
malloc_disk_free(struct malloc_disk *malloc_disk)
{
if (!malloc_disk) {
return;
}
free(malloc_disk->disk.name);
spdk_dma_free(malloc_disk->malloc_buf);
spdk_dma_free(malloc_disk);
}
static int
blockdev_malloc_destruct(void *ctx)
{
struct malloc_disk *malloc_disk = ctx;
blockdev_malloc_delete_from_list(malloc_disk);
spdk_dma_free(malloc_disk->malloc_buf);
spdk_dma_free(malloc_disk);
malloc_disk_free(malloc_disk);
return 0;
}
@ -391,12 +403,16 @@ struct spdk_bdev *create_malloc_disk(uint64_t num_blocks, uint32_t block_size)
mdisk->malloc_buf = spdk_dma_zmalloc(num_blocks * block_size, 2 * 1024 * 1024, NULL);
if (!mdisk->malloc_buf) {
SPDK_ERRLOG("spdk_dma_zmalloc failed\n");
spdk_dma_free(mdisk);
malloc_disk_free(mdisk);
return NULL;
}
snprintf(mdisk->disk.name, SPDK_BDEV_MAX_NAME_LENGTH, "Malloc%d", malloc_disk_count);
snprintf(mdisk->disk.product_name, SPDK_BDEV_MAX_PRODUCT_NAME_LENGTH, "Malloc disk");
mdisk->disk.name = spdk_sprintf_alloc("Malloc%d", malloc_disk_count);
if (!mdisk->disk.name) {
malloc_disk_free(mdisk);
return NULL;
}
mdisk->disk.product_name = "Malloc disk";
malloc_disk_count++;
mdisk->disk.write_cache = 1;

View File

@ -63,6 +63,7 @@ blockdev_null_destruct(void *ctx)
struct null_bdev *bdev = ctx;
TAILQ_REMOVE(&g_null_bdev_head, bdev, tailq);
free(bdev->bdev.name);
spdk_dma_free(bdev);
return 0;
@ -141,8 +142,12 @@ create_null_bdev(const char *name, uint64_t num_blocks, uint32_t block_size)
return NULL;
}
snprintf(bdev->bdev.name, SPDK_BDEV_MAX_NAME_LENGTH, "%s", name);
snprintf(bdev->bdev.product_name, SPDK_BDEV_MAX_PRODUCT_NAME_LENGTH, "Null disk");
bdev->bdev.name = strdup(name);
if (!bdev->bdev.name) {
spdk_dma_free(bdev);
return NULL;
}
bdev->bdev.product_name = "Null disk";
bdev->bdev.write_cache = 0;
bdev->bdev.blocklen = block_size;

View File

@ -204,6 +204,7 @@ bdev_nvme_destruct(void *ctx)
nvme_ctrlr->ref--;
TAILQ_REMOVE(&g_nvme_bdevs, nvme_disk, link);
free(nvme_disk->disk.name);
free(nvme_disk);
if (nvme_ctrlr->ref == 0) {
@ -942,10 +943,12 @@ nvme_ctrlr_create_bdevs(struct nvme_ctrlr *nvme_ctrlr)
bdev->ns = ns;
nvme_ctrlr->ref++;
snprintf(bdev->disk.name, SPDK_BDEV_MAX_NAME_LENGTH,
"%sn%d", nvme_ctrlr->name, spdk_nvme_ns_get_id(ns));
snprintf(bdev->disk.product_name, SPDK_BDEV_MAX_PRODUCT_NAME_LENGTH,
"NVMe disk");
bdev->disk.name = spdk_sprintf_alloc("%sn%d", nvme_ctrlr->name, spdk_nvme_ns_get_id(ns));
if (!bdev->disk.name) {
free(bdev);
return;
}
bdev->disk.product_name = "NVMe disk";
if (cdata->oncs.dsm) {
/*

View File

@ -44,6 +44,7 @@
#include "spdk/log.h"
#include "spdk/bdev.h"
#include "spdk/io_channel.h"
#include "spdk/string.h"
#include "spdk_internal/bdev.h"
@ -80,6 +81,7 @@ blockdev_rbd_free(struct blockdev_rbd *rbd)
return;
}
free(rbd->disk.name);
free(rbd->rbd_name);
free(rbd->pool_name);
free(rbd);
@ -522,9 +524,12 @@ spdk_bdev_rbd_create(const char *pool_name, const char *rbd_name, uint32_t block
return NULL;
}
snprintf(rbd->disk.name, SPDK_BDEV_MAX_NAME_LENGTH, "Ceph%d",
blockdev_rbd_count);
snprintf(rbd->disk.product_name, SPDK_BDEV_MAX_PRODUCT_NAME_LENGTH, "Ceph Rbd Disk");
rbd->disk.name = spdk_sprintf_alloc("Ceph%d", blockdev_rbd_count);
if (!rbd->disk.name) {
blockdev_rbd_free(rbd);
return NULL;
}
rbd->disk.product_name = "Ceph Rbd Disk";
blockdev_rbd_count++;
rbd->disk.write_cache = 0;

View File

@ -41,6 +41,7 @@
#include "spdk/rpc.h"
#include "spdk/conf.h"
#include "spdk/endian.h"
#include "spdk/string.h"
#include "spdk_internal/bdev.h"
#include "spdk_internal/log.h"
@ -167,6 +168,7 @@ vbdev_split_free(struct split_disk *split_disk)
split_base = split_disk->split_base;
TAILQ_REMOVE(&g_split_disks, split_disk, tailq);
free(split_disk->disk.name);
free(split_disk);
if (split_base) {
@ -295,8 +297,13 @@ vbdev_split_create(struct spdk_bdev *base_bdev, uint64_t split_count, uint64_t s
d->disk.max_unmap_bdesc_count = base_bdev->max_unmap_bdesc_count;
/* Append partition number to the base bdev's name, e.g. Malloc0 -> Malloc0p0 */
snprintf(d->disk.name, sizeof(d->disk.name), "%sp%" PRIu64, spdk_bdev_get_name(base_bdev), i);
snprintf(d->disk.product_name, sizeof(d->disk.product_name), "Split Disk");
d->disk.name = spdk_sprintf_alloc("%sp%" PRIu64, spdk_bdev_get_name(base_bdev), i);
if (!d->disk.name) {
free(d);
rc = -ENOMEM;
goto cleanup;
}
d->disk.product_name = "Split Disk";
d->base_bdev = base_bdev;
d->offset_bytes = offset_bytes;
d->offset_blocks = offset_blocks;