Received: by 2002:a05:7412:b10a:b0:f3:1519:9f41 with SMTP id az10csp2971016rdb; Mon, 4 Dec 2023 12:38:46 -0800 (PST) X-Google-Smtp-Source: AGHT+IHFPBQPipU5phoPHR532hnp00OwTEjndP0Nt88fvG4yJUOS3CdZwgiIdqBV9WwXzZU7NHtx X-Received: by 2002:a17:902:db05:b0:1ce:6589:d1c0 with SMTP id m5-20020a170902db0500b001ce6589d1c0mr5220918plx.46.1701722325897; Mon, 04 Dec 2023 12:38:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1701722325; cv=none; d=google.com; s=arc-20160816; b=teQKXcU2+P+HzIu8ljUDoICLnB4kMTZp5ksLC3uuJ2HF6pBzzNjZhJzzuIKktea0Ww fJrB1WmfSIMpCvj8Qtlk4rW+/8ounom1PbPb3JyltlvR9IdbRgic4LXlSCvQgswxWQGH PvitUQj9Ko1TRAdj3XOWGapjD622wVRjhQUBt1wC3OkSAM2TKfU5wBKzchqF24mAzDt8 IecsVlCT17VSmZFGOiAQza0xF/BCFmwI9s6Ets8oN7XRSZ0fl64WpJI65kdoDKehp3Yu 2ae6qO89MErsoBWTSkLJh8ub1fu+JLwL0ykIU+yEZ25XsBaIaDqvVJG+NjKkdqRXNZLE tnJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=1ABNBoZaoVmKSg6nhG9R+BUPyZFwQZVKMlthnXXsQUA=; fh=O6f1As6qTdRDG4qMxG9MQ+/7HPm+rMmH0JY81zRf/Kw=; b=kWugbsLUJuoiR5Z9Jp6YBbb7/lKXIiK6TrW8k2sd9INVnUG0B/JGzfWkS8To0ViA2M 0axWbSE4SFM+WDGYTQHdL2QEZ48gFFCIMhcnv4OFhc1qNaBNVauiKwMf4KR/t/g07kOL zkhhS+iqWluy4iT9D1qyVFk6AJ2Tdzt/ISJFuZGtAFwF2YALJZODZg6LH7xUJLqq6WfV YBU3LmvTnwWwqAVplpDtc3yPWd7ek8/K4/7J6h0UjSV3FXyKhL5JuOGZQraYbwXXWbOd 3W6JLx+rkjeUbTnpolhGodhg1HhA+N4EM5TmEnSgmOyV3UvNGXCN8Qu9MSlypO/qyHmx Mysg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=iHHkh8vf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id q2-20020a170902788200b001cfd2c5ae92si3611935pll.521.2023.12.04.12.38.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Dec 2023 12:38:45 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=iHHkh8vf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id A31598042A95; Mon, 4 Dec 2023 12:38:34 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346315AbjLDUh5 (ORCPT + 99 others); Mon, 4 Dec 2023 15:37:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58300 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235571AbjLDUhZ (ORCPT ); Mon, 4 Dec 2023 15:37:25 -0500 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6427B18E for ; Mon, 4 Dec 2023 12:35:40 -0800 (PST) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 14263C433D9; Mon, 4 Dec 2023 20:35:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1701722140; bh=1aSSTz76/mulK0UxRDrGBoJkZ0tRJ/L82eiGvkMYXJ0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iHHkh8vfLgVkI4xN0UiPY4OMI9u8qL5y7Scl0cpk9UkyZpzE7L7b74ukyVRd3BvWb 3qGh+XZXubLvYvFSHohcBkxcEDaNhmOgz2gTCiu4H/NClWXLoIronQIFx3RxTZHqM8 yfLrxJo/gD2BAWRAcE5ZQjHsi2mg/gO8nCDECNO0YCKTB15aLaa7ceIeZ/7Qcj1b6v EXHVBwWnbWtJHFyHF6w+T43FawSa6SJCQyWz5VSk7FLTAhXwcE8rqpoGtVUKqoQNox qyKaxItvf4Vv+1+02ulex1vL7b1NzqEL89xNmo9GINpKP5nvpWb1slkBX3KFR8S+v0 2h4xwxdnjPZUQ== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Johannes Berg , Greg Kroah-Hartman , Sasha Levin Subject: [PATCH AUTOSEL 6.1 09/17] debugfs: annotate debugfs handlers vs. removal with lockdep Date: Mon, 4 Dec 2023 15:34:54 -0500 Message-ID: <20231204203514.2093855-9-sashal@kernel.org> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231204203514.2093855-1-sashal@kernel.org> References: <20231204203514.2093855-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.1.65 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-1.2 required=5.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on howler.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Mon, 04 Dec 2023 12:38:35 -0800 (PST) From: Johannes Berg [ Upstream commit f4acfcd4deb158b96595250cc332901b282d15b0 ] When you take a lock in a debugfs handler but also try to remove the debugfs file under that lock, things can deadlock since the removal has to wait for all users to finish. Add lockdep annotations in debugfs_file_get()/_put() to catch such issues. Acked-by: Greg Kroah-Hartman Signed-off-by: Johannes Berg Signed-off-by: Sasha Levin --- fs/debugfs/file.c | 10 ++++++++++ fs/debugfs/inode.c | 12 ++++++++++++ fs/debugfs/internal.h | 6 ++++++ 3 files changed, 28 insertions(+) diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index b38304b444764..375af381bf005 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c @@ -108,6 +108,12 @@ int debugfs_file_get(struct dentry *dentry) kfree(fsd); fsd = READ_ONCE(dentry->d_fsdata); } +#ifdef CONFIG_LOCKDEP + fsd->lock_name = kasprintf(GFP_KERNEL, "debugfs:%pd", dentry); + lockdep_register_key(&fsd->key); + lockdep_init_map(&fsd->lockdep_map, fsd->lock_name ?: "debugfs", + &fsd->key, 0); +#endif } /* @@ -124,6 +130,8 @@ int debugfs_file_get(struct dentry *dentry) if (!refcount_inc_not_zero(&fsd->active_users)) return -EIO; + lock_map_acquire_read(&fsd->lockdep_map); + return 0; } EXPORT_SYMBOL_GPL(debugfs_file_get); @@ -141,6 +149,8 @@ void debugfs_file_put(struct dentry *dentry) { struct debugfs_fsdata *fsd = READ_ONCE(dentry->d_fsdata); + lock_map_release(&fsd->lockdep_map); + if (refcount_dec_and_test(&fsd->active_users)) complete(&fsd->active_users_drained); } diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index 08ef685167ec5..8fc470aa67823 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c @@ -242,6 +242,14 @@ static void debugfs_release_dentry(struct dentry *dentry) if ((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT) return; + /* check it wasn't a dir (no fsdata) or automount (no real_fops) */ + if (fsd && fsd->real_fops) { +#ifdef CONFIG_LOCKDEP + lockdep_unregister_key(&fsd->key); + kfree(fsd->lock_name); +#endif + } + kfree(fsd); } @@ -745,6 +753,10 @@ static void __debugfs_file_removed(struct dentry *dentry) fsd = READ_ONCE(dentry->d_fsdata); if ((unsigned long)fsd & DEBUGFS_FSDATA_IS_REAL_FOPS_BIT) return; + + lock_map_acquire(&fsd->lockdep_map); + lock_map_release(&fsd->lockdep_map); + if (!refcount_dec_and_test(&fsd->active_users)) wait_for_completion(&fsd->active_users_drained); } diff --git a/fs/debugfs/internal.h b/fs/debugfs/internal.h index f7c489b5a368c..c7d61cfc97d26 100644 --- a/fs/debugfs/internal.h +++ b/fs/debugfs/internal.h @@ -7,6 +7,7 @@ #ifndef _DEBUGFS_INTERNAL_H_ #define _DEBUGFS_INTERNAL_H_ +#include struct file_operations; @@ -23,6 +24,11 @@ struct debugfs_fsdata { struct { refcount_t active_users; struct completion active_users_drained; +#ifdef CONFIG_LOCKDEP + struct lockdep_map lockdep_map; + struct lock_class_key key; + char *lock_name; +#endif }; }; }; -- 2.42.0