Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89ab066d authored by Karsten Graul's avatar Karsten Graul Committed by David S. Miller
Browse files

Revert "net: simplify sock_poll_wait"



This reverts commit dd979b4d.

This broke tcp_poll for SMC fallback: An AF_SMC socket establishes an
internal TCP socket for the initial handshake with the remote peer.
Whenever the SMC connection can not be established this TCP socket is
used as a fallback. All socket operations on the SMC socket are then
forwarded to the TCP socket. In case of poll, the file->private_data
pointer references the SMC socket because the TCP socket has no file
assigned. This causes tcp_poll to wait on the wrong socket.

Signed-off-by: default avatarKarsten Graul <kgraul@linux.ibm.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6b7a02f7
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1071,7 +1071,7 @@ __poll_t af_alg_poll(struct file *file, struct socket *sock,
	struct af_alg_ctx *ctx = ask->private;
	__poll_t mask;

	sock_poll_wait(file, wait);
	sock_poll_wait(file, sock, wait);
	mask = 0;

	if (!ctx->more || ctx->used)
+9 −3
Original line number Diff line number Diff line
@@ -2059,14 +2059,20 @@ static inline bool skwq_has_sleeper(struct socket_wq *wq)
/**
 * sock_poll_wait - place memory barrier behind the poll_wait call.
 * @filp:           file
 * @sock:           socket to wait on
 * @p:              poll_table
 *
 * See the comments in the wq_has_sleeper function.
 *
 * Do not derive sock from filp->private_data here. An SMC socket establishes
 * an internal TCP socket that is used in the fallback case. All socket
 * operations on the SMC socket are then forwarded to the TCP socket. In case of
 * poll, the filp->private_data pointer references the SMC socket because the
 * TCP socket has no file assigned.
 */
static inline void sock_poll_wait(struct file *filp, poll_table *p)
static inline void sock_poll_wait(struct file *filp, struct socket *sock,
				  poll_table *p)
{
	struct socket *sock = filp->private_data;

	if (!poll_does_not_wait(p)) {
		poll_wait(filp, &sock->wq->wait, p);
		/* We need to be sure we are in sync with the
+1 −1
Original line number Diff line number Diff line
@@ -653,7 +653,7 @@ __poll_t vcc_poll(struct file *file, struct socket *sock, poll_table *wait)
	struct atm_vcc *vcc;
	__poll_t mask;

	sock_poll_wait(file, wait);
	sock_poll_wait(file, sock, wait);
	mask = 0;

	vcc = ATM_SD(sock);
+1 −1
Original line number Diff line number Diff line
@@ -941,7 +941,7 @@ static __poll_t caif_poll(struct file *file,
	__poll_t mask;
	struct caifsock *cf_sk = container_of(sk, struct caifsock, sk);

	sock_poll_wait(file, wait);
	sock_poll_wait(file, sock, wait);
	mask = 0;

	/* exceptional events? */
+1 −1
Original line number Diff line number Diff line
@@ -837,7 +837,7 @@ __poll_t datagram_poll(struct file *file, struct socket *sock,
	struct sock *sk = sock->sk;
	__poll_t mask;

	sock_poll_wait(file, wait);
	sock_poll_wait(file, sock, wait);
	mask = 0;

	/* exceptional events? */
Loading