On 07/30/2015 06:23 PM, Daniel P. Berrange wrote:
On Thu, Jul 23, 2015 at 06:13:49PM +0800, Luyao Huang wrote:
Signed-off-by: Luyao Huang <lhu...@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

Okay, i see, i will move it 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

Okay, Thanks a lot for your review and advise.

+
+        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

Luyao

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to