提交 42961d23 编写于 作者: S Sage Weil

libceph: fix socket write error handling

Pass errors from writing to the socket up the stack.  If we get -EAGAIN,
return 0 from the helper to simplify the callers' checks.
Signed-off-by: NSage Weil <sage@newdream.net>
上级 98bdb0aa
...@@ -268,13 +268,17 @@ static int ceph_tcp_sendmsg(struct socket *sock, struct kvec *iov, ...@@ -268,13 +268,17 @@ static int ceph_tcp_sendmsg(struct socket *sock, struct kvec *iov,
size_t kvlen, size_t len, int more) size_t kvlen, size_t len, int more)
{ {
struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL }; struct msghdr msg = { .msg_flags = MSG_DONTWAIT | MSG_NOSIGNAL };
int r;
if (more) if (more)
msg.msg_flags |= MSG_MORE; msg.msg_flags |= MSG_MORE;
else else
msg.msg_flags |= MSG_EOR; /* superfluous, but what the hell */ msg.msg_flags |= MSG_EOR; /* superfluous, but what the hell */
return kernel_sendmsg(sock, &msg, iov, kvlen, len); r = kernel_sendmsg(sock, &msg, iov, kvlen, len);
if (r == -EAGAIN)
r = 0;
return r;
} }
...@@ -851,6 +855,8 @@ static int write_partial_msg_pages(struct ceph_connection *con) ...@@ -851,6 +855,8 @@ static int write_partial_msg_pages(struct ceph_connection *con)
(msg->pages || msg->pagelist || msg->bio || in_trail)) (msg->pages || msg->pagelist || msg->bio || in_trail))
kunmap(page); kunmap(page);
if (ret == -EAGAIN)
ret = 0;
if (ret <= 0) if (ret <= 0)
goto out; goto out;
...@@ -1741,16 +1747,12 @@ static int try_write(struct ceph_connection *con) ...@@ -1741,16 +1747,12 @@ static int try_write(struct ceph_connection *con)
if (con->out_skip) { if (con->out_skip) {
ret = write_partial_skip(con); ret = write_partial_skip(con);
if (ret <= 0) if (ret <= 0)
goto done; goto out;
if (ret < 0) {
dout("try_write write_partial_skip err %d\n", ret);
goto done;
}
} }
if (con->out_kvec_left) { if (con->out_kvec_left) {
ret = write_partial_kvec(con); ret = write_partial_kvec(con);
if (ret <= 0) if (ret <= 0)
goto done; goto out;
} }
/* msg pages? */ /* msg pages? */
...@@ -1765,11 +1767,11 @@ static int try_write(struct ceph_connection *con) ...@@ -1765,11 +1767,11 @@ static int try_write(struct ceph_connection *con)
if (ret == 1) if (ret == 1)
goto more_kvec; /* we need to send the footer, too! */ goto more_kvec; /* we need to send the footer, too! */
if (ret == 0) if (ret == 0)
goto done; goto out;
if (ret < 0) { if (ret < 0) {
dout("try_write write_partial_msg_pages err %d\n", dout("try_write write_partial_msg_pages err %d\n",
ret); ret);
goto done; goto out;
} }
} }
...@@ -1793,10 +1795,9 @@ static int try_write(struct ceph_connection *con) ...@@ -1793,10 +1795,9 @@ static int try_write(struct ceph_connection *con)
/* Nothing to do! */ /* Nothing to do! */
clear_bit(WRITE_PENDING, &con->state); clear_bit(WRITE_PENDING, &con->state);
dout("try_write nothing else to write.\n"); dout("try_write nothing else to write.\n");
done:
ret = 0; ret = 0;
out: out:
dout("try_write done on %p\n", con); dout("try_write done on %p ret %d\n", con, ret);
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册