Commit 139a2ee2 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Cyrill Gorcunov

fdinfo: Rewrite fd prep/open/recv via switch-base state-machine

Yet again -- this makes code easier to understand from my POV.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 7f5da731
...@@ -251,6 +251,9 @@ static int open_transport_fd(int pid, struct fdinfo_entry *fe, ...@@ -251,6 +251,9 @@ static int open_transport_fd(int pid, struct fdinfo_entry *fe,
int sock; int sock;
int ret, sun_len; int ret, sun_len;
if (fi->pid == pid)
return 0;
saddr.sun_family = AF_UNIX; saddr.sun_family = AF_UNIX;
snprintf(saddr.sun_path, UNIX_PATH_MAX, snprintf(saddr.sun_path, UNIX_PATH_MAX,
"X/crtools-fd-%d-%ld", getpid(), fe->addr); "X/crtools-fd-%d-%ld", getpid(), fe->addr);
...@@ -261,9 +264,6 @@ static int open_transport_fd(int pid, struct fdinfo_entry *fe, ...@@ -261,9 +264,6 @@ static int open_transport_fd(int pid, struct fdinfo_entry *fe,
pr_info("\t%d: Create transport fd for %lx type %d namelen %d users %d\n", pid, pr_info("\t%d: Create transport fd for %lx type %d namelen %d users %d\n", pid,
(unsigned long)fe->addr, fe->type, fe->len, fi->users); (unsigned long)fe->addr, fe->type, fe->len, fi->users);
if (fi->pid == pid)
return 0;
fle = find_fdinfo_list_entry(pid, fe->addr, fi); fle = find_fdinfo_list_entry(pid, fe->addr, fi);
sock = socket(PF_UNIX, SOCK_DGRAM, 0); sock = socket(PF_UNIX, SOCK_DGRAM, 0);
...@@ -295,6 +295,9 @@ static int open_fd(int pid, struct fdinfo_entry *fe, ...@@ -295,6 +295,9 @@ static int open_fd(int pid, struct fdinfo_entry *fe,
struct sockaddr_un saddr; struct sockaddr_un saddr;
struct fdinfo_list_entry *fle; struct fdinfo_list_entry *fle;
if ((fi->pid != pid) || (fe->addr != fi->addr))
return 0;
tmp = open_fe_fd(fe, fdinfo_fd); tmp = open_fe_fd(fe, fdinfo_fd);
if (tmp < 0) if (tmp < 0)
return -1; return -1;
...@@ -410,11 +413,15 @@ static int receive_fd(int pid, struct fdinfo_entry *fe, struct fdinfo_desc *fi) ...@@ -410,11 +413,15 @@ static int receive_fd(int pid, struct fdinfo_entry *fe, struct fdinfo_desc *fi)
int tmp; int tmp;
if (fi->pid == pid) { if (fi->pid == pid) {
tmp = dup2(fi->addr, fe->addr); if (fi->addr != fe->addr) {
if (tmp < 0) { tmp = dup2(fi->addr, fe->addr);
pr_perror("Can't duplicate fd %d %d\n", fi->addr, fe->addr); if (tmp < 0) {
return -1; pr_perror("Can't duplicate fd %d %d\n",
fi->addr, fe->addr);
return -1;
}
} }
return 0; return 0;
} }
...@@ -474,14 +481,16 @@ static int open_fdinfo(int pid, struct fdinfo_entry *fe, int *fdinfo_fd, int sta ...@@ -474,14 +481,16 @@ static int open_fdinfo(int pid, struct fdinfo_entry *fe, int *fdinfo_fd, int sta
BUG_ON(fe->type != FDINFO_FD); BUG_ON(fe->type != FDINFO_FD);
if (pid == fi->pid && fe->addr == fi->addr) { switch (state) {
if (state == FD_STATE_CREATE) case FD_STATE_PREP:
ret = open_fd(pid, fe, fi, *fdinfo_fd); ret = open_transport_fd(pid, fe, fi);
} else { break;
if (state == FD_STATE_PREP) case FD_STATE_CREATE:
ret = open_transport_fd(pid, fe, fi); ret = open_fd(pid, fe, fi, *fdinfo_fd);
else if (state == FD_STATE_RECV) break;
ret = receive_fd(pid, fe, fi); case FD_STATE_RECV:
ret = receive_fd(pid, fe, fi);
break;
} }
return ret; return ret;
......
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