block/nvme: Fix bdrv_refresh_filename()
Currently, nvme's bdrv_refresh_filename() is an exact copy of null's implementation. However, for null, "null-co://" and "null-aio://" are indeed valid filenames -- for nvme, they are not, as a device address is still required. The correct implementation should generate a filename of the form "nvme://[PCI address]/[namespace]" (as the comment above nvme_parse_filename() describes). Signed-off-by: Max Reitz <mreitz@redhat.com> Reviewed-by: Alberto Garcia <berto@igalia.com> Message-id: 20190201192935.18394-27-mreitz@redhat.com Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
fb695c74aa
commit
cc61b0740f
23
block/nvme.c
23
block/nvme.c
@ -111,6 +111,9 @@ typedef struct {
|
||||
|
||||
/* Total size of mapped qiov, accessed under dma_map_lock */
|
||||
int dma_map_count;
|
||||
|
||||
/* PCI address (required for nvme_refresh_filename()) */
|
||||
char *device;
|
||||
} BDRVNVMeState;
|
||||
|
||||
#define NVME_BLOCK_OPT_DEVICE "device"
|
||||
@ -557,6 +560,7 @@ static int nvme_init(BlockDriverState *bs, const char *device, int namespace,
|
||||
|
||||
qemu_co_mutex_init(&s->dma_map_lock);
|
||||
qemu_co_queue_init(&s->dma_flush_queue);
|
||||
s->device = g_strdup(device);
|
||||
s->nsid = namespace;
|
||||
s->aio_context = bdrv_get_aio_context(bs);
|
||||
ret = event_notifier_init(&s->irq_notifier, 0);
|
||||
@ -729,6 +733,8 @@ static void nvme_close(BlockDriverState *bs)
|
||||
event_notifier_cleanup(&s->irq_notifier);
|
||||
qemu_vfio_pci_unmap_bar(s->vfio, 0, (void *)s->regs, 0, NVME_BAR_SIZE);
|
||||
qemu_vfio_close(s->vfio);
|
||||
|
||||
g_free(s->device);
|
||||
}
|
||||
|
||||
static int nvme_file_open(BlockDriverState *bs, QDict *options, int flags,
|
||||
@ -1055,21 +1061,10 @@ static int nvme_reopen_prepare(BDRVReopenState *reopen_state,
|
||||
|
||||
static void nvme_refresh_filename(BlockDriverState *bs)
|
||||
{
|
||||
const QDictEntry *e;
|
||||
BDRVNVMeState *s = bs->opaque;
|
||||
|
||||
for (e = qdict_first(bs->full_open_options); e;
|
||||
e = qdict_next(bs->full_open_options, e))
|
||||
{
|
||||
/* These options can be ignored */
|
||||
if (strcmp(qdict_entry_key(e), "filename") &&
|
||||
strcmp(qdict_entry_key(e), "driver"))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(bs->exact_filename, sizeof(bs->exact_filename), "%s://",
|
||||
bs->drv->format_name);
|
||||
snprintf(bs->exact_filename, sizeof(bs->exact_filename), "nvme://%s/%i",
|
||||
s->device, s->nsid);
|
||||
}
|
||||
|
||||
static void nvme_refresh_limits(BlockDriverState *bs, Error **errp)
|
||||
|
Loading…
Reference in New Issue
Block a user