[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v4 13/25] block/nbd: Implement bdrv_dirname()
From: |
Max Reitz |
Subject: |
[Qemu-block] [PATCH v4 13/25] block/nbd: Implement bdrv_dirname() |
Date: |
Mon, 16 Jan 2017 21:49:09 +0100 |
The idea behind this implementation is that the export name might be
interpreted as a path (which is the only apparent interpretation of
relative filenames for NBD paths).
The default implementation of bdrv_dirname() would handle that just fine
for nbd+tcp, but not for nbd+unix, because in that case, the last
element of the path is the Unix socket path and not the export name.
Therefore, we need to implement an own bdrv_dirname() which uses the
legacy NBD URL which has the export name at the end.
Signed-off-by: Max Reitz <address@hidden>
---
block/nbd.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/block/nbd.c b/block/nbd.c
index 35f24be069..42f0cd638c 100644
--- a/block/nbd.c
+++ b/block/nbd.c
@@ -552,6 +552,34 @@ static void nbd_refresh_filename(BlockDriverState *bs,
QDict *options)
bs->full_open_options = opts;
}
+static char *nbd_dirname(BlockDriverState *bs, Error **errp)
+{
+ BDRVNBDState *s = bs->opaque;
+ const char *host = NULL, *port = NULL, *path = NULL;
+
+ if (s->saddr->type == SOCKET_ADDRESS_KIND_INET) {
+ const InetSocketAddress *inet = s->saddr->u.inet.data;
+ if (!inet->has_ipv4 && !inet->has_ipv6 && !inet->has_to) {
+ host = inet->host;
+ port = inet->port;
+ }
+ } else if (s->saddr->type == SOCKET_ADDRESS_KIND_UNIX) {
+ path = s->saddr->u.q_unix.data->path;
+ }
+
+ if (path) {
+ return g_strdup_printf("nbd:unix:%s:exportname=%s%s", path,
+ s->export ?: "", s->export ? "/" : "");
+ } else if (host) {
+ return g_strdup_printf("nbd://%s:%s/%s%s", host, port,
+ s->export ?: "", s->export ? "/" : "");
+ }
+
+ error_setg(errp, "Cannot generate a base directory for NBD node '%s'",
+ bs->filename);
+ return NULL;
+}
+
static BlockDriver bdrv_nbd = {
.format_name = "nbd",
.protocol_name = "nbd",
@@ -569,6 +597,7 @@ static BlockDriver bdrv_nbd = {
.bdrv_detach_aio_context = nbd_detach_aio_context,
.bdrv_attach_aio_context = nbd_attach_aio_context,
.bdrv_refresh_filename = nbd_refresh_filename,
+ .bdrv_dirname = nbd_dirname,
};
static BlockDriver bdrv_nbd_tcp = {
@@ -588,6 +617,7 @@ static BlockDriver bdrv_nbd_tcp = {
.bdrv_detach_aio_context = nbd_detach_aio_context,
.bdrv_attach_aio_context = nbd_attach_aio_context,
.bdrv_refresh_filename = nbd_refresh_filename,
+ .bdrv_dirname = nbd_dirname,
};
static BlockDriver bdrv_nbd_unix = {
@@ -607,6 +637,7 @@ static BlockDriver bdrv_nbd_unix = {
.bdrv_detach_aio_context = nbd_detach_aio_context,
.bdrv_attach_aio_context = nbd_attach_aio_context,
.bdrv_refresh_filename = nbd_refresh_filename,
+ .bdrv_dirname = nbd_dirname,
};
static void bdrv_nbd_init(void)
--
2.11.0
- [Qemu-block] [PATCH v4 08/25] block: Add bdrv_make_absolute_filename(), (continued)
- [Qemu-block] [PATCH v4 08/25] block: Add bdrv_make_absolute_filename(), Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 09/25] block: Fix bdrv_find_backing_image(), Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 10/25] block: Add bdrv_dirname(), Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 11/25] blkverify: Make bdrv_dirname() return NULL, Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 12/25] quorum: Make bdrv_dirname() return NULL, Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 13/25] block/nbd: Implement bdrv_dirname(),
Max Reitz <=
- [Qemu-block] [PATCH v4 14/25] block/nfs: Implement bdrv_dirname(), Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 15/25] block: Use bdrv_dirname() for relative filenames, Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 16/25] block: Add 'base-directory' BDS option, Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 17/25] iotests: Add quorum case to test 110, Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 19/25] block: Add BlockDriver.bdrv_gather_child_options, Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 18/25] block: Add sgfnt_runtime_opts to BlockDriver, Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 20/25] block: Generically refresh runtime options, Max Reitz, 2017/01/16
- [Qemu-block] [PATCH v4 22/25] block: Do not copy exact_filename from format file, Max Reitz, 2017/01/16