Pārlūkot izejas kodu

RDS: Fix completion notifications on blocking sockets

Completion or congestion notifications were not being checked
if the socket went to sleep. This patch fixes that.

Signed-off-by: Andy Grover <andy.grover@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Andy Grover 16 gadi atpakaļ
vecāks
revīzija
edacaeae52
1 mainītis faili ar 13 papildinājumiem un 11 dzēšanām
  1. 13 11
      net/rds/recv.c

+ 13 - 11
net/rds/recv.c

@@ -409,18 +409,18 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
 	if (msg_flags & MSG_OOB)
 	if (msg_flags & MSG_OOB)
 		goto out;
 		goto out;
 
 
-	/* If there are pending notifications, do those - and nothing else */
-	if (!list_empty(&rs->rs_notify_queue)) {
-		ret = rds_notify_queue_get(rs, msg);
-		goto out;
-	}
+	while (1) {
+		/* If there are pending notifications, do those - and nothing else */
+		if (!list_empty(&rs->rs_notify_queue)) {
+			ret = rds_notify_queue_get(rs, msg);
+			break;
+		}
 
 
-	if (rs->rs_cong_notify) {
-		ret = rds_notify_cong(rs, msg);
-		goto out;
-	}
+		if (rs->rs_cong_notify) {
+			ret = rds_notify_cong(rs, msg);
+			break;
+		}
 
 
-	while (1) {
 		if (!rds_next_incoming(rs, &inc)) {
 		if (!rds_next_incoming(rs, &inc)) {
 			if (nonblock) {
 			if (nonblock) {
 				ret = -EAGAIN;
 				ret = -EAGAIN;
@@ -428,7 +428,9 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
 			}
 			}
 
 
 			timeo = wait_event_interruptible_timeout(*sk->sk_sleep,
 			timeo = wait_event_interruptible_timeout(*sk->sk_sleep,
-						rds_next_incoming(rs, &inc),
+						(!list_empty(&rs->rs_notify_queue)
+						|| rs->rs_cong_notify
+						|| rds_next_incoming(rs, &inc)),
 						timeo);
 						timeo);
 			rdsdebug("recvmsg woke inc %p timeo %ld\n", inc,
 			rdsdebug("recvmsg woke inc %p timeo %ld\n", inc,
 				 timeo);
 				 timeo);