]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Use 'overlay' as fs name when needed
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Mon, 26 Jan 2015 05:58:50 +0000 (05:58 +0000)
committerStéphane Graber <stgraber@ubuntu.com>
Fri, 30 Jan 2015 09:05:00 +0000 (10:05 +0100)
Close #389

We will probably also want to switch the order of the mount attempts, as
the new overlay fs should quickly become the more common scenario.

Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
Acked-by: KATOH Yasufumi <karma@jazz.email.ne.jp>
Acked-by: Stéphane Graber <stgraber@ubuntu.com>
src/lxc/bdev.c

index 7eae8df8083e624002d4559634b345fafab593e6..d29a38699e279d0355595512a1c3a3341eb8f1c7 100644 (file)
@@ -2147,6 +2147,28 @@ static int overlayfs_detect(const char *path)
        return 0;
 }
 
+static char *overlayfs_name;
+static char *detect_overlayfs_name(void)
+{
+       char *v = "overlayfs";
+       char *line = NULL;
+       size_t len = 0;
+       FILE *f = fopen("/proc/filesystems", "r");
+       if (!f)
+               return v;
+
+       while (getline(&line, &len, f) != -1) {
+               if (strcmp(line, "nodev\toverlay\n") == 0) {
+                       v = "overlay";
+                       break;
+               }
+       }
+
+       fclose(f);
+       free(line);
+       return v;
+}
+
 //
 // XXXXXXX plain directory bind mount ops
 //
@@ -2165,6 +2187,9 @@ static int overlayfs_mount(struct bdev *bdev)
        if (!bdev->src || !bdev->dest)
                return -22;
 
+       if (!overlayfs_name)
+               overlayfs_name = detect_overlayfs_name();
+
        //  separately mount it first
        //  mount -t overlayfs -oupperdir=${upper},lowerdir=${lower} lower dest
        dup = alloca(strlen(bdev->src)+1);
@@ -2225,13 +2250,13 @@ static int overlayfs_mount(struct bdev *bdev)
        }
 
        // mount without workdir option for overlayfs before v21
-       ret = mount(lower, bdev->dest, "overlayfs", MS_MGC_VAL | mntflags, options);
+       ret = mount(lower, bdev->dest, overlayfs_name, MS_MGC_VAL | mntflags, options);
        if (ret < 0) {
                INFO("overlayfs: error mounting %s onto %s options %s. retry with workdir",
                        lower, bdev->dest, options);
 
                // retry with workdir option for overlayfs v22 and higher
-               ret = mount(lower, bdev->dest, "overlayfs", MS_MGC_VAL | mntflags, options_work);
+               ret = mount(lower, bdev->dest, overlayfs_name, MS_MGC_VAL | mntflags, options_work);
                if (ret < 0)
                        SYSERROR("overlayfs: error mounting %s onto %s options %s",
                                lower, bdev->dest, options_work);