From 0778fc1ab9c39bb989d168ec44a980c3db943fca Mon Sep 17 00:00:00 2001 From: Matthieu Coudron Date: Thu, 6 Feb 2014 15:30:07 +0100 Subject: [PATCH] qemu_driver: Introduce support in device attach/detach This commit allows to attach/detach a device in qemu. For this purpose I'm introducing two new functions: virDomainFSInsert() and virDomainFSRemove() and adding necessary code in the qemu driver. It compares filesystems based on their "destination" folder. So if two filesystems share the same destination, they are considered equal and the qemu driver would reject the insertion. Signed-off-by: Matthieu Coudron --- src/conf/domain_conf.c | 16 ++++++++++++++++ src/conf/domain_conf.h | 3 +++ src/libvirt_private.syms | 2 ++ src/qemu/qemu_driver.c | 28 ++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 7ad2a904eb..512fe51520 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -17919,6 +17919,22 @@ virDiskNameToBusDeviceIndex(virDomainDiskDefPtr disk, return 0; } +int +virDomainFSInsert(virDomainDefPtr def, virDomainFSDefPtr fs) +{ + + return VIR_APPEND_ELEMENT(def->fss, def->nfss, fs); +} + +virDomainFSDefPtr +virDomainFSRemove(virDomainDefPtr def, size_t i) +{ + virDomainFSDefPtr fs = def->fss[i]; + + VIR_DELETE_ELEMENT(def->fss, i, def->nfss); + return fs; +} + virDomainFSDefPtr virDomainGetRootFilesystem(virDomainDefPtr def) { diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d8f2e49ded..9acb105124 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2555,7 +2555,10 @@ int virDiskNameToBusDeviceIndex(virDomainDiskDefPtr disk, int *devIdx); virDomainFSDefPtr virDomainGetRootFilesystem(virDomainDefPtr def); +int virDomainFSInsert(virDomainDefPtr def, virDomainFSDefPtr fs); int virDomainFSIndexByName(virDomainDefPtr def, const char *name); +virDomainFSDefPtr virDomainFSRemove(virDomainDefPtr def, size_t i); + int virDomainVideoDefaultType(const virDomainDef *def); int virDomainVideoDefaultRAM(const virDomainDef *def, int type); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index c5a7637cf7..2c9536aa9a 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -221,6 +221,8 @@ virDomainFeatureStateTypeFromString; virDomainFeatureStateTypeToString; virDomainFSDefFree; virDomainFSIndexByName; +virDomainFSInsert; +virDomainFSRemove; virDomainFSTypeFromString; virDomainFSTypeToString; virDomainFSWrpolicyTypeFromString; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8998201abb..944facb58d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6606,6 +6606,7 @@ qemuDomainAttachDeviceConfig(virQEMUCapsPtr qemuCaps, virDomainHostdevDefPtr hostdev; virDomainLeaseDefPtr lease; virDomainControllerDefPtr controller; + virDomainFSDefPtr fs; switch (dev->type) { case VIR_DOMAIN_DEVICE_DISK: @@ -6687,6 +6688,19 @@ qemuDomainAttachDeviceConfig(virQEMUCapsPtr qemuCaps, dev->data.chr = NULL; break; + case VIR_DOMAIN_DEVICE_FS: + fs = dev->data.fs; + if (virDomainFSIndexByName(vmdef, fs->dst) >= 0) { + virReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("Target already exists")); + return -1; + } + + if (virDomainFSInsert(vmdef, fs) < 0) + return -1; + dev->data.fs = NULL; + break; + default: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent attach of device '%s' is not supported"), @@ -6707,6 +6721,7 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, virDomainLeaseDefPtr lease, det_lease; virDomainControllerDefPtr cont, det_cont; virDomainChrDefPtr chr; + virDomainFSDefPtr fs; int idx; char mac[VIR_MAC_STRING_BUFLEN]; @@ -6783,6 +6798,19 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef, dev->data.chr = NULL; break; + case VIR_DOMAIN_DEVICE_FS: + fs = dev->data.fs; + idx = virDomainFSIndexByName(vmdef, fs->dst); + if (idx < 0) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("no matching filesystem device was found")); + return -1; + } + + fs = virDomainFSRemove(vmdef, idx); + virDomainFSDefFree(fs); + break; + default: virReportError(VIR_ERR_OPERATION_UNSUPPORTED, _("persistent detach of device '%s' is not supported"),