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 <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2013-03-15 15:07:13 +00:00
parent 1760258cc3
commit 0a418355cc

View File

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