From patchwork Sun Feb 4 01:16:26 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 196389 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:7301:168b:b0:106:860b:bbdd with SMTP id ma11csp147978dyb; Sat, 3 Feb 2024 17:22:02 -0800 (PST) X-Google-Smtp-Source: AGHT+IHVmAY0cd+qMlgmCPCQ3UW0LqdlXnnKe9Lf4DppT5OHEuAxT6TZDLwTQTkRjh/wNKCKv2xk X-Received: by 2002:a05:6214:410e:b0:68c:8b88:1bfc with SMTP id kc14-20020a056214410e00b0068c8b881bfcmr3666749qvb.52.1707009721980; Sat, 03 Feb 2024 17:22:01 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1707009721; cv=pass; d=google.com; s=arc-20160816; b=eMINJwdvP3Vxn9rZjYo4MsF1zCskfPWEA+Kx1gToqLTedTPNvUaLH/slakJ+hckEyb jQD/Yh6yuVmsTHF44kpNkLHBA4qlggVahwEDexV8XoIpBTSzHX6GTSAThTNnzK8Dq6Bm KU1Lty0e+oZVd8avXoXpH/SNqDftqi4Iaof1fF2rZQKjKL7C1D5HFn1J0+WUlfKCw+RM 1qXmagelclPGz3xSuGnuCdbouWGRYnUj7llpASMkKFSsEqyy80LbijyVlSg+RycqqLVo UEgrieR7a0ISkfkwzQjblw0S0JdX9BGmSbi77SKn0JzrH59g9j4S43qF3ZqTvTeHV7DR uyfQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:list-unsubscribe:list-subscribe:list-id:precedence :references:subject:cc:to:from:date:user-agent:message-id; bh=kwTRVaPFi7jFT7FybTiKSvJzwUhui/eRif8AThJ9z+A=; fh=HwopmI7t+sSdbULx3GT74Kb1Hs5EQ8HiSixt9xqZrHo=; b=JbcW93tKWsHrHAxWhkLvNeFsRXlYD6qaQkn/8JUxg3sRdahY4J29B0lg/R7Bk0neNR k70OxIgdRq0sRkVRrRXpnt5eLnsX5m91FdskN/f+62JOP9Rt6gQb8kl0F32OVDIQz5p2 xgSQP3fzIo7Uw9+BmBHYksVY5U8ZPUm6Bu1f8ZicN5pNTQBDTBOI+IddUrRdfhnfSSY/ xVr4x2vCP0JlhVSYTG3K9v4I0rUk/H/X/NY39szDVb1W7rgXOqKKqOozgpKRzF4GKVcj Bp3Yn55VjZ5cnY3EdYMwotD+f+AnrgdAwbz/HyjuqJrKV5h60MmxGlmHUQ91xjEQM4cS DfUw==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of linux-kernel+bounces-51348-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51348-ouuuleilei=gmail.com@vger.kernel.org" X-Forwarded-Encrypted: i=1; AJvYcCXyGEZ3oOExSHzi9kfD4IpHZ0Wad2/Ry/ezHl7IWC6LBR80UXvUWqKe6GdQW6o2Ey8ecOggv4P6RB34V//047KPBhhu2g== Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id m2-20020a0cf182000000b0068c7251fe66si5555219qvl.568.2024.02.03.17.22.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 03 Feb 2024 17:22:01 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-51348-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of linux-kernel+bounces-51348-ouuuleilei=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-51348-ouuuleilei=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id C13921C22BC5 for ; Sun, 4 Feb 2024 01:22:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E2CCA168DA; Sun, 4 Feb 2024 01:18:10 +0000 (UTC) Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4D900AD5C; Sun, 4 Feb 2024 01:18:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707009487; cv=none; b=r5WMeHoE0FaqrwEkuRxXlIZBBrEU3ckHD9jtPcF3KEVnOpfBOEvTaR6jfpuGaoYFQNEOccNh/DsO5BVdIiEF6KuKTZO5/KlwwNZB7L/IVlzJ5OR3Ugjl/a2QM7dSpM7yrkGFIK7YE5L6lGQIS0EHvXFSfO2kitC7mxS5ExwR8mg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707009487; c=relaxed/simple; bh=B0uV6XWIxjvgJPAviJ7+MRlI7Dxo4ugR+2338kkGDTE=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=s7o+5TGkAaVWxegpjAEExBuv1PBICdavY5qyAGR40jGJrJ+mTZj9tFKIoKqbxddIASv8iyk1QYebtkRP0yHKfhzelkZJx+hMNToAvrXtavg15Kgn5OgMsDtGo9YQP06kGiFeE6h/hTvyMv+2xHLo++383NhzYP8bjbws/V3wd/c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2BB3FC4AF69; Sun, 4 Feb 2024 01:18:06 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.97) (envelope-from ) id 1rWR9Q-00000006Opr-3R73; Sat, 03 Feb 2024 20:18:28 -0500 Message-ID: <20240204011828.676131911@goodmis.org> User-Agent: quilt/0.67 Date: Sat, 03 Feb 2024 20:16:26 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Linus Torvalds , Greg Kroah-Hartman , Sasha Levin , Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , Geert Uytterhoeven , Geert Uytterhoeven , Kees Cook Subject: [v6.7][PATCH 11/23] eventfs: Save directory inodes in the eventfs_inode structure References: <20240204011615.703023949@goodmis.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1789929426537700968 X-GMAIL-MSGID: 1789929426537700968 From: "Steven Rostedt (Google)" The eventfs inodes and directories are allocated when referenced. But this leaves the issue of keeping consistent inode numbers and the number is only saved in the inode structure itself. When the inode is no longer referenced, it can be freed. When the file that the inode was representing is referenced again, the inode is once again created, but the inode number needs to be the same as it was before. Just making the inode numbers the same for all files is fine, but that does not work with directories. The find command will check for loops via the inode number and having the same inode number for directories triggers: # find /sys/kernel/tracing find: File system loop detected; '/sys/kernel/debug/tracing/events/initcall/initcall_finish' is part of the same file system loop as '/sys/kernel/debug/tracing/events/initcall'. [..] Linus pointed out that the eventfs_inode structure ends with a single 32bit int, and on 64 bit machines, there's likely a 4 byte hole due to alignment. We can use this hole to store the inode number for the eventfs_inode. All directories in eventfs are represented by an eventfs_inode and that data structure can hold its inode number. That last int was also purposely placed at the end of the structure to prevent holes from within. Now that there's a 4 byte number to hold the inode, both the inode number and the last integer can be moved up in the structure for better cache locality, where the llist and rcu fields can be moved to the end as they are only used when the eventfs_inode is being deleted. Link: https://lore.kernel.org/all/CAMuHMdXKiorg-jiuKoZpfZyDJ3Ynrfb8=X+c7x0Eewxn-YRdCA@mail.gmail.com/ Link: https://lore.kernel.org/linux-trace-kernel/20240122152748.46897388@gandalf.local.home Cc: Masami Hiramatsu Cc: Mathieu Desnoyers Cc: Linus Torvalds Reported-by: Geert Uytterhoeven Tested-by: Geert Uytterhoeven Fixes: 53c41052ba31 ("eventfs: Have the inodes all for files and directories all be the same") Signed-off-by: Steven Rostedt (Google) Reviewed-by: Kees Cook --- fs/tracefs/event_inode.c | 14 +++++++++++--- fs/tracefs/internal.h | 7 ++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/fs/tracefs/event_inode.c b/fs/tracefs/event_inode.c index 6795fda2af19..6b211522a13e 100644 --- a/fs/tracefs/event_inode.c +++ b/fs/tracefs/event_inode.c @@ -34,7 +34,15 @@ static DEFINE_MUTEX(eventfs_mutex); /* Choose something "unique" ;-) */ #define EVENTFS_FILE_INODE_INO 0x12c4e37 -#define EVENTFS_DIR_INODE_INO 0x134b2f5 + +/* Just try to make something consistent and unique */ +static int eventfs_dir_ino(struct eventfs_inode *ei) +{ + if (!ei->ino) + ei->ino = get_next_ino(); + + return ei->ino; +} /* * The eventfs_inode (ei) itself is protected by SRCU. It is released from @@ -396,7 +404,7 @@ static struct dentry *create_dir(struct eventfs_inode *ei, struct dentry *parent inode->i_fop = &eventfs_file_operations; /* All directories will have the same inode number */ - inode->i_ino = EVENTFS_DIR_INODE_INO; + inode->i_ino = eventfs_dir_ino(ei); ti = get_tracefs(inode); ti->flags |= TRACEFS_EVENT_INODE; @@ -802,7 +810,7 @@ static int eventfs_iterate(struct file *file, struct dir_context *ctx) name = ei_child->name; - ino = EVENTFS_DIR_INODE_INO; + ino = eventfs_dir_ino(ei_child); if (!dir_emit(ctx, name, strlen(name), ino, DT_DIR)) goto out_dec; diff --git a/fs/tracefs/internal.h b/fs/tracefs/internal.h index 12b7d0150ae9..45397df9bb65 100644 --- a/fs/tracefs/internal.h +++ b/fs/tracefs/internal.h @@ -55,6 +55,10 @@ struct eventfs_inode { struct eventfs_attr *entry_attrs; struct eventfs_attr attr; void *data; + unsigned int is_freed:1; + unsigned int is_events:1; + unsigned int nr_entries:30; + unsigned int ino; /* * Union - used for deletion * @llist: for calling dput() if needed after RCU @@ -64,9 +68,6 @@ struct eventfs_inode { struct llist_node llist; struct rcu_head rcu; }; - unsigned int is_freed:1; - unsigned int is_events:1; - unsigned int nr_entries:30; }; static inline struct tracefs_inode *get_tracefs(const struct inode *inode)