block: allow mounting UBIFS partition as extroot
[project/fstools.git] / libfstools / mount.c
index 903043f..e095455 100644 (file)
@@ -98,10 +98,13 @@ fopivot(char *rw_root, char *ro_root)
         */
        snprintf(lowerdir, sizeof(lowerdir), "lowerdir=/,upperdir=%s", rw_root);
        if (mount(overlay, "/mnt", "overlayfs", MS_NOATIME, lowerdir)) {
         */
        snprintf(lowerdir, sizeof(lowerdir), "lowerdir=/,upperdir=%s", rw_root);
        if (mount(overlay, "/mnt", "overlayfs", MS_NOATIME, lowerdir)) {
-               char upperdir[64], workdir[64];
+               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(upperdir, sizeof(upperdir), "%s/upper", rw_root);
                snprintf(workdir, sizeof(workdir), "%s/work", rw_root);
+               snprintf(upgrade, sizeof(upgrade), "%s/sysupgrade.tgz", rw_root);
+               snprintf(upgrade_dest, sizeof(upgrade_dest), "%s/sysupgrade.tgz", upperdir);
                snprintf(lowerdir, sizeof(lowerdir), "lowerdir=/,upperdir=%s,workdir=%s",
                         upperdir, workdir);
 
                snprintf(lowerdir, sizeof(lowerdir), "lowerdir=/,upperdir=%s,workdir=%s",
                         upperdir, workdir);
 
@@ -115,9 +118,16 @@ fopivot(char *rw_root, char *ro_root)
                mkdir(upperdir, 0755);
                mkdir(workdir, 0755);
 
                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, lowerdir)) {
+                       if (mount(overlay, "/mnt", "overlayfs", MS_NOATIME, lowerdir)) {
+                               fprintf(stderr, "mount failed: %s, options %s\n",
+                                       strerror(errno), lowerdir);
+                               return -1;
+                       }
                }
        }
 
                }
        }