Commit b47b0201 authored by Pavel Emelyanov's avatar Pavel Emelyanov

page-server: Don't setup options in parent task

When service starts page server all the preparations (log, wdir, img dir, etc.)
happen in parent task, then we fork page server.

This is OK for now, but when we will serve several requests per connection, all
these resources would be leaked in parent.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 66170c6b
...@@ -496,7 +496,7 @@ static int pre_dump_loop(int sk, CriuReq *msg) ...@@ -496,7 +496,7 @@ static int pre_dump_loop(int sk, CriuReq *msg)
static int start_page_server_req(int sk, CriuOpts *req) static int start_page_server_req(int sk, CriuOpts *req)
{ {
int ret; int ret, pid, start_pipe[2];
bool success = false; bool success = false;
CriuResp resp = CRIU_RESP__INIT; CriuResp resp = CRIU_RESP__INIT;
CriuPageServerInfo ps = CRIU_PAGE_SERVER_INFO__INIT; CriuPageServerInfo ps = CRIU_PAGE_SERVER_INFO__INIT;
...@@ -506,14 +506,33 @@ static int start_page_server_req(int sk, CriuOpts *req) ...@@ -506,14 +506,33 @@ static int start_page_server_req(int sk, CriuOpts *req)
goto out; goto out;
} }
if (setup_opts_from_req(sk, req)) if (pipe(start_pipe)) {
pr_perror("No start pipe");
goto out; goto out;
}
pid = fork();
if (pid == 0) {
close(start_pipe[0]);
if (setup_opts_from_req(sk, req))
goto out_ch;
setproctitle("page-server --rpc --address %s --port %hu", opts.addr, opts.ps_port); setproctitle("page-server --rpc --address %s --port %hu", opts.addr, opts.ps_port);
pr_debug("Starting page server\n"); pr_debug("Starting page server\n");
ret = cr_page_server(true); ret = cr_page_server(true, start_pipe[1]);
out_ch:
write(start_pipe[1], &ret, sizeof(ret));
close(start_pipe[1]);
exit(0);
}
close(start_pipe[1]);
wait(NULL);
ret = -1;
read(start_pipe[0], &ret, sizeof(ret));
if (ret > 0) { if (ret > 0) {
success = true; success = true;
ps.has_pid = true; ps.has_pid = true;
......
...@@ -496,7 +496,7 @@ int main(int argc, char *argv[], char *envp[]) ...@@ -496,7 +496,7 @@ int main(int argc, char *argv[], char *envp[])
} }
if (!strcmp(argv[optind], "page-server")) if (!strcmp(argv[optind], "page-server"))
return cr_page_server(opts.restore_detach) > 0 ? 0 : 1; return cr_page_server(opts.restore_detach, -1) > 0 ? 0 : 1;
if (!strcmp(argv[optind], "service")) if (!strcmp(argv[optind], "service"))
return cr_service(opts.restore_detach); return cr_service(opts.restore_detach);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#define __CR_PAGE_XFER__H__ #define __CR_PAGE_XFER__H__
#include "page-read.h" #include "page-read.h"
extern int cr_page_server(bool daemon_mode); extern int cr_page_server(bool daemon_mode, int cfd);
/* /*
* page_xfer -- transfer pages into image file. * page_xfer -- transfer pages into image file.
......
...@@ -263,7 +263,7 @@ extern void *shmalloc(size_t bytes); ...@@ -263,7 +263,7 @@ extern void *shmalloc(size_t bytes);
extern void shfree_last(void *ptr); extern void shfree_last(void *ptr);
extern int cr_system(int in, int out, int err, char *cmd, char *const argv[]); extern int cr_system(int in, int out, int err, char *cmd, char *const argv[]);
extern int cr_daemon(int nochdir, int noclose); extern int cr_daemon(int nochdir, int noclose, int *keep_fd, int close_fd);
extern int is_root_user(void); extern int is_root_user(void);
static inline bool dir_dots(struct dirent *de) static inline bool dir_dots(struct dirent *de)
......
...@@ -254,7 +254,7 @@ static int get_sockaddr_in(struct sockaddr_in *addr) ...@@ -254,7 +254,7 @@ static int get_sockaddr_in(struct sockaddr_in *addr)
return 0; return 0;
} }
int cr_page_server(bool daemon_mode) int cr_page_server(bool daemon_mode, int cfd)
{ {
int sk = -1, ask = -1, ret; int sk = -1, ask = -1, ret;
struct sockaddr_in saddr, caddr; struct sockaddr_in saddr, caddr;
...@@ -292,7 +292,7 @@ int cr_page_server(bool daemon_mode) ...@@ -292,7 +292,7 @@ int cr_page_server(bool daemon_mode)
no_server: no_server:
if (daemon_mode) { if (daemon_mode) {
ret = cr_daemon(1, 0); ret = cr_daemon(1, 0, &ask, cfd);
if (ret == -1) { if (ret == -1) {
pr_perror("Can't run in the background"); pr_perror("Can't run in the background");
goto out; goto out;
......
...@@ -560,7 +560,7 @@ out: ...@@ -560,7 +560,7 @@ out:
return ret; return ret;
} }
int cr_daemon(int nochdir, int noclose) int cr_daemon(int nochdir, int noclose, int *keep_fd, int close_fd)
{ {
int pid; int pid;
...@@ -580,6 +580,12 @@ int cr_daemon(int nochdir, int noclose) ...@@ -580,6 +580,12 @@ int cr_daemon(int nochdir, int noclose)
if (!noclose) { if (!noclose) {
int fd; int fd;
if (close_fd != -1)
close(close_fd);
if (*keep_fd != -1)
*keep_fd = dup2(*keep_fd, 3);
fd = open("/dev/null", O_RDWR); fd = open("/dev/null", O_RDWR);
if (fd < 0) { if (fd < 0) {
pr_perror("Can't open /dev/null"); pr_perror("Can't open /dev/null");
......
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