Commit 986e8989 authored by Ilya Dryomov's avatar Ilya Dryomov

libceph: make encode_request_*() work with r_mempool requests

Messages allocated out of ceph_msgpool have a fixed front length
(pool->front_len).  Asserting that the entire front has been filled
while encoding is thus wrong.

Fixes: 8cb441c0 ("libceph: MOSDOp v8 encoding (actual spgid + full hash)")
Reported-by: default avatar"Yan, Zheng" <zyan@redhat.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
Reviewed-by: default avatar"Yan, Zheng" <zyan@redhat.com>
parent 16f73eb0
...@@ -1918,10 +1918,12 @@ static void encode_request_partial(struct ceph_osd_request *req, ...@@ -1918,10 +1918,12 @@ static void encode_request_partial(struct ceph_osd_request *req,
} }
ceph_encode_32(&p, req->r_attempts); /* retry_attempt */ ceph_encode_32(&p, req->r_attempts); /* retry_attempt */
BUG_ON(p != end - 8); /* space for features */ BUG_ON(p > end - 8); /* space for features */
msg->hdr.version = cpu_to_le16(8); /* MOSDOp v8 */ msg->hdr.version = cpu_to_le16(8); /* MOSDOp v8 */
/* front_len is finalized in encode_request_finish() */ /* front_len is finalized in encode_request_finish() */
msg->front.iov_len = p - msg->front.iov_base;
msg->hdr.front_len = cpu_to_le32(msg->front.iov_len);
msg->hdr.data_len = cpu_to_le32(data_len); msg->hdr.data_len = cpu_to_le32(data_len);
/* /*
* The header "data_off" is a hint to the receiver allowing it * The header "data_off" is a hint to the receiver allowing it
...@@ -1937,11 +1939,12 @@ static void encode_request_partial(struct ceph_osd_request *req, ...@@ -1937,11 +1939,12 @@ static void encode_request_partial(struct ceph_osd_request *req,
static void encode_request_finish(struct ceph_msg *msg) static void encode_request_finish(struct ceph_msg *msg)
{ {
void *p = msg->front.iov_base; void *p = msg->front.iov_base;
void *const partial_end = p + msg->front.iov_len;
void *const end = p + msg->front_alloc_len; void *const end = p + msg->front_alloc_len;
if (CEPH_HAVE_FEATURE(msg->con->peer_features, RESEND_ON_SPLIT)) { if (CEPH_HAVE_FEATURE(msg->con->peer_features, RESEND_ON_SPLIT)) {
/* luminous OSD -- encode features and be done */ /* luminous OSD -- encode features and be done */
p = end - 8; p = partial_end;
ceph_encode_64(&p, msg->con->peer_features); ceph_encode_64(&p, msg->con->peer_features);
} else { } else {
struct { struct {
...@@ -1984,7 +1987,7 @@ static void encode_request_finish(struct ceph_msg *msg) ...@@ -1984,7 +1987,7 @@ static void encode_request_finish(struct ceph_msg *msg)
oid_len = p - oid; oid_len = p - oid;
tail = p; tail = p;
tail_len = (end - p) - 8; tail_len = partial_end - p;
p = msg->front.iov_base; p = msg->front.iov_base;
ceph_encode_copy(&p, &head.client_inc, sizeof(head.client_inc)); ceph_encode_copy(&p, &head.client_inc, sizeof(head.client_inc));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment