From: Jeff Layton <jlayton@kernel.org>
To: "Darrick J. Wong" <djwong@kernel.org>
Cc: Alexander Viro <viro@zeniv.linux.org.uk>,
Christian Brauner <brauner@kernel.org>, Jan Kara <jack@suse.cz>,
Steven Rostedt <rostedt@goodmis.org>,
Masami Hiramatsu <mhiramat@kernel.org>,
Mathieu Desnoyers <mathieu.desnoyers@efficios.com>,
Chandan Babu R <chandan.babu@oracle.com>,
Theodore Ts'o <tytso@mit.edu>,
Andreas Dilger <adilger.kernel@dilger.ca>,
Chris Mason <clm@fb.com>, Josef Bacik <josef@toxicpanda.com>,
David Sterba <dsterba@suse.com>, Hugh Dickins <hughd@google.com>,
Andrew Morton <akpm@linux-foundation.org>,
kernel-team@fb.com, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org,
linux-trace-kernel@vger.kernel.org, linux-xfs@vger.kernel.org,
linux-ext4@vger.kernel.org, linux-btrfs@vger.kernel.org,
linux-mm@kvack.org, linux-nfs@vger.kernel.org
Subject: Re: [PATCH 01/10] fs: turn inode ctime fields into a single ktime_t
Date: Mon, 01 Jul 2024 20:22:07 -0400 [thread overview]
Message-ID: <3042db2f803fbc711575ec4f1c4a273912a50904.camel@kernel.org> (raw)
In-Reply-To: <20240701224941.GE612460@frogsfrogsfrogs>
On Mon, 2024-07-01 at 15:49 -0700, Darrick J. Wong wrote:
> On Wed, Jun 26, 2024 at 09:00:21PM -0400, Jeff Layton wrote:
> > The ctime is not settable to arbitrary values. It always comes from the
> > system clock, so we'll never stamp an inode with a value that can't be
> > represented there. If we disregard people setting their system clock
> > past the year 2262, there is no reason we can't replace the ctime fields
> > with a ktime_t.
> >
> > Switch the ctime fields to a single ktime_t. Move the i_generation down
> > above i_fsnotify_mask and then move the i_version into the resulting 8
> > byte hole. This shrinks struct inode by 8 bytes total, and should
> > improve the cache footprint as the i_version and ctime are usually
> > updated together.
> >
> > The one downside I can see to switching to a ktime_t is that if someone
> > has a filesystem with files on it that has ctimes outside the ktime_t
> > range (before ~1678 AD or after ~2262 AD), we won't be able to display
> > them properly in stat() without some special treatment in the
> > filesystem. The operating assumption here is that that is not a
> > practical problem.
>
> What happens if a filesystem with the ability to store ctimes beyond
> whatever ktime_t supports (AFAICT 2^63-1 nanonseconds on either side of
> the Unix epoch)? I think the behavior with your patch is that ktime_set
> clamps the ctime on iget because the kernel can't handle it?
>
> It's a little surprising that the ctime will suddenly jump back in time
> to 2262, but maybe you're right that nobody will notice or care? ;)
>
>
Yeah, it'd be clamped at KTIME_MAX when we pull in the inode from disk,
a'la ktime_set.
I think it's important to note that the ctime is not settable from
userland, so if an on-disk ctime is outside of the ktime_t range, there
are only two possibilities:
1) the system clock was set to some time (far) in the future when the
file's metadata was last altered (bad clock? time traveling fs?).
...or...
2) the filesystem has been altered (fuzzing? deliberate doctoring?).
None of these seem like legitimate use cases so I'm arguing that we
shouldn't worry about them.
(...ok maybe the time travel one could be legit, but someone needs to
step up and make a case for it, if so.)
> >
> > Signed-off-by: Jeff Layton <jlayton@kernel.org>
> > ---
> > include/linux/fs.h | 26 +++++++++++---------------
> > 1 file changed, 11 insertions(+), 15 deletions(-)
> >
> > diff --git a/include/linux/fs.h b/include/linux/fs.h
> > index 5ff362277834..5139dec085f2 100644
> > --- a/include/linux/fs.h
> > +++ b/include/linux/fs.h
> > @@ -662,11 +662,10 @@ struct inode {
> > loff_t i_size;
> > time64_t i_atime_sec;
> > time64_t i_mtime_sec;
> > - time64_t i_ctime_sec;
> > u32 i_atime_nsec;
> > u32 i_mtime_nsec;
> > - u32 i_ctime_nsec;
> > - u32 i_generation;
> > + ktime_t __i_ctime;
> > + atomic64_t i_version;
> > spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */
> > unsigned short i_bytes;
> > u8 i_blkbits;
> > @@ -701,7 +700,6 @@ struct inode {
> > struct hlist_head i_dentry;
> > struct rcu_head i_rcu;
> > };
> > - atomic64_t i_version;
> > atomic64_t i_sequence; /* see futex */
> > atomic_t i_count;
> > atomic_t i_dio_count;
> > @@ -724,6 +722,8 @@ struct inode {
> > };
> >
> >
> > + u32 i_generation;
> > +
> > #ifdef CONFIG_FSNOTIFY
> > __u32 i_fsnotify_mask; /* all events this inode cares about */
> > /* 32-bit hole reserved for expanding i_fsnotify_mask */
> > @@ -1608,29 +1608,25 @@ static inline struct timespec64 inode_set_mtime(struct inode *inode,
> > return inode_set_mtime_to_ts(inode, ts);
> > }
> >
> > -static inline time64_t inode_get_ctime_sec(const struct inode *inode)
> > +static inline struct timespec64 inode_get_ctime(const struct inode *inode)
> > {
> > - return inode->i_ctime_sec;
> > + return ktime_to_timespec64(inode->__i_ctime);
> > }
> >
> > -static inline long inode_get_ctime_nsec(const struct inode *inode)
> > +static inline time64_t inode_get_ctime_sec(const struct inode *inode)
> > {
> > - return inode->i_ctime_nsec;
> > + return inode_get_ctime(inode).tv_sec;
> > }
> >
> > -static inline struct timespec64 inode_get_ctime(const struct inode *inode)
> > +static inline long inode_get_ctime_nsec(const struct inode *inode)
> > {
> > - struct timespec64 ts = { .tv_sec = inode_get_ctime_sec(inode),
> > - .tv_nsec = inode_get_ctime_nsec(inode) };
> > -
> > - return ts;
> > + return inode_get_ctime(inode).tv_nsec;
> > }
> >
> > static inline struct timespec64 inode_set_ctime_to_ts(struct inode *inode,
> > struct timespec64 ts)
> > {
> > - inode->i_ctime_sec = ts.tv_sec;
> > - inode->i_ctime_nsec = ts.tv_nsec;
> > + inode->__i_ctime = ktime_set(ts.tv_sec, ts.tv_nsec);
> > return ts;
> > }
> >
> >
> > --
> > 2.45.2
> >
> >
--
Jeff Layton <jlayton@kernel.org>
next prev parent reply other threads:[~2024-07-02 0:22 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-27 1:00 [PATCH 00/10] fs: multigrain timestamp redux Jeff Layton
2024-06-27 1:00 ` [PATCH 01/10] fs: turn inode ctime fields into a single ktime_t Jeff Layton
2024-07-01 22:49 ` Darrick J. Wong
2024-07-02 0:22 ` Jeff Layton [this message]
2024-07-02 7:37 ` Christoph Hellwig
2024-07-02 9:56 ` Jeff Layton
2024-07-02 10:19 ` Jan Kara
2024-07-02 11:42 ` Christian Brauner
2024-07-02 11:44 ` Jeff Layton
2024-07-02 12:04 ` Christoph Hellwig
2024-07-02 12:09 ` Jeff Layton
2024-07-02 12:15 ` Christoph Hellwig
2024-07-02 12:21 ` Jeff Layton
2024-07-02 15:12 ` Christoph Hellwig
2024-07-02 15:58 ` Jeff Layton
2024-07-03 5:26 ` Christoph Hellwig
2024-07-03 5:27 ` Christoph Hellwig
2024-07-02 16:18 ` Christian Brauner
2024-06-27 1:00 ` [PATCH 02/10] fs: uninline inode_get_ctime and inode_set_ctime_to_ts Jeff Layton
2024-06-27 1:00 ` [PATCH 03/10] fs: tracepoints for inode_needs_update_time " Jeff Layton
2024-06-27 1:00 ` [PATCH 04/10] fs: add infrastructure for multigrain timestamps Jeff Layton
2024-06-27 15:02 ` Chuck Lever
2024-06-27 15:35 ` Jeff Layton
2024-06-27 1:00 ` [PATCH 05/10] fs: add percpu counters to count fine vs. coarse timestamps Jeff Layton
2024-06-27 1:00 ` [PATCH 06/10] fs: have setattr_copy handle multigrain timestamps appropriately Jeff Layton
2024-06-27 1:00 ` [PATCH 07/10] xfs: switch to multigrain timestamps Jeff Layton
2024-06-27 1:00 ` [PATCH 08/10] ext4: " Jeff Layton
2024-06-27 1:00 ` [PATCH 09/10] btrfs: convert " Jeff Layton
2024-06-27 1:00 ` [PATCH 10/10] tmpfs: add support for " Jeff Layton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3042db2f803fbc711575ec4f1c4a273912a50904.camel@kernel.org \
--to=jlayton@kernel.org \
--cc=adilger.kernel@dilger.ca \
--cc=akpm@linux-foundation.org \
--cc=brauner@kernel.org \
--cc=chandan.babu@oracle.com \
--cc=clm@fb.com \
--cc=djwong@kernel.org \
--cc=dsterba@suse.com \
--cc=hughd@google.com \
--cc=jack@suse.cz \
--cc=josef@toxicpanda.com \
--cc=kernel-team@fb.com \
--cc=linux-btrfs@vger.kernel.org \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-nfs@vger.kernel.org \
--cc=linux-trace-kernel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=mathieu.desnoyers@efficios.com \
--cc=mhiramat@kernel.org \
--cc=rostedt@goodmis.org \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).