|
@@ -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
|