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