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;
}
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;
}
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;
}
* 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);
/*
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;
+ }
}
}