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:
Родитель
c51b022179
Коммит
62699b3f0a
|
@ -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;
|
||||
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 <= 0)
|
||||
goto out_close;
|
||||
else if (ret == iov.iov_len)
|
||||
call_again_soon = 1;
|
||||
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;
|
||||
|
||||
/* 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;
|
||||
/* 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);
|
||||
call_again_soon = true;
|
||||
/* 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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче