Commit 9b91bf39 authored by Pavel Emelyanov's avatar Pavel Emelyanov

files: Split fs restore into prepare and restore

The prepare one will become more complicated soon.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent b8d01d1b
......@@ -195,6 +195,10 @@ static int root_prepare_shared(void)
ret = prepare_fd_pid(pi);
if (ret < 0)
break;
ret = prepare_fs_pid(pi);
if (ret < 0)
break;
}
if (ret < 0)
......@@ -2679,7 +2683,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
* attempts to open files by paths above (e.g. /proc).
*/
if (restore_fs(pid))
if (restore_fs(current))
goto err;
close_image_dir();
......
......@@ -1018,33 +1018,26 @@ static int fchroot(int fd)
return chroot(fd_path);
}
int restore_fs(int pid)
int restore_fs(struct pstree_item *me)
{
int ifd, dd_root, dd_cwd, ret, err = -1;
FsEntry *fe;
ifd = open_image(CR_FD_FS, O_RSTR, pid);
if (ifd < 0)
goto out;
if (pb_read_one(ifd, &fe, PB_FS) < 0)
goto out_i;
int dd_root, dd_cwd, ret, err = -1;
struct rst_info *ri = me->rst;
/*
* First -- open both descriptors. We will not
* be able to open the cwd one after we chroot.
*/
dd_root = open_reg_by_id(fe->root_id);
dd_root = open_reg_by_id(ri->root_id);
if (dd_root < 0) {
pr_err("Can't open root %#x\n", fe->root_id);
goto err;
pr_err("Can't open root %#x\n", ri->root_id);
goto out;
}
dd_cwd = open_reg_by_id(fe->cwd_id);
dd_cwd = open_reg_by_id(ri->cwd_id);
if (dd_cwd < 0) {
pr_err("Can't open cwd %#x\n", fe->cwd_id);
goto err;
pr_err("Can't open cwd %#x\n", ri->cwd_id);
goto out;
}
/*
......@@ -1057,28 +1050,54 @@ int restore_fs(int pid)
close(dd_root);
if (ret < 0) {
pr_perror("Can't change root");
goto err;
goto out;
}
ret = fchdir(dd_cwd);
close(dd_cwd);
if (ret < 0) {
pr_perror("Can't change cwd");
goto err;
goto out;
}
if (fe->has_umask) {
pr_info("Restoring umask to %o\n", fe->umask);
umask(fe->umask);
if (ri->has_umask) {
pr_info("Restoring umask to %o\n", ri->umask);
umask(ri->umask);
}
err = 0;
err:
out:
return err;
}
int prepare_fs_pid(struct pstree_item *item)
{
pid_t pid = item->pid.virt;
struct rst_info *ri = item->rst;
int ifd;
FsEntry *fe;
ifd = open_image(CR_FD_FS, O_RSTR, pid);
if (ifd < 0)
goto out;
if (pb_read_one(ifd, &fe, PB_FS) < 0)
goto out_i;
close(ifd);
ri->cwd_id = fe->cwd_id;
ri->root_id = fe->root_id;
ri->has_umask = fe->has_umask;
ri->umask = fe->umask;
fs_entry__free_unpacked(fe, NULL);
return 0;
out_i:
close_safe(&ifd);
close(ifd);
out:
return err;
return -1;
}
int shared_fdt_prepare(struct pstree_item *item)
......
......@@ -148,7 +148,8 @@ extern int prepare_fd_pid(struct pstree_item *me);
extern int prepare_ctl_tty(int pid, struct rst_info *rst_info, u32 ctl_tty_id);
extern int prepare_shared_fdinfo(void);
extern int get_filemap_fd(struct vma_area *);
extern int restore_fs(int pid);
extern int restore_fs(struct pstree_item *);
extern int prepare_fs_pid(struct pstree_item *);
extern int set_fd_flags(int fd, int flags);
extern int close_old_fds(struct pstree_item *me);
......
......@@ -49,6 +49,11 @@ struct rst_info {
struct pstree_item *pgrp_leader;
futex_t pgrp_set;
};
u32 cwd_id;
u32 root_id;
bool has_umask;
u32 umask;
};
#endif /* __CR_RST_INFO_H__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment