All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: Arnd Bergmann <arnd@arndb.de>
Cc: Deepa Dinamani <deepa.kernel@gmail.com>,
	linux-fsdevel@vger.kernel.org, y2038@lists.linaro.org,
	viro@zeniv.linux.org.uk, tglx@linutronix.de
Subject: Re: [PATCH] vfs: Add support to check max and min inode times
Date: Thu, 3 Mar 2016 10:45:11 +1100	[thread overview]
Message-ID: <20160302234511.GQ29057@dastard> (raw)
In-Reply-To: <13921309.M0ueQbL1WN@wuerfel>

On Thu, Mar 03, 2016 at 12:07:42AM +0100, Arnd Bergmann wrote:
> On Thursday 03 March 2016 09:19:05 Dave Chinner wrote:
> > On Wed, Mar 02, 2016 at 07:51:34AM -0800, Deepa Dinamani wrote:
> > > MAX_INVALID_VFS_TIME and MIN_INVALID_VFS_TIME are initialized to S64_MIN
> > > and S64_MAX respectively so that even if one of the fields is
> > > uninitialized, it can be detected by using the condition
> > > max_time < min_time.
> > 
> > I can't work out what MIN/MAX_INVALID_VFS_TIME is supposed to mean
> > when I see it in the code. does it mean time that lies between
> > MIN_INVALID_VFS_TIME > time > MAX_INVALID_VFS_TIME is invalid
> > (unlikely, but that's the obvious reading :)?
> > 
> > Or that time < MIN_INVALID_VFS_TIME is invalid? Or is it valid? I
> > can't tell...
> > 
> > Normally limits are specified by "min valid" and "max valid"
> > defines, which are pretty clear in their meaning. Like:
> 
> Hmm, I had meant to comment on this in my private discussion.
> 
> I agree this needs some more explanation in the source code,
> the idea is that once we have modified all file systems to
> correctly set the actual limits, we can then detect any newly
> added file system that forgets to set them, so we don't get
> accidental incorrect limits.

But if a superblock supports full 64 bit time resolution (i.e.
MIN_VFS_TIME to MAX_VFS_TIME) then you can't tell the difference
and will warn inappropriately.

> > > --- a/include/linux/fs.h
> > > +++ b/include/linux/fs.h
> > > @@ -927,6 +927,12 @@ static inline struct file *get_file(struct file *f)
> > >  #define MAX_LFS_FILESIZE 	((loff_t)0x7fffffffffffffffLL)
> > >  #endif
> > >  
> > > +#define MAX_VFS_TIME	S64_MAX
> > > +#define MIN_VFS_TIME	S64_MIN
> > 
> > These. Anything ouside these ranges is invalid.
> > 
> > As such, I think this is wrong for 32 bit systems as the min/max VFS
> > times right now are S32_MAX/S32_MIN...
> 
> I think the file system should always set the actual on-disk format
> limits in the superblock, regardless of the word size of the CPU
> architecture.

Eventually, yes. But right now, 32 bit systems are limited by the
platform architecture. Hence no matter what the filesystem on-disk
format supports, these are going to hard limits until filesystems
start modifying the defaults to indicate what their on-disk format
supports.

i.e. 32 bit systems should default to 32 bit time limits until the
filesystem developers come along and verify that conversion from
their on-disk format to 64 bit time works correctly. Then they set
their real limits which may (or may not) be >y2038 compatible, and
this means that filesystems that have not been converted to >y2038
compatible do not need any modifications to behave correctly on 32
bit systems...

> We already support 32-bit time_t in compat tasks on 64-bit
> architectures, and we will support  64-bit time_t in normal
> tasks on 32-bit architectures in the future, and there is no
> need to range-check the timestamps written to disk.
> 
> The one range-check that we probably want for current 32-bit tasks
> is in the vfs_fstatat/vfs_getattr code, so a kernel that internally
> handles post-2038 timestamps can limit them to S32_MAX instead of
> wrapping.

Those should return EOVERFLOW rather than an incorrect timestamp,
like we do for other 64 bit fields stat returns that can't fit in 32
bit stat fields. That's a clear indication of a process that should
be using stat64() instead.

Cheers,

Dave.
-- 
Dave Chinner
david@fromorbit.com

  reply	other threads:[~2016-03-02 23:50 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-02 15:51 [PATCH] vfs: Add support to check max and min inode times Deepa Dinamani
2016-03-02 16:26 ` [Y2038] " Arnd Bergmann
2016-03-02 22:19 ` Dave Chinner
2016-03-02 23:07   ` Arnd Bergmann
2016-03-02 23:45     ` Dave Chinner [this message]
2016-03-03  6:24       ` Deepa Dinamani
2016-03-03 14:08       ` [Y2038] " Arnd Bergmann
2016-03-04  1:10         ` Dave Chinner
2016-03-04  7:49           ` Deepa Dinamani
2016-03-04 16:54           ` Arnd Bergmann
2016-03-04  6:31         ` Steve French
2016-03-04 16:21           ` Arnd Bergmann

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=20160302234511.GQ29057@dastard \
    --to=david@fromorbit.com \
    --cc=arnd@arndb.de \
    --cc=deepa.kernel@gmail.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --cc=viro@zeniv.linux.org.uk \
    --cc=y2038@lists.linaro.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.