Do memory allocation first, so that avoid unnecessary initialization of newly allocated message in error case. Signed-off-by: Chengguang Xu <cgxu519@xxxxxxx> --- net/ceph/messenger.c | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index fcb40c1..5a8c5cd 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -3331,6 +3331,16 @@ void ceph_msg_data_add_bvecs(struct ceph_msg *msg, EXPORT_SYMBOL(ceph_msg_data_add_bvecs); /* + * Free a generically kmalloc'd message. + */ +static void ceph_msg_free(struct ceph_msg *m) +{ + dout("%s %p\n", __func__, m); + kvfree(m->front.iov_base); + kmem_cache_free(ceph_msg_cache, m); +} + +/* * construct a new message with given type, size * the new msg has a ref count of 1. */ @@ -3343,14 +3353,6 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags, if (m == NULL) goto out; - m->hdr.type = cpu_to_le16(type); - m->hdr.priority = cpu_to_le16(CEPH_MSG_PRIO_DEFAULT); - m->hdr.front_len = cpu_to_le32(front_len); - - INIT_LIST_HEAD(&m->list_head); - kref_init(&m->kref); - INIT_LIST_HEAD(&m->data); - /* front */ if (front_len) { m->front.iov_base = ceph_kvmalloc(front_len, flags); @@ -3359,16 +3361,23 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags, front_len); goto out2; } - } else { - m->front.iov_base = NULL; } + + m->hdr.type = cpu_to_le16(type); + m->hdr.priority = cpu_to_le16(CEPH_MSG_PRIO_DEFAULT); + m->hdr.front_len = cpu_to_le32(front_len); + + INIT_LIST_HEAD(&m->list_head); + kref_init(&m->kref); + INIT_LIST_HEAD(&m->data); + m->front_alloc_len = m->front.iov_len = front_len; dout("ceph_msg_new %p front %d\n", m, front_len); return m; out2: - ceph_msg_put(m); + ceph_msg_free(m); out: if (!can_fail) { pr_err("msg_new can't create type %d front %d\n", type, @@ -3467,17 +3476,6 @@ static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip) return ret; } - -/* - * Free a generically kmalloc'd message. - */ -static void ceph_msg_free(struct ceph_msg *m) -{ - dout("%s %p\n", __func__, m); - kvfree(m->front.iov_base); - kmem_cache_free(ceph_msg_cache, m); -} - static void ceph_msg_release(struct kref *kref) { struct ceph_msg *m = container_of(kref, struct ceph_msg, kref); -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html