summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Ripard <maxime.ripard@free-electrons.com>2014-10-09 15:07:35 +0200
committerJohn Crispin <blogic@openwrt.org>2014-10-12 00:08:41 +0200
commitd71297353dc45eaf8f7c252246490746708530f9 (patch)
treec9b343a16a504b152e69cb7e6f1183328de0cc80
parent04f863c7d831a18d388db980cc85b2bac37b3c8d (diff)
downloadfstools-d71297353dc45eaf8f7c252246490746708530f9.tar.gz
libfstools/mount: Support latest overlayfs versions
The latest overlayfs revisions (v23 and above) require an additional directory to be given in the options. Since we need to support both pre-v23 and post-v23 versions, take a lazy approach and try to first mount without a workdir, and if it fails, try with it. Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
-rw-r--r--libfstools/mount.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/libfstools/mount.c b/libfstools/mount.c
index efcfcd8..903043f 100644
--- a/libfstools/mount.c
+++ b/libfstools/mount.c
@@ -90,11 +90,35 @@ fopivot(char *rw_root, char *ro_root)
}
snprintf(overlay, sizeof(overlay), "overlayfs:%s", rw_root);
- snprintf(lowerdir, sizeof(lowerdir), "lowerdir=/,upperdir=%s", rw_root);
+ /*
+ * First, try to mount without a workdir, for overlayfs v22 and before.
+ * If it fails, it means that we are probably using a v23 and
+ * later versions that require a workdir
+ */
+ snprintf(lowerdir, sizeof(lowerdir), "lowerdir=/,upperdir=%s", rw_root);
if (mount(overlay, "/mnt", "overlayfs", MS_NOATIME, lowerdir)) {
- fprintf(stderr, "mount failed: %s\n", strerror(errno));
- return -1;
+ char upperdir[64], workdir[64];
+
+ snprintf(upperdir, sizeof(upperdir), "%s/upper", rw_root);
+ snprintf(workdir, sizeof(workdir), "%s/work", rw_root);
+ snprintf(lowerdir, sizeof(lowerdir), "lowerdir=/,upperdir=%s,workdir=%s",
+ upperdir, workdir);
+
+ /*
+ * Overlay FS v23 and later requires both a upper and
+ * a work directory, both on the same filesystem, but
+ * not part of the same subtree.
+ * We can't really deal with these constraints without
+ * creating two new subdirectories in /overlay.
+ */
+ mkdir(upperdir, 0755);
+ mkdir(workdir, 0755);
+
+ if (mount(overlay, "/mnt", "overlayfs", MS_NOATIME, lowerdir)) {
+ fprintf(stderr, "mount failed: %s, options %s\n", strerror(errno), lowerdir);
+ return -1;
+ }
}
return pivot("/mnt", ro_root);