On 22.03.2013 15:24, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange(a)redhat.com>
For a root filesystem with type=file or type=block, the LXC
container was forgetting to actually mount it, before doing
the pivot root step.
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
src/lxc/lxc_container.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
index be9bc6c..002dba1 100644
--- a/src/lxc/lxc_container.c
+++ b/src/lxc/lxc_container.c
@@ -105,6 +105,9 @@ struct __lxc_child_argv {
int handshakefd;
};
+static int lxcContainerMountFSBlock(virDomainFSDefPtr fs,
+ const char *srcprefix);
+
1: ^^^
/*
* reboot(LINUX_REBOOT_CMD_CAD_ON) will return -EINVAL
@@ -406,6 +409,51 @@ static int lxcContainerChildMountSort(const void *a, const void *b)
# define MS_SLAVE (1<<19)
#endif
+static int lxcContainerPrepareRoot(virDomainDefPtr def,
+ virDomainFSDefPtr root)
+{
+ char *dst;
+ char *tmp;
+
+ if (root->type == VIR_DOMAIN_FS_TYPE_MOUNT)
+ return 0;
+
+ if (root->type == VIR_DOMAIN_FS_TYPE_FILE) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Unexpected root filesystem without loop device"));
+ return -1;
+ }
+
+ if (root->type != VIR_DOMAIN_FS_TYPE_BLOCK) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Unsupported root filesystem type %s"),
+ virDomainFSTypeToString(root->type));
+ return -1;
+ }
+
+ if (virAsprintf(&dst, "%s/%s.root",
+ LXC_STATE_DIR, def->name) < 0) {
+ virReportOOMError();
+ return -1;
+ }
+
+ tmp = root->dst;
+ root->dst = dst;
+
+ if (lxcContainerMountFSBlock(root, "") < 0) {
+ root->dst = tmp;
+ VIR_FREE(dst);
+ return -1;
+ }
+
+ root->dst = tmp;
+ root->type = VIR_DOMAIN_FS_TYPE_MOUNT;
+ VIR_FREE(root->src);
+ root->src = dst;
+
+ return 0;
+}
+
Any chance you can move this after the lxcContainerMountFSBlock() and
hence avoid [1]? Not a show stopper though. ACK.
Michal