On Fri, Feb 24, 2017 at 05:40:59PM -0800, Deepa Dinamani wrote: > Add fields to the superblock to track the min and max > timestamps supported by filesystems. > > Initially, when a superblock is allocated, initialize > it to the max and min values the fields can hold. > Individual filesystems override these to match their > actual limits. > > Pseudo filesystems are assumed to always support the > min and max allowable values for the fields. > > Note that the time ranges are saved in type time64_t > rather than time_t. > This is required because if we save ranges in time_t > then we would not be able to save timestamp ranges > for files that support timestamps beyond y2038. > > Signed-off-by: Deepa Dinamani <deepa.kernel@xxxxxxxxx> > --- > fs/super.c | 2 ++ > include/linux/fs.h | 3 +++ > include/linux/time64.h | 2 ++ > 3 files changed, 7 insertions(+) > > diff --git a/fs/super.c b/fs/super.c > index b8b6a08..f9c2241 100644 > --- a/fs/super.c > +++ b/fs/super.c > @@ -247,6 +247,8 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags, > s->s_maxbytes = MAX_NON_LFS; > s->s_op = &default_op; > s->s_time_gran = 1000000000; > + s->s_time_min = TIME64_MIN; > + s->s_time_max = TIME64_MAX; Just out of curiosity, does this enable 64-bit timestamps for everything by default? I see that ext4 later sets its own values in fill_super; what about things like XFS that really only have 32-bit seconds fields? --D > s->cleancache_poolid = CLEANCACHE_NO_POOL; > > s->s_shrink.seeks = DEFAULT_SEEKS; > diff --git a/include/linux/fs.h b/include/linux/fs.h > index de8ed0b..ef55dfb 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -1337,6 +1337,9 @@ struct super_block { > /* Granularity of c/m/atime in ns. > Cannot be worse than a second */ > u32 s_time_gran; > + /* Time limits for c/m/atime in seconds. */ > + time64_t s_time_min; > + time64_t s_time_max; > > /* > * The next field is for VFS *only*. No filesystems have any business > diff --git a/include/linux/time64.h b/include/linux/time64.h > index 980c71b..25433b18 100644 > --- a/include/linux/time64.h > +++ b/include/linux/time64.h > @@ -38,6 +38,8 @@ struct itimerspec64 { > > /* Located here for timespec[64]_valid_strict */ > #define TIME64_MAX ((s64)~((u64)1 << 63)) > +#define TIME64_MIN (-TIME64_MAX - 1) > + > #define KTIME_MAX ((s64)~((u64)1 << 63)) > #define KTIME_SEC_MAX (KTIME_MAX / NSEC_PER_SEC) > > -- > 2.7.4 >