ceph: reset front len on return to msgpool; BUG on mismatched front iov
Reset msg front len when a message is returned to the pool: the caller may have changed it. BUG if we try to send a message with a hdr.front_len that doesn't match the front iov. Signed-off-by: Sage Weil <sage@newdream.net>
This commit is contained in:
parent
70edb55bdf
commit
3ca02ef96e
|
@ -1954,6 +1954,8 @@ void ceph_con_send(struct ceph_connection *con, struct ceph_msg *msg)
|
||||||
msg->hdr.src.addr = con->msgr->my_enc_addr;
|
msg->hdr.src.addr = con->msgr->my_enc_addr;
|
||||||
msg->hdr.orig_src = msg->hdr.src;
|
msg->hdr.orig_src = msg->hdr.src;
|
||||||
|
|
||||||
|
BUG_ON(msg->front.iov_len != le32_to_cpu(msg->hdr.front_len));
|
||||||
|
|
||||||
/* queue */
|
/* queue */
|
||||||
mutex_lock(&con->mutex);
|
mutex_lock(&con->mutex);
|
||||||
BUG_ON(!list_empty(&msg->list_head));
|
BUG_ON(!list_empty(&msg->list_head));
|
||||||
|
|
|
@ -166,6 +166,10 @@ void ceph_msgpool_put(struct ceph_msgpool *pool, struct ceph_msg *msg)
|
||||||
{
|
{
|
||||||
spin_lock(&pool->lock);
|
spin_lock(&pool->lock);
|
||||||
if (pool->num < pool->min) {
|
if (pool->num < pool->min) {
|
||||||
|
/* reset msg front_len; user may have changed it */
|
||||||
|
msg->front.iov_len = pool->front_len;
|
||||||
|
msg->hdr.front_len = cpu_to_le32(pool->front_len);
|
||||||
|
|
||||||
kref_set(&msg->kref, 1); /* retake a single ref */
|
kref_set(&msg->kref, 1); /* retake a single ref */
|
||||||
list_add(&msg->list_head, &pool->msgs);
|
list_add(&msg->list_head, &pool->msgs);
|
||||||
pool->num++;
|
pool->num++;
|
||||||
|
|
Loading…
Reference in New Issue