Commit e46ba886 authored by Andrew Vagin's avatar Andrew Vagin Committed by Pavel Emelyanov

files: don't create a transport socket for each file

This is an unix dgram socket which doesn't have an address and
isn't connected to somewhere, so we can use one socket for all processes.

v2: return non-zero code in error cases
Signed-off-by: 's avatarAndrew Vagin <avagin@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 3e840917
......@@ -267,6 +267,10 @@ static int root_prepare_shared(void)
if (ret)
goto err;
ret = open_transport_socket();
if (ret)
goto err;
show_saved_files();
err:
return ret;
......@@ -603,6 +607,8 @@ static int restore_one_alive_task(int pid, CoreEntry *core)
if (prepare_vmas(current, ta))
return -1;
close_service_fd(TRANSPORT_FD_OFF);
return sigreturn_restore(pid, ta, args_len, core);
}
......
......@@ -1000,11 +1000,7 @@ static int serve_out_fd(int pid, int fd, struct file_desc *d)
int sock, ret;
struct fdinfo_list_entry *fle;
sock = socket(PF_UNIX, SOCK_DGRAM, 0);
if (sock < 0) {
pr_perror("Can't create socket");
return -1;
}
sock = get_service_fd(TRANSPORT_FD_OFF);
pr_info("\t\tCreate fd for %d\n", fd);
......@@ -1022,7 +1018,6 @@ static int serve_out_fd(int pid, int fd, struct file_desc *d)
ret = 0;
out:
close(sock);
return ret;
}
......@@ -1672,3 +1667,21 @@ char *external_lookup_by_key(char *key)
}
return NULL;
}
int open_transport_socket()
{
int sock;
sock = socket(PF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0);
if (sock < 0) {
pr_perror("Can't create socket");
return -1;
}
if (install_service_fd(TRANSPORT_FD_OFF, sock) < 0) {
close(sock);
return -1;
}
close(sock);
return 0;
}
......@@ -201,4 +201,6 @@ extern FdinfoEntry *dup_fdinfo(FdinfoEntry *old, int fd, unsigned flags);
int dup_fle(struct pstree_item *task, struct fdinfo_list_entry *ple,
int fd, unsigned flags);
extern int open_transport_socket(void);
#endif /* __CR_FILES_H__ */
......@@ -19,6 +19,7 @@ enum sfd_type {
CGROUP_YARD,
USERNSD_SK, /* Socket for usernsd */
NS_FD_OFF, /* Node's net namespace fd */
TRANSPORT_FD_OFF, /* to transfer file descriptors */
SERVICE_FD_MAX
};
......
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