fs: dlm: move receive loop into receive handler
authorAlexander Aring <aahringo@redhat.com>
Fri, 16 Jul 2021 20:22:45 +0000 (16:22 -0400)
committerDavid Teigland <teigland@redhat.com>
Mon, 19 Jul 2021 16:56:36 +0000 (11:56 -0500)
This patch moves the kernel_recvmsg() loop call into the
receive_from_sock() function instead of doing the loop outside the
function and abort the loop over it's return value.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
Signed-off-by: David Teigland <teigland@redhat.com>
fs/dlm/lowcomms.c

index 11e0616..cce1d50 100644 (file)
@@ -895,7 +895,6 @@ static int con_realloc_receive_buf(struct connection *con, int newlen)
 /* Data received from remote end */
 static int receive_from_sock(struct connection *con)
 {
-       int call_again_soon = 0;
        struct msghdr msg;
        struct kvec iov;
        int ret, buflen;
@@ -915,41 +914,39 @@ static int receive_from_sock(struct connection *con)
                        goto out_resched;
        }
 
-       /* calculate new buffer parameter regarding last receive and
-        * possible leftover bytes
-        */
-       iov.iov_base = con->rx_buf + con->rx_leftover;
-       iov.iov_len = con->rx_buflen - con->rx_leftover;
-
-       memset(&msg, 0, sizeof(msg));
-       msg.msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL;
-       ret = kernel_recvmsg(con->sock, &msg, &iov, 1, iov.iov_len,
-                            msg.msg_flags);
-       if (ret <= 0)
-               goto out_close;
-       else if (ret == iov.iov_len)
-               call_again_soon = 1;
-
-       /* new buflen according readed bytes and leftover from last receive */
-       buflen = ret + con->rx_leftover;
-       ret = dlm_process_incoming_buffer(con->nodeid, con->rx_buf, buflen);
-       if (ret < 0)
-               goto out_close;
+       for (;;) {
+               /* calculate new buffer parameter regarding last receive and
+                * possible leftover bytes
+                */
+               iov.iov_base = con->rx_buf + con->rx_leftover;
+               iov.iov_len = con->rx_buflen - con->rx_leftover;
+
+               memset(&msg, 0, sizeof(msg));
+               msg.msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL;
+               ret = kernel_recvmsg(con->sock, &msg, &iov, 1, iov.iov_len,
+                                    msg.msg_flags);
+               if (ret == -EAGAIN)
+                       break;
+               else if (ret <= 0)
+                       goto out_close;
 
-       /* calculate leftover bytes from process and put it into begin of
-        * the receive buffer, so next receive we have the full message
-        * at the start address of the receive buffer.
-        */
-       con->rx_leftover = buflen - ret;
-       if (con->rx_leftover) {
-               memmove(con->rx_buf, con->rx_buf + ret,
-                       con->rx_leftover);
-               call_again_soon = true;
+               /* new buflen according readed bytes and leftover from last receive */
+               buflen = ret + con->rx_leftover;
+               ret = dlm_process_incoming_buffer(con->nodeid, con->rx_buf, buflen);
+               if (ret < 0)
+                       goto out_close;
+
+               /* calculate leftover bytes from process and put it into begin of
+                * the receive buffer, so next receive we have the full message
+                * at the start address of the receive buffer.
+                */
+               con->rx_leftover = buflen - ret;
+               if (con->rx_leftover) {
+                       memmove(con->rx_buf, con->rx_buf + ret,
+                               con->rx_leftover);
+               }
        }
 
-       if (call_again_soon)
-               goto out_resched;
-
        mutex_unlock(&con->sock_mutex);
        return 0;
 
@@ -1511,12 +1508,9 @@ int dlm_lowcomms_close(int nodeid)
 static void process_recv_sockets(struct work_struct *work)
 {
        struct connection *con = container_of(work, struct connection, rwork);
-       int err;
 
        clear_bit(CF_READ_PENDING, &con->flags);
-       do {
-               err = receive_from_sock(con);
-       } while (!err);
+       receive_from_sock(con);
 }
 
 static void process_listen_recv_socket(struct work_struct *work)