Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754488Ab3G2C61 (ORCPT ); Sun, 28 Jul 2013 22:58:27 -0400 Received: from mail.ispras.ru ([83.149.199.45]:54100 "EHLO mail.ispras.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752542Ab3G2C6Z (ORCPT ); Sun, 28 Jul 2013 22:58:25 -0400 From: Alexey Khoroshilov To: Sage Weil Cc: Alexey Khoroshilov , ceph-devel@vger.kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, ldv-project@linuxtesting.org Subject: [PATCH] libceph: fix deadlock in ceph_build_auth() Date: Mon, 29 Jul 2013 06:58:08 +0400 Message-Id: <1375066688-12367-1-git-send-email-khoroshilov@ispras.ru> X-Mailer: git-send-email 1.8.1.2 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2594 Lines: 79 ceph_build_auth() locks ac->mutex and then calls ceph_auth_build_hello() that locks the same mutex, i.e. bring itself to deadlock. The patch moves actual code from ceph_auth_build_hello() to ceph_build_hello_auth_request() that should be called with ac->mutex held and makes ceph_build_auth() calling it. ceph_auth_build_hello() is left with untouched semantics as a wrapper around ceph_build_hello_auth_request(). Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Alexey Khoroshilov --- net/ceph/auth.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/net/ceph/auth.c b/net/ceph/auth.c index 6b923bc..59594a6 100644 --- a/net/ceph/auth.c +++ b/net/ceph/auth.c @@ -98,14 +98,14 @@ int ceph_entity_name_encode(const char *name, void **p, void *end) * Initiate protocol negotiation with monitor. Include entity name * and list supported protocols. */ -int ceph_auth_build_hello(struct ceph_auth_client *ac, void *buf, size_t len) +static int ceph_build_hello_auth_request(struct ceph_auth_client *ac, + void *buf, size_t len) { struct ceph_mon_request_header *monhdr = buf; void *p = monhdr + 1, *end = buf + len, *lenp; int i, num; int ret; - mutex_lock(&ac->mutex); dout("auth_build_hello\n"); monhdr->have_version = 0; monhdr->session_mon = cpu_to_le16(-1); @@ -133,7 +133,6 @@ int ceph_auth_build_hello(struct ceph_auth_client *ac, void *buf, size_t len) ceph_encode_32(&lenp, p - lenp - sizeof(u32)); ret = p - buf; out: - mutex_unlock(&ac->mutex); return ret; bad: @@ -141,6 +140,16 @@ bad: goto out; } +int ceph_auth_build_hello(struct ceph_auth_client *ac, void *buf, size_t len) +{ + int ret; + + mutex_lock(&ac->mutex); + ret = ceph_build_hello_auth_request(ac, buf, len); + mutex_unlock(&ac->mutex); + return ret; +} + static int ceph_build_auth_request(struct ceph_auth_client *ac, void *msg_buf, size_t msg_len) { @@ -260,7 +269,7 @@ int ceph_build_auth(struct ceph_auth_client *ac, mutex_lock(&ac->mutex); if (!ac->protocol) - ret = ceph_auth_build_hello(ac, msg_buf, msg_len); + ret = ceph_build_hello_auth_request(ac, msg_buf, msg_len); else if (ac->ops->should_authenticate(ac)) ret = ceph_build_auth_request(ac, msg_buf, msg_len); mutex_unlock(&ac->mutex); -- 1.8.1.2 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/