static int make_volatile(const char *path) { _cleanup_free_ char *old_usr = NULL; int r; assert(path); r = chase_symlinks("/usr", path, CHASE_PREFIX_ROOT, &old_usr); if (r < 0) return log_error_errno(r, "/usr not available in old root: %m"); r = mkdir_p("/run/systemd/volatile-sysroot", 0700); if (r < 0) return log_error_errno(r, "Couldn't generate volatile sysroot directory: %m"); r = mount_verbose(LOG_ERR, "tmpfs", "/run/systemd/volatile-sysroot", "tmpfs", MS_STRICTATIME, "mode=755"); if (r < 0) goto finish_rmdir; if (mkdir("/run/systemd/volatile-sysroot/usr", 0755) < 0) { r = log_error_errno(errno, "Failed to create /usr directory: %m"); goto finish_umount; } r = mount_verbose(LOG_ERR, old_usr, "/run/systemd/volatile-sysroot/usr", NULL, MS_BIND|MS_REC, NULL); if (r < 0) goto finish_umount; r = bind_remount_recursive("/run/systemd/volatile-sysroot/usr", true, NULL); if (r < 0) { log_error_errno(r, "Failed to remount /usr read-only: %m"); goto finish_umount; } r = umount_recursive(path, 0); if (r < 0) { log_error_errno(r, "Failed to unmount %s: %m", path); goto finish_umount; } if (mount(NULL, "/", NULL, MS_SLAVE|MS_REC, NULL) < 0) log_warning_errno(errno, "Failed to remount %s MS_SLAVE|MS_REC, ignoring: %m", path); r = mount_verbose(LOG_ERR, "/run/systemd/volatile-sysroot", path, NULL, MS_MOVE, NULL); finish_umount: (void) umount_recursive("/run/systemd/volatile-sysroot", 0); finish_rmdir: (void) rmdir("/run/systemd/volatile-sysroot"); return r; }
void umount_oldroot(setup_vals const * s) { if(!s->keep_oldroot) { printf("Umounting oldroot.\n"); int x = umount_recursive("/oldroot"); if (x != UMOUNT_SUCCESS) fatal(-1, true, "Failed to unmount old root"); x = rmdir("/oldroot"); if(x != 0) warn(true, "Failed to remove directory oldroot"); } }