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

Commit edacaeae authored by Andy Grover's avatar Andy Grover Committed by David S. Miller
Browse files

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: default avatarAndy Grover <andy.grover@oracle.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fdf6e6b4
Loading
Loading
Loading
Loading
+13 −11
Original line number Diff line number Diff line
@@ -409,18 +409,18 @@ int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
	if (msg_flags & MSG_OOB)
		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);
		goto out;
			break;
		}

		if (rs->rs_cong_notify) {
			ret = rds_notify_cong(rs, msg);
		goto out;
			break;
		}

	while (1) {
		if (!rds_next_incoming(rs, &inc)) {
			if (nonblock) {
				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,
						rds_next_incoming(rs, &inc),
						(!list_empty(&rs->rs_notify_queue)
						|| rs->rs_cong_notify
						|| rds_next_incoming(rs, &inc)),
						timeo);
			rdsdebug("recvmsg woke inc %p timeo %ld\n", inc,
				 timeo);