X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffstools.git;a=blobdiff_plain;f=libfstools%2Fmount.c;h=e095455eebe702c513833c5860c1768fec8f2133;hp=903043f940d5b938d0ada1c539b842ddddff7dd9;hb=1a57eb9b7cc5e772d1090a23c51fdd4a01ec5df0;hpb=d71297353dc45eaf8f7c252246490746708530f9 diff --git a/libfstools/mount.c b/libfstools/mount.c index 903043f..e095455 100644 --- a/libfstools/mount.c +++ b/libfstools/mount.c @@ -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)) { - 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(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); @@ -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, lowerdir)) { + if (mount(overlay, "/mnt", "overlayfs", MS_NOATIME, lowerdir)) { + fprintf(stderr, "mount failed: %s, options %s\n", + strerror(errno), lowerdir); + return -1; + } } }