Commit ed55f1dd authored by Kirill Tkhai's avatar Kirill Tkhai Committed by Pavel Emelyanov

files: Send/receive fds with pointers on their struct fdinfo_list_entry in receiver

For moving to a single transport socket scheme, we need to be able to differ
fds in receive queue from each other. Add a fle pointer as identifier for that.

v2: Rebase on compel
travis-ci: success for Rework file opening scheme to make it asynchronous (rev5)
Signed-off-by: 's avatarKirill Tkhai <ktkhai@virtuozzo.com>
Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
parent 06552fa3
...@@ -957,6 +957,23 @@ err: ...@@ -957,6 +957,23 @@ err:
return -1; return -1;
} }
int recv_fd_from_peer(struct fdinfo_list_entry *fle)
{
struct fdinfo_list_entry *tmp;
int fd, ret;
ret = recv_fds(fle->fe->fd, &fd, 1, (void *)&tmp, sizeof(struct fdinfo_list_entry *));
if (ret)
return -1;
if (tmp != fle) {
pr_err("Received wrong fle\n");
return -1;
}
return fd;
}
int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle, int sock) int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle, int sock)
{ {
struct sockaddr_un saddr; struct sockaddr_un saddr;
...@@ -967,7 +984,7 @@ int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle, int sock) ...@@ -967,7 +984,7 @@ int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle, int sock)
transport_name_gen(&saddr, &len, transport_name_gen(&saddr, &len,
futex_get(&fle->real_pid), fle->fe->fd); futex_get(&fle->real_pid), fle->fe->fd);
pr_info("\t\tSend fd %d to %s\n", fd, saddr.sun_path + 1); pr_info("\t\tSend fd %d to %s\n", fd, saddr.sun_path + 1);
return send_fd(sock, &saddr, len, fd); return send_fds(sock, &saddr, len, &fd, 1, (void *)&fle, sizeof(struct fdinfo_list_entry *));
} }
static int send_fd_to_self(int fd, struct fdinfo_list_entry *fle, int sock) static int send_fd_to_self(int fd, struct fdinfo_list_entry *fle, int sock)
...@@ -1077,7 +1094,7 @@ static int receive_fd(int pid, struct fdinfo_list_entry *fle) ...@@ -1077,7 +1094,7 @@ static int receive_fd(int pid, struct fdinfo_list_entry *fle)
pr_info("\tReceive fd for %d\n", fle->fe->fd); pr_info("\tReceive fd for %d\n", fle->fe->fd);
tmp = recv_fd(fle->fe->fd); tmp = recv_fd_from_peer(fle);
if (tmp < 0) { if (tmp < 0) {
pr_err("Can't get fd %d\n", tmp); pr_err("Can't get fd %d\n", tmp);
return -1; return -1;
......
...@@ -148,6 +148,7 @@ extern int file_desc_add(struct file_desc *d, u32 id, struct file_desc_ops *ops) ...@@ -148,6 +148,7 @@ extern int file_desc_add(struct file_desc *d, u32 id, struct file_desc_ops *ops)
extern struct fdinfo_list_entry *file_master(struct file_desc *d); extern struct fdinfo_list_entry *file_master(struct file_desc *d);
extern struct file_desc *find_file_desc_raw(int type, u32 id); extern struct file_desc *find_file_desc_raw(int type, u32 id);
extern int recv_fd_from_peer(struct fdinfo_list_entry *fle);
extern int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle, int sock); extern int send_fd_to_peer(int fd, struct fdinfo_list_entry *fle, int sock);
extern int restore_fown(int fd, FownEntry *fown); extern int restore_fown(int fd, FownEntry *fown);
extern int rst_file_params(int fd, FownEntry *fown, int flags); extern int rst_file_params(int fd, FownEntry *fown, int flags);
......
...@@ -237,7 +237,7 @@ static int recv_pipe_fd(struct pipe_info *pi) ...@@ -237,7 +237,7 @@ static int recv_pipe_fd(struct pipe_info *pi)
pr_info("\tWaiting fd for %d\n", fd); pr_info("\tWaiting fd for %d\n", fd);
tmp = recv_fd(fd); tmp = recv_fd_from_peer(fle);
if (tmp < 0) { if (tmp < 0) {
pr_err("Can't get fd %d\n", tmp); pr_err("Can't get fd %d\n", tmp);
return -1; return -1;
......
...@@ -1097,7 +1097,7 @@ static int open_unixsk_pair_slave(struct unix_sk_info *ui) ...@@ -1097,7 +1097,7 @@ static int open_unixsk_pair_slave(struct unix_sk_info *ui)
pr_info("Opening pair slave (id %#x ino %#x peer %#x) on %d\n", pr_info("Opening pair slave (id %#x ino %#x peer %#x) on %d\n",
ui->ue->id, ui->ue->ino, ui->ue->peer, fle->fe->fd); ui->ue->id, ui->ue->ino, ui->ue->peer, fle->fe->fd);
sk = recv_fd(fle->fe->fd); sk = recv_fd_from_peer(fle);
if (sk < 0) { if (sk < 0) {
pr_err("Can't recv pair slave\n"); pr_err("Can't recv pair slave\n");
return -1; return -1;
......
...@@ -923,7 +923,7 @@ static int receive_tty(struct tty_info *info) ...@@ -923,7 +923,7 @@ static int receive_tty(struct tty_info *info)
fle = file_master(&info->d); fle = file_master(&info->d);
pr_info("\tWaiting tty fd %d (pid %d)\n", fle->fe->fd, fle->pid); pr_info("\tWaiting tty fd %d (pid %d)\n", fle->fe->fd, fle->pid);
fd = recv_fd(fle->fe->fd); fd = recv_fd_from_peer(fle);
close(fle->fe->fd); close(fle->fe->fd);
if (fd < 0) { if (fd < 0) {
pr_err("Can't get fd %d\n", fd); pr_err("Can't get fd %d\n", fd);
......
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