From 0a418355cc1ba704be67ae3c80fbfff0cfe71004 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 15 Mar 2013 15:07:13 +0000 Subject: [PATCH] Do not prematurely close loop devices in LXC controller The LXC controller is closing loop devices as soon as the container has started. This is fine if the loop device was setup as a mounted filesystem, but if we're just passing through the loop device as a disk, nothing else is keeping it open. Thus we must keep the loop device FDs open for as long the libvirt_lxc process is running. Signed-off-by: Daniel P. Berrange --- src/lxc/lxc_controller.c | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index 1508b9c281..91dd8f1a7c 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -199,22 +199,12 @@ error: } -static int virLXCControllerCloseLoopDevices(virLXCControllerPtr ctrl, - bool force) +static int virLXCControllerCloseLoopDevices(virLXCControllerPtr ctrl) { size_t i; - for (i = 0 ; i < ctrl->nloopDevs ; i++) { - if (force) { - VIR_FORCE_CLOSE(ctrl->loopDevFds[i]); - } else { - if (VIR_CLOSE(ctrl->loopDevFds[i]) < 0) { - virReportSystemError(errno, "%s", - _("Unable to close loop device")); - return -1; - } - } - } + for (i = 0 ; i < ctrl->nloopDevs ; i++) + VIR_FORCE_CLOSE(ctrl->loopDevFds[i]); return 0; } @@ -225,7 +215,7 @@ static void virLXCControllerStopInit(virLXCControllerPtr ctrl) if (ctrl->initpid == 0) return; - virLXCControllerCloseLoopDevices(ctrl, true); + virLXCControllerCloseLoopDevices(ctrl); virProcessAbort(ctrl->initpid); ctrl->initpid = 0; } @@ -1546,10 +1536,6 @@ virLXCControllerRun(virLXCControllerPtr ctrl) /* Now the container is fully setup... */ - /* ...we can close the loop devices... */ - if (virLXCControllerCloseLoopDevices(ctrl, false) < 0) - goto cleanup; - /* ...and reduce our privileges */ if (lxcControllerClearCapabilities() < 0) goto cleanup;