libfstools: "lowerdir" variable name in fopivot
[project/fstools.git] / libfstools / mount.c
index 903043f940d5b938d0ada1c539b842ddddff7dd9..371082b64be89c2a47f78e63d37a9fa5527dcc65 100644 (file)
@@ -48,7 +48,7 @@ mount_move(char *oldroot, char *newroot, char *dir)
        ret = mount(olddir, newdir, NULL, MS_NOATIME | MS_MOVE, NULL);
 
 /*     if (ret)
-               fprintf(stderr, "failed %s %s: %s\n", olddir, newdir, strerror(errno));*/
+               ULOG_ERR("failed %s %s: %s\n", olddir, newdir, strerror(errno));*/
 
        return ret;
 }
@@ -67,7 +67,7 @@ pivot(char *new, char *old)
        ret = pivot_root(new, pivotdir);
 
        if (ret < 0) {
-               fprintf(stderr, "pivot_root failed %s %s: %s\n", new, pivotdir, strerror(errno));
+               ULOG_ERR("pivot_root failed %s %s: %s\n", new, pivotdir, strerror(errno));
                return -1;
        }
 
@@ -82,10 +82,10 @@ pivot(char *new, char *old)
 int
 fopivot(char *rw_root, char *ro_root)
 {
-       char overlay[64], lowerdir[64];
+       char overlay[64], mount_options[64];
 
        if (find_filesystem("overlay")) {
-               fprintf(stderr, "BUG: no suitable fs found\n");
+               ULOG_ERR("BUG: no suitable fs found\n");
                return -1;
        }
 
@@ -96,13 +96,16 @@ fopivot(char *rw_root, char *ro_root)
         * 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)) {
-               char upperdir[64], workdir[64];
+       snprintf(mount_options, sizeof(mount_options), "lowerdir=/,upperdir=%s", rw_root);
+       if (mount(overlay, "/mnt", "overlayfs", MS_NOATIME, mount_options)) {
+               char upperdir[64], workdir[64], upgrade[64], upgrade_dest[64];
+               struct stat st;
 
                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",
+               snprintf(upgrade, sizeof(upgrade), "%s/sysupgrade.tgz", rw_root);
+               snprintf(upgrade_dest, sizeof(upgrade_dest), "%s/sysupgrade.tgz", upperdir);
+               snprintf(mount_options, sizeof(mount_options), "lowerdir=/,upperdir=%s,workdir=%s",
                         upperdir, workdir);
 
                /*
@@ -115,9 +118,16 @@ fopivot(char *rw_root, char *ro_root)
                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;
+               if (stat(upgrade, &st) == 0)
+                   rename(upgrade, upgrade_dest);
+
+               /* Mainlined overlayfs has been renamed to "overlay", try that first */
+               if (mount(overlay, "/mnt", "overlay", MS_NOATIME, mount_options)) {
+                       if (mount(overlay, "/mnt", "overlayfs", MS_NOATIME, mount_options)) {
+                               ULOG_ERR("mount failed: %s, options %s\n",
+                                        strerror(errno), mount_options);
+                               return -1;
+                       }
                }
        }