Skip to content

Commit

Permalink
ceph: reset front len on return to msgpool; BUG on mismatched front iov
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sage Weil committed Mar 1, 2010
1 parent 70edb55 commit 3ca02ef
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 0 deletions.
2 changes: 2 additions & 0 deletions fs/ceph/messenger.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.orig_src = msg->hdr.src;

BUG_ON(msg->front.iov_len != le32_to_cpu(msg->hdr.front_len));

/* queue */
mutex_lock(&con->mutex);
BUG_ON(!list_empty(&msg->list_head));
Expand Down
4 changes: 4 additions & 0 deletions fs/ceph/msgpool.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,10 @@ void ceph_msgpool_put(struct ceph_msgpool *pool, struct ceph_msg *msg)
{
spin_lock(&pool->lock);
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 */
list_add(&msg->list_head, &pool->msgs);
pool->num++;
Expand Down

0 comments on commit 3ca02ef

Please sign in to comment.