From patchwork Mon Mar 4 18:12:17 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alex Elder X-Patchwork-Id: 2213721 Return-Path: X-Original-To: patchwork-ceph-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id C0CB5DF2F2 for ; Mon, 4 Mar 2013 18:12:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757496Ab3CDSMR (ORCPT ); Mon, 4 Mar 2013 13:12:17 -0500 Received: from mail-ie0-f174.google.com ([209.85.223.174]:51281 "EHLO mail-ie0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757191Ab3CDSMQ (ORCPT ); Mon, 4 Mar 2013 13:12:16 -0500 Received: by mail-ie0-f174.google.com with SMTP id k10so6546798iea.33 for ; Mon, 04 Mar 2013 10:12:16 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:message-id:date:from:user-agent:mime-version:to:subject :references:in-reply-to:content-type:content-transfer-encoding :x-gm-message-state; bh=4H5hhnXIbBAdgao36gn5Vh89HqicXlEL5OgPfK8EeLA=; b=G/ptLKfRJn7ExaejlZp481M8VFwOWhHJ0u4XA6pZoDUraEou0akhtY1ZXev+Dv8AiY rfFf9j/vh0skRnkpQo8yYKB7IA50eDhaXLvJTm95Pz7C06DID6KQvkOW/46WHG+xMOex 0vzniR2SW8jCXbE9V+walJQ92vy62TK+UbTDN5nQQW0EnPHZhXEw3Lr8HgXN0oDGf4FQ 2Uu3LJEMYGs0NSavWK9ieOBDDIbqixQfuZw3fldhQ/JCIFUSHpb9WebU/KYSPA+ZUpbV LgDgDome/w/t4PuIM26La5rCRz4YJ48APSkHprM9fvlMdYljOOQKj6uQRMvaqEK3ii66 YBqg== X-Received: by 10.50.100.167 with SMTP id ez7mr3216282igb.3.1362420736292; Mon, 04 Mar 2013 10:12:16 -0800 (PST) Received: from [172.22.22.4] (c-71-195-31-37.hsd1.mn.comcast.net. [71.195.31.37]) by mx.google.com with ESMTPS id ih1sm10404239igc.3.2013.03.04.10.12.14 (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Mon, 04 Mar 2013 10:12:15 -0800 (PST) Message-ID: <5134E401.6070604@inktank.com> Date: Mon, 04 Mar 2013 12:12:17 -0600 From: Alex Elder User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130221 Thunderbird/17.0.3 MIME-Version: 1.0 To: ceph-devel@vger.kernel.org Subject: [PATCH 2/3] libceph: define mds_alloc_msg() method References: <5134E25E.4030701@inktank.com> <5134E3AD.4080906@inktank.com> In-Reply-To: <5134E3AD.4080906@inktank.com> X-Gm-Message-State: ALoCoQlesVQe5U60gLb6ym4rJVQjEHYzdUc7uiboGCMYwQw/h0TBFLfcQc0EOj2B/7unQO2SGHi/ Sender: ceph-devel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: ceph-devel@vger.kernel.org The only user of the ceph messenger that doesn't define an alloc_msg method is the mds client. Define one, such that it works just like it did before, and simplify ceph_con_in_msg_alloc() by assuming the alloc_msg method is always present. This and the next patch resolve: http://tracker.ceph.com/issues/4322 Signed-off-by: Alex Elder --- fs/ceph/mds_client.c | 23 ++++++++++++++++++++ net/ceph/messenger.c | 59 ++++++++++++++++---------------------------------- 2 files changed, 42 insertions(+), 40 deletions(-) diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 76b7344..a4b986a 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c @@ -3469,6 +3469,28 @@ static int invalidate_authorizer(struct ceph_connection *con) return ceph_monc_validate_auth(&mdsc->fsc->client->monc); } +static struct ceph_msg *mds_alloc_msg(struct ceph_connection *con, + struct ceph_msg_header *hdr, int *skip) +{ + struct ceph_msg *msg; + int type = (int) le16_to_cpu(hdr->type); + int front_len = (int) le32_to_cpu(hdr->front_len); + + if (con->in_msg) + return con->in_msg; + + *skip = 0; + msg = ceph_msg_new(type, front_len, GFP_NOFS, false); + if (!msg) { + pr_err("unable to allocate msg type %d len %d\n", + type, front_len); + return NULL; + } + msg->page_alignment = (unsigned int) le16_to_cpu(hdr->data_off); + + return msg; +} + static const struct ceph_connection_operations mds_con_ops = { .get = con_get, .put = con_put, @@ -3477,6 +3499,7 @@ static const struct ceph_connection_operations mds_con_ops = { .verify_authorizer_reply = verify_authorizer_reply, .invalidate_authorizer = invalidate_authorizer, .peer_reset = peer_reset, + .alloc_msg = mds_alloc_msg, }; /* eof */ diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 6ec6051..c7d4278 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c @@ -2804,55 +2804,34 @@ static int ceph_alloc_middle(struct ceph_connection *con, struct ceph_msg *msg) static int ceph_con_in_msg_alloc(struct ceph_connection *con, int *skip) { struct ceph_msg_header *hdr = &con->in_hdr; - int type = le16_to_cpu(hdr->type); - int front_len = le32_to_cpu(hdr->front_len); int middle_len = le32_to_cpu(hdr->middle_len); struct ceph_msg *msg; int ret = 0; BUG_ON(con->in_msg != NULL); + BUG_ON(!con->ops->alloc_msg); - if (con->ops->alloc_msg) { - mutex_unlock(&con->mutex); - msg = con->ops->alloc_msg(con, hdr, skip); - mutex_lock(&con->mutex); - if (con->state != CON_STATE_OPEN) { - if (msg) - ceph_msg_put(msg); - return -EAGAIN; - } - con->in_msg = msg; - if (con->in_msg) { - con->in_msg->con = con->ops->get(con); - BUG_ON(con->in_msg->con == NULL); - } - if (*skip) { - con->in_msg = NULL; - return 0; - } - if (!con->in_msg) { - con->error_msg = - "error allocating memory for incoming message"; - return -ENOMEM; - } - } - if (!con->in_msg) { - mutex_unlock(&con->mutex); - msg = ceph_msg_new(type, front_len, GFP_NOFS, false); - mutex_lock(&con->mutex); - if (!msg) { - pr_err("unable to allocate msg type %d len %d\n", - type, front_len); - return -ENOMEM; - } - if (con->state != CON_STATE_OPEN) { + mutex_unlock(&con->mutex); + msg = con->ops->alloc_msg(con, hdr, skip); + mutex_lock(&con->mutex); + if (con->state != CON_STATE_OPEN) { + if (msg) ceph_msg_put(msg); - return -EAGAIN; - } - con->in_msg = msg; + return -EAGAIN; + } + con->in_msg = msg; + if (con->in_msg) { con->in_msg->con = con->ops->get(con); BUG_ON(con->in_msg->con == NULL); - con->in_msg->page_alignment = le16_to_cpu(hdr->data_off); + } + if (*skip) { + con->in_msg = NULL; + return 0; + } + if (!con->in_msg) { + con->error_msg = + "error allocating memory for incoming message"; + return -ENOMEM; } memcpy(&con->in_msg->hdr, &con->in_hdr, sizeof(con->in_hdr));