conf: Add 'fdgroup' attribute for 'file' disks

The 'fdgroup' will allow users to specify a passed FD (via the
'virDomainFDAssociate()' API) to be used instead of opening a path.
This is useful in cases when e.g. the file is not accessible from inside
a container.

Since this uses the same disk type as when we open files via names this
patch also introduces a hypervisor feature which the hypervisor asserts
that code paths are ready for this possibility.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
This commit is contained in:
Peter Krempa 2022-05-02 18:51:45 +02:00
parent 0fcdb512d4
commit 98bd201678
9 changed files with 68 additions and 1 deletions

View File

@ -2701,6 +2701,14 @@ paravirtualized driver is specified via the ``disk`` element.
``file``
The ``file`` attribute specifies the fully-qualified path to the file
holding the disk. :since:`Since 0.0.3`
:since:`Since 9.0.0` a new optional attribute ``fdgroup`` can be added
instructing to access the disk via file descriptiors associated to the
domain object via the ``virDomainFDAssociate()`` API rather than opening
the files. The files do not necessarily have to be accessible by libvirt
via the filesystem. The filename passed via ``file`` can still be used
to generate paths to write into image metadata when doing block operations
but libvirt will not access these natively.
``block``
The ``dev`` attribute specifies the fully-qualified path to the host
device to serve as the disk. :since:`Since 0.0.3`

View File

@ -7345,6 +7345,7 @@ virDomainStorageSourceParse(xmlNodePtr node,
switch (src->type) {
case VIR_STORAGE_TYPE_FILE:
src->path = virXMLPropString(node, "file");
src->fdgroup = virXMLPropString(node, "fdgroup");
break;
case VIR_STORAGE_TYPE_BLOCK:
src->path = virXMLPropString(node, "dev");
@ -21877,6 +21878,7 @@ virDomainDiskSourceFormat(virBuffer *buf,
switch (src->type) {
case VIR_STORAGE_TYPE_FILE:
virBufferEscapeString(&attrBuf, " file='%s'", src->path);
virBufferEscapeString(&attrBuf, " fdgroup='%s'", src->fdgroup);
break;
case VIR_STORAGE_TYPE_BLOCK:

View File

@ -3167,6 +3167,7 @@ typedef enum {
VIR_DOMAIN_DEF_FEATURE_NO_BOOT_ORDER = (1 << 6),
VIR_DOMAIN_DEF_FEATURE_FW_AUTOSELECT = (1 << 7),
VIR_DOMAIN_DEF_FEATURE_NET_MODEL_STRING = (1 << 8),
VIR_DOMAIN_DEF_FEATURE_DISK_FD = (1 << 9),
} virDomainDefFeatures;

View File

@ -885,6 +885,15 @@ virDomainDeviceDefPostParseCheckFeatures(virDomainDeviceDef *dev,
return -1;
}
if (dev->type == VIR_DOMAIN_DEVICE_DISK &&
dev->data.disk->src->fdgroup &&
UNSUPPORTED(VIR_DOMAIN_DEF_FEATURE_DISK_FD)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("driver does not support FD passing for disk '%s'"),
dev->data.disk->dst);
return -1;
}
return 0;
}
#undef UNSUPPORTED

View File

@ -1806,6 +1806,9 @@
<ref name="vmwarePath"/>
</choice>
</attribute>
<optional>
<attribute name="fdgroup"/>
</optional>
</optional>
<ref name="diskSourceCommon"/>
<optional>

View File

@ -817,6 +817,7 @@ virStorageSourceCopy(const virStorageSource *src,
def->drv = NULL;
def->path = g_strdup(src->path);
def->fdgroup = g_strdup(src->fdgroup);
def->volume = g_strdup(src->volume);
def->relPath = g_strdup(src->relPath);
def->backingStoreRaw = g_strdup(src->backingStoreRaw);
@ -1123,6 +1124,7 @@ virStorageSourceClear(virStorageSource *def)
return;
VIR_FREE(def->path);
VIR_FREE(def->fdgroup);
VIR_FREE(def->volume);
VIR_FREE(def->snapshot);
VIR_FREE(def->configFile);

View File

@ -289,6 +289,7 @@ struct _virStorageSource {
unsigned int id; /* backing chain identifier, 0 is unset */
virStorageType type;
char *path;
char *fdgroup; /* name of group of file descriptors the user wishes to use instead of 'path' */
int protocol; /* virStorageNetProtocol */
char *volume; /* volume name for remote storage */
char *snapshot; /* for storage systems supporting internal snapshots */

View File

@ -607,7 +607,8 @@ virDomainDefParserConfig virAAHelperDomainDefParserConfig = {
.features = VIR_DOMAIN_DEF_FEATURE_MEMORY_HOTPLUG |
VIR_DOMAIN_DEF_FEATURE_OFFLINE_VCPUPIN |
VIR_DOMAIN_DEF_FEATURE_INDIVIDUAL_VCPUS |
VIR_DOMAIN_DEF_FEATURE_NET_MODEL_STRING,
VIR_DOMAIN_DEF_FEATURE_NET_MODEL_STRING |
VIR_DOMAIN_DEF_FEATURE_DISK_FD,
};
static int

View File

@ -0,0 +1,40 @@
<domain type='qemu'>
<name>QEMUGuest1</name>
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
<memory unit='KiB'>219136</memory>
<currentMemory unit='KiB'>219136</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='hd'/>
</os>
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/path/to/blah' fdgroup='testgroup2'/>
<target dev='vde' bus='virtio'/>
</disk>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/rhel7.1484071880' fdgroup='testgroup5'/>
<backingStore type='file'>
<format type='qcow2'/>
<source file='/var/lib/libvirt/images/rhel7.1484071877' fdgroup='testgroup6'/>
<backingStore type='file'>
<format type='qcow2'/>
<source file='/var/lib/libvirt/images/rhel7.1484071876'/>
<backingStore/>
</backingStore>
</backingStore>
<target dev='vdf' bus='virtio'/>
</disk>
<controller type='usb'/>
<controller type='pci' model='pci-root'/>
<memballoon model='virtio'/>
</devices>
</domain>