selftests: mptcp: make sendfile selftest work
When the selftest got added, sendfile() on mptcp sockets returned
-EOPNOTSUPP, so running 'mptcp_connect.sh -m sendfile' failed
immediately.
This is no longer the case, but the script fails anyway due to timeout.
Let the receiver know once the sender has sent all data, just like
with '-m mmap' mode.
v2: need to respect cfg_wait too, as pm_userspace.sh relied
on -m sendfile to keep the connection open (Mat Martineau)
Fixes: 048d19d444
("mptcp: add basic kselftest for mptcp")
Reported-by: Xiumei Mu <xmu@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
c886d70286
Коммит
df9e03aec3
|
@ -553,6 +553,18 @@ static void set_nonblock(int fd, bool nonblock)
|
|||
fcntl(fd, F_SETFL, flags & ~O_NONBLOCK);
|
||||
}
|
||||
|
||||
static void shut_wr(int fd)
|
||||
{
|
||||
/* Close our write side, ev. give some time
|
||||
* for address notification and/or checking
|
||||
* the current status
|
||||
*/
|
||||
if (cfg_wait)
|
||||
usleep(cfg_wait);
|
||||
|
||||
shutdown(fd, SHUT_WR);
|
||||
}
|
||||
|
||||
static int copyfd_io_poll(int infd, int peerfd, int outfd, bool *in_closed_after_out)
|
||||
{
|
||||
struct pollfd fds = {
|
||||
|
@ -630,14 +642,7 @@ static int copyfd_io_poll(int infd, int peerfd, int outfd, bool *in_closed_after
|
|||
/* ... and peer also closed already */
|
||||
break;
|
||||
|
||||
/* ... but we still receive.
|
||||
* Close our write side, ev. give some time
|
||||
* for address notification and/or checking
|
||||
* the current status
|
||||
*/
|
||||
if (cfg_wait)
|
||||
usleep(cfg_wait);
|
||||
shutdown(peerfd, SHUT_WR);
|
||||
shut_wr(peerfd);
|
||||
} else {
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
|
@ -767,7 +772,7 @@ static int copyfd_io_mmap(int infd, int peerfd, int outfd,
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
shutdown(peerfd, SHUT_WR);
|
||||
shut_wr(peerfd);
|
||||
|
||||
err = do_recvfile(peerfd, outfd);
|
||||
*in_closed_after_out = true;
|
||||
|
@ -791,6 +796,9 @@ static int copyfd_io_sendfile(int infd, int peerfd, int outfd,
|
|||
err = do_sendfile(infd, peerfd, size);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
shut_wr(peerfd);
|
||||
|
||||
err = do_recvfile(peerfd, outfd);
|
||||
*in_closed_after_out = true;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче