From patchwork Tue Aug 11 12:19:58 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Simmons X-Patchwork-Id: 11709169 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B8C881392 for ; Tue, 11 Aug 2020 12:20:37 +0000 (UTC) Received: from pdx1-mailman02.dreamhost.com (pdx1-mailman02.dreamhost.com [64.90.62.194]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id A0BA4206C3 for ; Tue, 11 Aug 2020 12:20:37 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A0BA4206C3 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=infradead.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lustre-devel-bounces@lists.lustre.org Received: from pdx1-mailman02.dreamhost.com (localhost [IPv6:::1]) by pdx1-mailman02.dreamhost.com (Postfix) with ESMTP id 8E2172F379C; Tue, 11 Aug 2020 05:20:30 -0700 (PDT) X-Original-To: lustre-devel@lists.lustre.org Delivered-To: lustre-devel-lustre.org@pdx1-mailman02.dreamhost.com Received: from smtp4.ccs.ornl.gov (smtp4.ccs.ornl.gov [160.91.203.40]) by pdx1-mailman02.dreamhost.com (Postfix) with ESMTP id 43B0221F157 for ; Tue, 11 Aug 2020 05:20:23 -0700 (PDT) Received: from star.ccs.ornl.gov (star.ccs.ornl.gov [160.91.202.134]) by smtp4.ccs.ornl.gov (Postfix) with ESMTP id EE2C310055EA; Tue, 11 Aug 2020 08:20:20 -0400 (EDT) Received: by star.ccs.ornl.gov (Postfix, from userid 2004) id E1A582B1; Tue, 11 Aug 2020 08:20:20 -0400 (EDT) From: James Simmons To: Andreas Dilger , Oleg Drokin , NeilBrown Date: Tue, 11 Aug 2020 08:19:58 -0400 Message-Id: <1597148419-20629-3-git-send-email-jsimmons@infradead.org> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1597148419-20629-1-git-send-email-jsimmons@infradead.org> References: <1597148419-20629-1-git-send-email-jsimmons@infradead.org> Subject: [lustre-devel] [PATCH 02/23] lustre: lov: annotate nested locking of obd_dev_mutex X-BeenThere: lustre-devel@lists.lustre.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "For discussing Lustre software development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Lustre Development List MIME-Version: 1.0 Errors-To: lustre-devel-bounces@lists.lustre.org Sender: "lustre-devel" From: Mr NeilBrown obd_statfs() can call lmv_statfs() with ->obd_dev_mutex helds. lmv_statfs will then call obd_statfs() on a different device and ->obd_dev_mutex will be taken again. This is a *different* mutex, but lockdep cannot see the difference, so it complains. We can tell lockdep not to worry in this case using mutex_lock_interruptible_nested(). WC-bug-id: https://jira.whamcloud.com/browse/LU-9679 Lustre-commit: 10dae4c3b68eb ("LU-9679 lov: annotate nested locking of obd_dev_mutex") Signed-off-by: Mr NeilBrown Reviewed-on: https://review.whamcloud.com/39248 Reviewed-by: James Simmons Reviewed-by: Shaun Tancheff Reviewed-by: Oleg Drokin Signed-off-by: James Simmons --- fs/lustre/include/obd_class.h | 8 +++++++- fs/lustre/lmv/lmv_obd.c | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/lustre/include/obd_class.h b/fs/lustre/include/obd_class.h index 78f7b16..e8168bc5 100644 --- a/fs/lustre/include/obd_class.h +++ b/fs/lustre/include/obd_class.h @@ -49,6 +49,10 @@ #define OBD_STATFS_FOR_MDT0 0x0004 /* get aggregated statfs from MDT */ #define OBD_STATFS_SUM 0x0008 +#define OBD_STATFS_NESTED 0x0010 /* Call while already holding + * obd_dev_mutex of a difference + * device. + */ /* OBD Device Declarations */ extern rwlock_t obd_dev_lock; @@ -945,7 +949,9 @@ static inline int obd_statfs(const struct lu_env *env, struct obd_export *exp, ((obd->obd_osfs.os_state & OS_STATFS_SUM) && !(flags & OBD_STATFS_SUM))) { /* the RPC will block anyway, so avoid sending many at once */ - rc = mutex_lock_interruptible(&obd->obd_dev_mutex); + rc = mutex_lock_interruptible_nested(&obd->obd_dev_mutex, + (flags & OBD_STATFS_NESTED) + ? SINGLE_DEPTH_NESTING : 0); if (rc) return rc; if (obd->obd_osfs_age < max_age || diff --git a/fs/lustre/lmv/lmv_obd.c b/fs/lustre/lmv/lmv_obd.c index 4131b49..5a75c69 100644 --- a/fs/lustre/lmv/lmv_obd.c +++ b/fs/lustre/lmv/lmv_obd.c @@ -1248,7 +1248,8 @@ static int lmv_statfs(const struct lu_env *env, struct obd_export *exp, if (!tgt || !tgt->ltd_exp) continue; - rc = obd_statfs(env, tgt->ltd_exp, temp, max_age, flags); + rc = obd_statfs(env, tgt->ltd_exp, temp, max_age, + flags | OBD_STATFS_NESTED); if (rc) { CERROR("%s: can't stat MDS #%d: rc = %d\n", tgt->ltd_exp->exp_obd->obd_name, i, rc);