[libvirt] [PATCH 4/4] qemu: call the helpers in virshm.c to manage shmem device
lhuang
lhuang at redhat.com
Mon Aug 3 06:22:47 UTC 2015
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 at 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
More information about the libvir-list
mailing list