OverlayFS version 23 and later require an additional directory to be given at
mount time.

Add a patch to the fstools to first test wether it can mount it without (for
older versions), and if not, use the new mechanism.

Signed-off-by: Maxime Ripard <maxime.rip...@free-electrons.com>
---
 ...s-mount-Support-latest-overlayfs-versions.patch | 63 ++++++++++++++++++++++
 1 file changed, 63 insertions(+)
 create mode 100644 
package/system/fstools/patches/0001-libfstools-mount-Support-latest-overlayfs-versions.patch

diff --git 
a/package/system/fstools/patches/0001-libfstools-mount-Support-latest-overlayfs-versions.patch
 
b/package/system/fstools/patches/0001-libfstools-mount-Support-latest-overlayfs-versions.patch
new file mode 100644
index 000000000000..0531f92c1a27
--- /dev/null
+++ 
b/package/system/fstools/patches/0001-libfstools-mount-Support-latest-overlayfs-versions.patch
@@ -0,0 +1,63 @@
+From abedad5d5d975022cbf6a5c6683c244bf79eadf6 Mon Sep 17 00:00:00 2001
+From: Maxime Ripard <maxime.rip...@free-electrons.com>
+Date: Thu, 9 Oct 2014 15:07:35 +0200
+Subject: [PATCH] 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.rip...@free-electrons.com>
+---
+ libfstools/mount.c | 30 +++++++++++++++++++++++++++---
+ 1 file changed, 27 insertions(+), 3 deletions(-)
+
+diff --git a/libfstools/mount.c b/libfstools/mount.c
+index efcfcd8bcf15..903043f940d5 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);
+-- 
+2.1.1
+
-- 
2.1.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to