From: Eric Blake Date: Mon, 18 Nov 2013 23:43:06 +0000 (-0700) Subject: storage: add network-dir as new storage volume type X-Git-Tag: v1.2.0-rc1~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ecd881b7a77873dc7ca752522f7401f88722f471;p=thirdparty%2Flibvirt.git storage: add network-dir as new storage volume type In the 'directory' and 'netfs' storage pools, a user can see both 'file' and 'dir' storage volume types, to know when they can descend into a subdirectory. But in a network-based storage pool, such as the upcoming 'gluster' pool, we use 'network' instead of 'file', and did not have any counterpart for a directory until this patch. Adding a new volume type 'network-dir' is better than reusing 'dir', because it makes it clear that the only way to access 'network' volumes within that container is through the network mounting (leaving 'dir' for something accessible in the local file system). * include/libvirt/libvirt.h.in (virStorageVolType): Expand enum. * docs/formatstorage.html.in: Document it. * docs/schemasa/storagevol.rng (vol): Allow new value. * src/conf/storage_conf.c (virStorageVol): Use new value. * src/qemu/qemu_command.c (qemuBuildVolumeString): Fix client. * src/qemu/qemu_conf.c (qemuTranslateDiskSourcePool): Likewise. * tools/virsh-volume.c (vshVolumeTypeToString): Likewise. * src/storage/storage_backend_fs.c (virStorageBackendFileSystemVolDelete): Likewise. Signed-off-by: Eric Blake --- diff --git a/docs/formatstorage.html.in b/docs/formatstorage.html.in index 17c0313c66..a089a3108b 100644 --- a/docs/formatstorage.html.in +++ b/docs/formatstorage.html.in @@ -291,7 +291,7 @@ A storage volume will generally be either a file or a device node; since 1.2.0, an optional output-only attribute type lists the actual type - (file, block, dir, or network), which is also available + (file, block, dir, network, or netdir), which is also available from virStorageVolGetInfo(). The storage volume XML format is available since 0.4.1

diff --git a/docs/schemas/storagevol.rng b/docs/schemas/storagevol.rng index f8081d9c51..8f07d8f9d6 100644 --- a/docs/schemas/storagevol.rng +++ b/docs/schemas/storagevol.rng @@ -20,6 +20,7 @@ block dir network + netdir diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 146a59bb9d..5aad75c18e 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -2951,6 +2951,8 @@ typedef enum { VIR_STORAGE_VOL_BLOCK = 1, /* Block based volumes */ VIR_STORAGE_VOL_DIR = 2, /* Directory-passthrough based volume */ VIR_STORAGE_VOL_NETWORK = 3, /* Network volumes like RBD (RADOS Block Device) */ + VIR_STORAGE_VOL_NETDIR = 4, /* Network accessible directory that can + * contain other network volumes */ #ifdef VIR_ENUM_SENTINELS VIR_STORAGE_VOL_LAST diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c index e675777432..22e38c13ee 100644 --- a/src/conf/storage_conf.c +++ b/src/conf/storage_conf.c @@ -53,7 +53,7 @@ VIR_ENUM_IMPL(virStorageVol, VIR_STORAGE_VOL_LAST, - "file", "block", "dir", "network") + "file", "block", "dir", "network", "netdir") VIR_ENUM_IMPL(virStoragePool, VIR_STORAGE_POOL_LAST, diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 01fe45b8b1..763417fef1 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -3782,7 +3782,7 @@ qemuBuildVolumeString(virConnectPtr conn, { int ret = -1; - switch (disk->srcpool->voltype) { + switch ((virStorageVolType) disk->srcpool->voltype) { case VIR_STORAGE_VOL_DIR: if (!disk->readonly) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", @@ -3825,10 +3825,12 @@ qemuBuildVolumeString(virConnectPtr conn, } break; case VIR_STORAGE_VOL_NETWORK: + case VIR_STORAGE_VOL_NETDIR: + case VIR_STORAGE_VOL_LAST: /* Keep the compiler quiet, qemuTranslateDiskSourcePool already * reported the unsupported error. */ - break; + goto cleanup; } ret = 0; diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 5803850029..77df370087 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -1332,7 +1332,7 @@ qemuTranslateDiskSourcePool(virConnectPtr conn, goto cleanup; } - switch (info.type) { + switch ((virStorageVolType) info.type) { case VIR_STORAGE_VOL_FILE: case VIR_STORAGE_VOL_DIR: if (!(def->src = virStorageVolGetPath(vol))) @@ -1377,6 +1377,8 @@ qemuTranslateDiskSourcePool(virConnectPtr conn, break; case VIR_STORAGE_VOL_NETWORK: + case VIR_STORAGE_VOL_NETDIR: + case VIR_STORAGE_VOL_LAST: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("Using network volume as disk source is not supported")); goto cleanup; diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index 510a3d6384..11cf2df3af 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -1137,7 +1137,7 @@ virStorageBackendFileSystemVolDelete(virConnectPtr conn ATTRIBUTE_UNUSED, { virCheckFlags(0, -1); - switch (vol->type) { + switch ((virStorageVolType) vol->type) { case VIR_STORAGE_VOL_FILE: if (unlink(vol->target.path) < 0) { /* Silently ignore failures where the vol has already gone away */ @@ -1159,7 +1159,8 @@ virStorageBackendFileSystemVolDelete(virConnectPtr conn ATTRIBUTE_UNUSED, break; case VIR_STORAGE_VOL_BLOCK: case VIR_STORAGE_VOL_NETWORK: - default: + case VIR_STORAGE_VOL_NETDIR: + case VIR_STORAGE_VOL_LAST: virReportError(VIR_ERR_NO_SUPPORT, _("removing block or network volumes is not supported: %s"), vol->target.path); diff --git a/tools/virsh-volume.c b/tools/virsh-volume.c index cbdb3f0fa2..22b10d552e 100644 --- a/tools/virsh-volume.c +++ b/tools/virsh-volume.c @@ -947,7 +947,7 @@ out: static const char * vshVolumeTypeToString(int type) { - switch (type) { + switch ((virStorageVolType) type) { case VIR_STORAGE_VOL_FILE: return N_("file"); @@ -960,6 +960,9 @@ vshVolumeTypeToString(int type) case VIR_STORAGE_VOL_NETWORK: return N_("network"); + case VIR_STORAGE_VOL_NETDIR: + return N_("netdir"); + case VIR_STORAGE_VOL_LAST: break; }