[libvirt] [PATCH 0/2] Fix libvirt for kernels without DM support

*** BLURB HERE *** Michal Prívozník (2): virDevMapperGetTargetsImpl: Be tolerant to kernels without DM support qemu_cgroup: Allow/disallow devmapper control iff available src/qemu/qemu_cgroup.c | 36 +++++++++++++++++++----------------- src/util/virdevmapper.c | 8 +++++++- 2 files changed, 26 insertions(+), 18 deletions(-) -- 2.16.4

https://bugzilla.redhat.com/show_bug.cgi?id=1591732 If kernel is compiled without CONFIG_BLK_DEV_DM enabled, there is no /dev/mapper/control device and since dm_task_create() actually does some ioctl() over it creating a task may fail. To cope with this handle ENOENT and ENODEV gracefully. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/util/virdevmapper.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/util/virdevmapper.c b/src/util/virdevmapper.c index b365f20145..7da0dba911 100644 --- a/src/util/virdevmapper.c +++ b/src/util/virdevmapper.c @@ -87,8 +87,14 @@ virDevMapperGetTargetsImpl(const char *path, return ret; } - if (!(dmt = dm_task_create(DM_DEVICE_DEPS))) + if (!(dmt = dm_task_create(DM_DEVICE_DEPS))) { + if (errno == ENOENT || errno == ENODEV) { + /* It's okay. Kernel is probably built without + * devmapper support. */ + ret = 0; + } return ret; + } if (!dm_task_set_name(dmt, path)) { if (errno == ENOENT) { -- 2.16.4

https://bugzilla.redhat.com/show_bug.cgi?id=1591732 On kernels without device mapper support there won't be /dev/mapper/control. Therefore it doesn't make much sense to put it into devices CGroup. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> --- src/qemu/qemu_cgroup.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index c8fba7f9e6..43e17d786e 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -129,6 +129,7 @@ qemuSetupImageCgroupInternal(virDomainObjPtr vm, } if (virStoragePRDefIsManaged(src->pr) && + virFileExists(DEVICE_MAPPER_CONTROL_PATH) && qemuSetupImagePathCgroup(vm, DEVICE_MAPPER_CONTROL_PATH, false) < 0) return -1; @@ -163,28 +164,29 @@ qemuTeardownImageCgroup(virDomainObjPtr vm, return 0; } - for (i = 0; i < vm->def->ndisks; i++) { - virStorageSourcePtr diskSrc = vm->def->disks[i]->src; + if (virFileExists(DEVICE_MAPPER_CONTROL_PATH)) { + for (i = 0; i < vm->def->ndisks; i++) { + virStorageSourcePtr diskSrc = vm->def->disks[i]->src; - if (src == diskSrc) - continue; + if (src == diskSrc) + continue; - if (virStoragePRDefIsManaged(diskSrc->pr)) - break; - } + if (virStoragePRDefIsManaged(diskSrc->pr)) + break; + } - if (i == vm->def->ndisks) { - VIR_DEBUG("Disabling device mapper control"); - ret = virCgroupDenyDevicePath(priv->cgroup, - DEVICE_MAPPER_CONTROL_PATH, perms, true); - virDomainAuditCgroupPath(vm, priv->cgroup, "deny", - DEVICE_MAPPER_CONTROL_PATH, - virCgroupGetDevicePermsString(perms), ret); - if (ret < 0) - return ret; + if (i == vm->def->ndisks) { + VIR_DEBUG("Disabling device mapper control"); + ret = virCgroupDenyDevicePath(priv->cgroup, + DEVICE_MAPPER_CONTROL_PATH, perms, true); + virDomainAuditCgroupPath(vm, priv->cgroup, "deny", + DEVICE_MAPPER_CONTROL_PATH, + virCgroupGetDevicePermsString(perms), ret); + if (ret < 0) + return ret; + } } - VIR_DEBUG("Deny path %s", src->path); ret = virCgroupDenyDevicePath(priv->cgroup, src->path, perms, true); -- 2.16.4

On Fri, Jul 13, 2018 at 03:48:25PM +0200, Michal Privoznik wrote:
*** BLURB HERE ***
Michal Prívozník (2): virDevMapperGetTargetsImpl: Be tolerant to kernels without DM support qemu_cgroup: Allow/disallow devmapper control iff available
src/qemu/qemu_cgroup.c | 36 +++++++++++++++++++----------------- src/util/virdevmapper.c | 8 +++++++- 2 files changed, 26 insertions(+), 18 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (2)
-
Ján Tomko
-
Michal Privoznik