On Thu, Jul 23, 2015 at 06:13:49PM +0800, Luyao Huang wrote:
Signed-off-by: Luyao Huang <lhuang(a)redhat.com>
---
src/qemu/qemu_conf.h | 3 +
src/qemu/qemu_driver.c | 4 ++
src/qemu/qemu_process.c | 158 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 165 insertions(+)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 1c0c734..84b3b5e 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4321,6 +4321,154 @@ qemuPrepareNVRAM(virQEMUDriverConfigPtr cfg,
}
+static int
+qemuPrepareShmemDevice(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ virDomainShmemDefPtr shmem)
+{
+ int ret = -1;
+ virShmObjectPtr tmp;
+ virShmObjectListPtr list = driver->shmlist;
+ bool othercreate = false;
+ char *path = NULL;
+ bool teardownlabel = false;
+ bool teardownshm = false;
+ int type, fd;
+
+ virObjectLock(list);
+
+ if ((tmp = virShmObjectFindByName(list, shmem->name))) {
+ if (shmem->size > tmp->size) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Shmem object %s is already exists and "
+ "size is smaller than require size"),
+ tmp->name);
+ goto cleanup;
+ }
+
+ if (virShmSetUsedDomain(tmp, QEMU_DRIVER_NAME, vm->def->name) < 0)
+ goto cleanup;
+
+ if (virShmObjectSaveState(tmp, list->stateDir) < 0)
+ goto cleanup;
+
+ virObjectUnlock(list);
+ return 0;
+ }
+
+ if (!shmem->server.enabled) {
+ if ((fd = virShmCreate(shmem->name, shmem->size, false, &othercreate,
0600)) < 0)
+ goto cleanup;
+ VIR_FORCE_CLOSE(fd);
+
+ if ((ret = virShmBuildPath(shmem->name, &path)) == -1) {
+ ignore_value(virShmUnlink(shmem->name));
+ goto cleanup;
+ } else if (ret == -2 && !othercreate) {
+ ignore_value(virShmUnlink(shmem->name));
+ }
+ type = VIR_SHM_TYPE_SHM;
+ } else {
+ if (!virFileExists(shmem->server.chr.data.nix.path)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Shmem device server socket is not exist"));
+ goto cleanup;
+ } else {
+ othercreate = true;
+ }
+ type = VIR_SHM_TYPE_SERVER;
+ }
+ teardownshm = true;
+
+ if (virSecurityManagerSetShmemLabel(driver->securityManager,
+ vm->def, shmem, path) < 0)
+ goto cleanup;
You shouldn't be setting labelling at this point. That should be done
by the later call to virSecurityManagerSetAllLabel
+static int
+qemuCleanUpShmemDevice(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ virDomainShmemDefPtr shmem)
+{
+ virShmObjectPtr tmp;
+ virShmObjectListPtr list = driver->shmlist;
+ int ret = -1;
+
+ virObjectLock(list);
+
+ if (!(tmp = virShmObjectFindByName(list, shmem->name))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Cannot find share memory named '%s'"),
+ shmem->name);
+ goto cleanup;
+ }
+ if ((shmem->server.enabled && tmp->type != VIR_SHM_TYPE_SERVER) ||
+ (!shmem->server.enabled && tmp->type != VIR_SHM_TYPE_SHM)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Shmem object and shmem device type is not equal"));
+ goto cleanup;
+ }
+
+ if (virShmRemoveUsedDomain(tmp, QEMU_DRIVER_NAME, vm->def->name) < 0)
+ goto cleanup;
+
+ if (tmp->ndomains == 0) {
+ if (virSecurityManagerRestoreShmemLabel(driver->securityManager,
+ vm->def, shmem, tmp->path) <
0)
+ VIR_WARN("Unable to restore shared memory device labelling");
Likewise this should be left to the main label restore code
+
+ if (!shmem->server.enabled) {
+ if (!tmp->othercreate &&
+ virShmUnlink(tmp->name) < 0)
+ VIR_WARN("Unable to unlink shared memory object");
+ }
+
+ if (virShmObjectRemoveStateFile(list, tmp->name) < 0)
+ goto cleanup;
+ virShmObjectListDel(list, tmp);
+ virShmObjectFree(tmp);
+ }
+
+ ret = 0;
+ cleanup:
+ virObjectUnlock(list);
+ return ret;
+}
Regards,
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|