X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fubox.git;a=blobdiff_plain;f=mount_root.c;h=ad1de363544afa813d95b1a1fb87321e75003566;hp=96d1007dea91524fc32e6ec41b784f53358db264;hb=3eddeb76f22273f540504de78cb147fe6d60c9f2;hpb=ab78547f19ce30efc845ce1229b766eddb8efa16;ds=sidebyside diff --git a/mount_root.c b/mount_root.c index 96d1007..ad1de36 100644 --- a/mount_root.c +++ b/mount_root.c @@ -97,6 +97,37 @@ static int find_overlay_mount(char *overlay) return ret; } +static char* find_mount(char *mp) +{ + FILE *fp = fopen("/proc/mounts", "r"); + static char line[256]; + char *point = NULL; + + if(!fp) + return NULL; + + while (fgets(line, sizeof(line), fp)) { + char *s, *t = strstr(line, " "); + + if (!t) + return NULL; + t++; + s = strstr(t, " "); + if (!s) + return NULL; + *s = '\0'; + + if (!strcmp(t, mp)) { + fclose(fp); + return t; + } + } + + fclose(fp); + + return point; +} + static char* find_mount_point(char *block, char *fs) { FILE *fp = fopen("/proc/mounts", "r"); @@ -219,7 +250,6 @@ static int mtd_mount_jffs2(void) { char rootfs_data[32]; - if (mkdir("/tmp/overlay", 0755)) { ERROR("failed to mkdir /tmp/overlay: %s\n", strerror(errno)); return -1; @@ -311,7 +341,7 @@ static int mount_move(char *oldroot, char *newroot, char *dir) char newdir[64]; int ret; - DEBUG(2, "%s %s\n", oldroot, dir); + DEBUG(2, "%s %s %s\n", oldroot, newroot, dir); snprintf(olddir, sizeof(olddir), "%s%s", oldroot, dir); snprintf(newdir, sizeof(newdir), "%s%s", newroot, dir); @@ -353,12 +383,10 @@ static int pivot(char *new, char *old) mount_move(old, "", "/tmp"); mount_move(old, "", "/sys"); mount_move(old, "", "/overlay"); - mount_move(old, "", "/extroot"); return 0; } - static int fopivot(char *rw_root, char *ro_root) { char overlay[64], lowerdir[64]; @@ -534,14 +562,34 @@ static int extroot(void) waitpid(pid, &status, 0); if (!WEXITSTATUS(status)) { - if (mount_move("/tmp", "", "/overlay")) { - ERROR("moving extroot failed - continue normal boot\n"); - umount("/tmp/overlay"); - } else if (fopivot("/overlay", "/rom")) { - ERROR("switching to extroot failed - continue normal boot\n"); - umount("/overlay"); - } else { - return 0; + if (find_mount("/tmp/mnt")) { + mount("/dev/root", "/", NULL, MS_NOATIME | MS_REMOUNT | MS_RDONLY, 0); + + mkdir("/tmp/mnt/proc", 0755); + mkdir("/tmp/mnt/dev", 0755); + mkdir("/tmp/mnt/sys", 0755); + mkdir("/tmp/mnt/tmp", 0755); + mkdir("/tmp/mnt/rom", 0755); + + if (mount_move("/tmp", "", "/mnt")) { + ERROR("moving pivotroot failed - continue normal boot\n"); + umount("/tmp/mnt"); + } else if (pivot("/mnt", "/rom")) { + ERROR("switching to pivotroot failed - continue normal boot\n"); + umount("/mnt"); + } else { + return 0; + } + } else if (find_mount("/tmp/overlay")) { + if (mount_move("/tmp", "", "/overlay")) { + ERROR("moving extroot failed - continue normal boot\n"); + umount("/tmp/overlay"); + } else if (fopivot("/overlay", "/rom")) { + ERROR("switching to extroot failed - continue normal boot\n"); + umount("/overlay"); + } else { + return 0; + } } } }