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) ...@@ -195,6 +195,10 @@ static int root_prepare_shared(void)
ret = prepare_fd_pid(pi); ret = prepare_fd_pid(pi);
if (ret < 0) if (ret < 0)
break; break;
ret = prepare_fs_pid(pi);
if (ret < 0)
break;
} }
if (ret < 0) if (ret < 0)
...@@ -2679,7 +2683,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core) ...@@ -2679,7 +2683,7 @@ static int sigreturn_restore(pid_t pid, CoreEntry *core)
* attempts to open files by paths above (e.g. /proc). * attempts to open files by paths above (e.g. /proc).
*/ */
if (restore_fs(pid)) if (restore_fs(current))
goto err; goto err;
close_image_dir(); close_image_dir();
......
...@@ -1018,33 +1018,26 @@ static int fchroot(int fd) ...@@ -1018,33 +1018,26 @@ static int fchroot(int fd)
return chroot(fd_path); 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; int dd_root, dd_cwd, ret, err = -1;
FsEntry *fe; struct rst_info *ri = me->rst;
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;
/* /*
* First -- open both descriptors. We will not * First -- open both descriptors. We will not
* be able to open the cwd one after we chroot. * 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) { if (dd_root < 0) {
pr_err("Can't open root %#x\n", fe->root_id); pr_err("Can't open root %#x\n", ri->root_id);
goto err; goto out;
} }
dd_cwd = open_reg_by_id(fe->cwd_id); dd_cwd = open_reg_by_id(ri->cwd_id);
if (dd_cwd < 0) { if (dd_cwd < 0) {
pr_err("Can't open cwd %#x\n", fe->cwd_id); pr_err("Can't open cwd %#x\n", ri->cwd_id);
goto err; goto out;
} }
/* /*
...@@ -1057,28 +1050,54 @@ int restore_fs(int pid) ...@@ -1057,28 +1050,54 @@ int restore_fs(int pid)
close(dd_root); close(dd_root);
if (ret < 0) { if (ret < 0) {
pr_perror("Can't change root"); pr_perror("Can't change root");
goto err; goto out;
} }
ret = fchdir(dd_cwd); ret = fchdir(dd_cwd);
close(dd_cwd); close(dd_cwd);
if (ret < 0) { if (ret < 0) {
pr_perror("Can't change cwd"); pr_perror("Can't change cwd");
goto err; goto out;
} }
if (fe->has_umask) { if (ri->has_umask) {
pr_info("Restoring umask to %o\n", fe->umask); pr_info("Restoring umask to %o\n", ri->umask);
umask(fe->umask); umask(ri->umask);
} }
err = 0; 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); fs_entry__free_unpacked(fe, NULL);
return 0;
out_i: out_i:
close_safe(&ifd); close(ifd);
out: out:
return err; return -1;
} }
int shared_fdt_prepare(struct pstree_item *item) int shared_fdt_prepare(struct pstree_item *item)
......
...@@ -148,7 +148,8 @@ extern int prepare_fd_pid(struct pstree_item *me); ...@@ -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_ctl_tty(int pid, struct rst_info *rst_info, u32 ctl_tty_id);
extern int prepare_shared_fdinfo(void); extern int prepare_shared_fdinfo(void);
extern int get_filemap_fd(struct vma_area *); 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 set_fd_flags(int fd, int flags);
extern int close_old_fds(struct pstree_item *me); extern int close_old_fds(struct pstree_item *me);
......
...@@ -49,6 +49,11 @@ struct rst_info { ...@@ -49,6 +49,11 @@ struct rst_info {
struct pstree_item *pgrp_leader; struct pstree_item *pgrp_leader;
futex_t pgrp_set; futex_t pgrp_set;
}; };
u32 cwd_id;
u32 root_id;
bool has_umask;
u32 umask;
}; };
#endif /* __CR_RST_INFO_H__ */ #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