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