Commit d703f826 authored by Pavel Emelyanov's avatar Pavel Emelyanov

fs: Support umask dump/restore

This one is bound to task's fs info (with cwd and root)
thus put it in the fs.img file.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent f787f922
...@@ -47,6 +47,7 @@ __NR_mkdir 83 sys_mkdir (const char *name, int mode) ...@@ -47,6 +47,7 @@ __NR_mkdir 83 sys_mkdir (const char *name, int mode)
__NR_rmdir 84 sys_rmdir (const char *name) __NR_rmdir 84 sys_rmdir (const char *name)
__NR_unlink 87 sys_unlink (char *pathname) __NR_unlink 87 sys_unlink (char *pathname)
__NR_readlink 89 sys_readlink (const char *path, char *buf, int bufsize) __NR_readlink 89 sys_readlink (const char *path, char *buf, int bufsize)
__NR_umask 95 sys_umask (int mask)
__NR_getgroups 115 sys_getgroups (int gsize, unsigned int *groups) __NR_getgroups 115 sys_getgroups (int gsize, unsigned int *groups)
__NR_setresuid 117 sys_setresuid (int uid, int euid, int suid) __NR_setresuid 117 sys_setresuid (int uid, int euid, int suid)
__NR_setresgid 119 sys_setresgid (int gid, int egid, int sgid) __NR_setresgid 119 sys_setresgid (int gid, int egid, int sgid)
......
...@@ -393,12 +393,15 @@ err: ...@@ -393,12 +393,15 @@ err:
return ret; return ret;
} }
static int dump_task_fs(pid_t pid, struct cr_fdset *fdset) static int dump_task_fs(pid_t pid, struct parasite_dump_misc *misc, struct cr_fdset *fdset)
{ {
struct fd_parms p = FD_PARMS_INIT; struct fd_parms p = FD_PARMS_INIT;
FsEntry fe = FS_ENTRY__INIT; FsEntry fe = FS_ENTRY__INIT;
int fd, ret; int fd, ret;
fe.has_umask = true;
fe.umask = misc->umask;
fd = open_proc(pid, "cwd"); fd = open_proc(pid, "cwd");
if (fd < 0) if (fd < 0)
return -1; return -1;
...@@ -1460,7 +1463,7 @@ static int dump_one_task(struct pstree_item *item) ...@@ -1460,7 +1463,7 @@ static int dump_one_task(struct pstree_item *item)
goto err; goto err;
} }
ret = dump_task_fs(pid, cr_fdset); ret = dump_task_fs(pid, &misc, cr_fdset);
if (ret) { if (ret) {
pr_err("Dump fs (pid: %d) failed with %d\n", pid, ret); pr_err("Dump fs (pid: %d) failed with %d\n", pid, ret);
goto err; goto err;
......
...@@ -599,6 +599,11 @@ int prepare_fs(int pid) ...@@ -599,6 +599,11 @@ int prepare_fs(int pid)
* by path thus exposing this (yet unclean) logic here. * by path thus exposing this (yet unclean) logic here.
*/ */
if (fe->has_umask) {
pr_info("Restoring umask to %o\n", fe->umask);
umask(fe->umask);
}
ret = 0; ret = 0;
close: close:
close_safe(&cwd); close_safe(&cwd);
......
...@@ -84,6 +84,7 @@ struct parasite_dump_misc { ...@@ -84,6 +84,7 @@ struct parasite_dump_misc {
u32 sid; u32 sid;
u32 pgid; u32 pgid;
u32 tls; u32 tls;
u32 umask;
}; };
#define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int)) #define PARASITE_MAX_GROUPS (PAGE_SIZE / sizeof(unsigned int))
......
...@@ -290,6 +290,8 @@ static int dump_misc(struct parasite_dump_misc *args) ...@@ -290,6 +290,8 @@ static int dump_misc(struct parasite_dump_misc *args)
args->sid = sys_getsid(); args->sid = sys_getsid();
args->pgid = sys_getpgid(0); args->pgid = sys_getpgid(0);
args->tls = arch_get_tls(); args->tls = arch_get_tls();
args->umask = sys_umask(0);
sys_umask(args->umask); /* never fails */
return 0; return 0;
} }
......
message fs_entry { message fs_entry {
required uint32 cwd_id = 1; required uint32 cwd_id = 1;
required uint32 root_id = 2; required uint32 root_id = 2;
optional uint32 umask = 3;
} }
...@@ -30,6 +30,7 @@ static/xids00 ...@@ -30,6 +30,7 @@ static/xids00
static/groups static/groups
static/pthread00 static/pthread00
static/pthread01 static/pthread01
static/umask00
streaming/pipe_loop00 streaming/pipe_loop00
streaming/pipe_shared00 streaming/pipe_shared00
transition/file_read transition/file_read
......
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