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

Commit 42961d23 authored by Sage Weil's avatar Sage Weil
Browse files

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: default avatarSage Weil <sage@newdream.net>
parent 98bdb0aa
Loading
Loading
Loading
Loading
+12 −11
Original line number Original line Diff line number Diff line
@@ -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)
		    (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)
	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)
		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)
	/* 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;
}
}