[Y2038] [PATCH] generic/390: Add tests for inode timestamp policy

2016-11-23 Thread Deepa Dinamani
The test helps to validate clamping and mount behaviors
according to supported file system timestamp ranges.

Note that the test can fail on 32-bit systems for a
few file systems. This will be corrected when vfs is
transitioned to use 64-bit timestamps.

Signed-off-by: Deepa Dinamani 
---
 common/attr   |  27 ++
 src/Makefile  |   2 +-
 src/y2038_futimens.c  |  61 +
 tests/generic/390 | 238 ++
 tests/generic/390.out |   2 +
 tests/generic/group   |   1 +
 6 files changed, 330 insertions(+), 1 deletion(-)
 create mode 100644 src/y2038_futimens.c
 create mode 100755 tests/generic/390
 create mode 100644 tests/generic/390.out

diff --git a/common/attr b/common/attr
index ce2d76a..579dc9b 100644
--- a/common/attr
+++ b/common/attr
@@ -56,6 +56,33 @@ _acl_get_max()
esac
 }
 
+_filesystem_timestamp_range()
+{
+   device=${1:-$TEST_DEV}
+   case $FSTYP in
+   ext4)   #dumpe2fs
+   if [ $(dumpe2fs -h $device 2>/dev/null | grep "Inode size:" | 
cut -d: -f2) -gt 128 ]; then
+   echo "-2147483648 15032385535"
+   else
+   echo "-2147483648 2147483647"
+   fi
+   ;;
+
+   xfs)
+   echo "-2147483648 2147483647"
+   ;;
+   jfs)
+   echo "0 4294967295"
+   ;;
+   f2fs)
+   echo "-2147483648 2147483647"
+   ;;
+   *)
+   echo "-1 -1"
+   ;;
+   esac
+}
+
 _require_acl_get_max()
 {
if [ $(_acl_get_max) -eq 0 ]; then
diff --git a/src/Makefile b/src/Makefile
index dd51216..0b99ae4 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -21,7 +21,7 @@ LINUX_TARGETS = xfsctl bstat t_mtab getdevicesize 
preallo_rw_pattern_reader \
stale_handle pwrite_mmap_blocked t_dir_offset2 seek_sanity_test \
seek_copy_test t_readdir_1 t_readdir_2 fsync-tester nsexec cloner \
renameat2 t_getcwd e4compact test-nextquota punch-alternating \
-   attr-list-by-handle-cursor-test listxattr
+   attr-list-by-handle-cursor-test listxattr y2038_futimens
 
 SUBDIRS =
 
diff --git a/src/y2038_futimens.c b/src/y2038_futimens.c
new file mode 100644
index 000..291e4fa
--- /dev/null
+++ b/src/y2038_futimens.c
@@ -0,0 +1,61 @@
+#include 
+#include 
+#include 
+#include 
+#include 
+
+int
+do_utime(int fd, long long time)
+{
+   struct timespec t[2];
+
+   /*
+* Convert long long to timespec format.
+* Seconds precision is assumed here.
+*/
+   t[0].tv_sec = time;
+   t[0].tv_nsec = 0;
+   t[1].tv_sec = time;
+   t[1].tv_nsec = 0;
+
+   /* Call utimens to update time. */
+   if (futimens(fd, t)) {
+   perror("futimens");
+   return 1;
+   }
+
+   return 0;
+}
+
+int
+main(int argc, char **argv)
+{
+   int fd;
+   long long time;
+
+   if(argc < 3) {
+   fprintf(stderr, "Usage: %s filename timestamp\n"
+   "Filename: file to be created or opened 
in current directory\n"
+   "Timestamp: is seconds since 1970-01-01 
00:00:00 UTC\n", argv[0]);
+   exit(1);
+   }
+
+   /* Create the file */
+   fd = creat(argv[1], 0666);
+   if(fd < 0) {
+   perror("creat");
+   exit(1);
+   }
+
+   /* Get the timestamp */
+   time = strtoull(argv[2], NULL, 0);
+   if (errno) {
+   perror("strtoull");
+   exit(1);
+   }
+
+   if (do_utime(fd, time))
+   return 1;
+
+   return 0;
+}
diff --git a/tests/generic/390 b/tests/generic/390
new file mode 100755
index 000..f069988
--- /dev/null
+++ b/tests/generic/390
@@ -0,0 +1,238 @@
+#! /bin/bash
+# FS QA Test No. generic/390
+#
+# Tests to verify policy for filesystem timestamps for
+# supported ranges:
+# 1. Verify filesystem rw mount according to sysctl
+# timestamp_supported.
+# 2. Verify timestamp clamping for timestamps beyond max
+# timestamp supported.
+#
+# Exit status 1: either or both tests above fail.
+# Exit status 0: both the above tests pass.
+
+seq=`basename $0`
+seqres=$RESULT_DIR/$seq
+echo "QA output created by $seq"
+#echo "output in $seqres.full"
+here=`pwd`
+
+# Get standard environment, filters and checks.
+. ./common/rc
+. ./common/filter
+. ./common/attr
+
+SRC_GROUPS=`find tests -not -path tests -type d -printf "%f "`
+
+# Prerequisites for the test run.
+_supported_fs generic
+_supported_os Linux
+_require_scratch
+
+Y2038_PROG=$here/src/y2038_futimens
+
+#initialize exit status
+status=0
+
+# Generic test cleanup function.
+_cleanup()
+{
+# Remove any leftover files from last run.
+rm -f ${SCRATCH_MNT}/test_?
+}
+
+#unmount and mount  $SCRATCH_DEV.
+_umount_mount_scratch_dev()
+{
+#change directory so that you are not using SCRATCH_MNT anymore.
+ 

[Y2038] [RFC 6/6] utimes: Clamp the timestamps before update

2016-11-23 Thread Deepa Dinamani
POSIX.1 section for futimens, utimensat and utimes says:
The file's relevant timestamp shall be set to the
greatest value supported by the file system that is
not greater than the specified time.

Clamp the timestamps accordingly before assignment.

Note that clamp_t macro is used for clamping here as vfs
is not yet using struct timespec64 internally. This is
for compilation purposes only.
The actual patch can only be merged only after vfs is
transitioned to use timespec64 for correct operation of
clamp macro. At which point, clamp_t() will be replaced
by clamp().

Signed-off-by: Deepa Dinamani 
---
 fs/utimes.c | 17 +
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/fs/utimes.c b/fs/utimes.c
index 22307cd..4378378 100644
--- a/fs/utimes.c
+++ b/fs/utimes.c
@@ -53,6 +53,7 @@ static int utimes_common(struct path *path, struct timespec 
*times)
int error;
struct iattr newattrs;
struct inode *inode = path->dentry->d_inode;
+   struct super_block *sb = inode->i_sb;
struct inode *delegated_inode = NULL;
 
error = mnt_want_write(path->mnt);
@@ -68,16 +69,24 @@ static int utimes_common(struct path *path, struct timespec 
*times)
if (times[0].tv_nsec == UTIME_OMIT)
newattrs.ia_valid &= ~ATTR_ATIME;
else if (times[0].tv_nsec != UTIME_NOW) {
-   newattrs.ia_atime.tv_sec = times[0].tv_sec;
-   newattrs.ia_atime.tv_nsec = times[0].tv_nsec;
+   newattrs.ia_atime.tv_sec =
+   clamp_t(time64_t, times[0].tv_sec, 
sb->s_time_min, sb->s_time_max);
+   if (times[0].tv_sec >= sb->s_time_max)
+   newattrs.ia_atime.tv_nsec = 0;
+   else
+   newattrs.ia_atime.tv_nsec = times[0].tv_nsec;
newattrs.ia_valid |= ATTR_ATIME_SET;
}
 
if (times[1].tv_nsec == UTIME_OMIT)
newattrs.ia_valid &= ~ATTR_MTIME;
else if (times[1].tv_nsec != UTIME_NOW) {
-   newattrs.ia_mtime.tv_sec = times[1].tv_sec;
-   newattrs.ia_mtime.tv_nsec = times[1].tv_nsec;
+   newattrs.ia_mtime.tv_sec =
+   clamp_t(time64_t, times[1].tv_sec, 
sb->s_time_min, sb->s_time_max);
+   if (times[1].tv_sec >= sb->s_time_max)
+   newattrs.ia_mtime.tv_nsec = 0;
+   else
+   newattrs.ia_mtime.tv_nsec = times[1].tv_nsec;
newattrs.ia_valid |= ATTR_MTIME_SET;
}
/*
-- 
2.7.4

___
Y2038 mailing list
Y2038@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/y2038


[Y2038] [RFC 5/6] vfs: Add timestamp_truncate() api

2016-11-23 Thread Deepa Dinamani
timespec_trunc() function is used to truncate a
filesystem timestamp to the right granularity.
But, the function does not clamp tv_sec part of the
timestamps according to the filesystem timestamp limits.

Also, timespec_trunc() is exclusively used for filesystem
timestamps. Move the api to be part of vfs.

The replacement api: timestamp_truncate() also alters the
signature of the function to accommodate filesystem
timestamp clamping according to flesystem limits.

Note that clamp_t macro is used for clamping here as vfs
is not yet using struct timespec64 internally. This is
only for compilation purposes.
The actual patch can only be merged after the vfs is
transitioned to use timespec64 for correct operation of
clamp macro. At which point, clamp_t() will be replaced
by clamp().

Signed-off-by: Deepa Dinamani 
---
 fs/inode.c | 32 +++-
 1 file changed, 31 insertions(+), 1 deletion(-)

diff --git a/fs/inode.c b/fs/inode.c
index 7b2b78d..f9285f2 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -2106,6 +2106,36 @@ void inode_nohighmem(struct inode *inode)
 EXPORT_SYMBOL(inode_nohighmem);
 
 /**
+ * fs_timespec_trunc - Truncate timespec to a granularity
+ * @t: Timespec
+ * @gran: Granularity in ns.
+ *
+ * Truncate a timespec to a granularity. Always rounds down. gran must
+ * not be 0 nor greater than a second (NSEC_PER_SEC, or 10^9 ns).
+ */
+struct timespec timestamp_truncate(struct timespec t, struct inode *inode)
+{
+   struct super_block *sb = inode->i_sb;
+   unsigned int gran = sb->s_time_gran;
+
+   t.tv_sec = clamp_t(time64_t, t.tv_sec, sb->s_time_min, sb->s_time_max);
+
+   /* Avoid division in the common cases 1 ns and 1 s. */
+   if (gran == 1) {
+   /* nothing */
+   } else if (gran == NSEC_PER_SEC) {
+   t.tv_nsec = 0;
+   } else if (gran > 1 && gran < NSEC_PER_SEC) {
+   t.tv_nsec -= t.tv_nsec % gran;
+   } else {
+   WARN(1, "illegal file time granularity: %u", gran);
+   }
+   return t;
+}
+EXPORT_SYMBOL(timestamp_truncate);
+
+
+/**
  * current_time - Return FS time
  * @inode: inode.
  *
@@ -2124,6 +2154,6 @@ struct timespec current_time(struct inode *inode)
return now;
}
 
-   return timespec_trunc(now, inode->i_sb->s_time_gran);
+   return timestamp_truncate(now, inode);
 }
 EXPORT_SYMBOL(current_time);
-- 
2.7.4

___
Y2038 mailing list
Y2038@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/y2038


[Y2038] [RFC 3/6] afs: Add time limits in the super block

2016-11-23 Thread Deepa Dinamani
Note that all the filesystems that have such simple limits
will be initialized in the same patch.

Signed-off-by: Deepa Dinamani 
Cc: linux-...@lists.infradead.org
---
 fs/afs/super.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/fs/afs/super.c b/fs/afs/super.c
index fbdb022..ab00434 100644
--- a/fs/afs/super.c
+++ b/fs/afs/super.c
@@ -321,6 +321,8 @@ static int afs_fill_super(struct super_block *sb,
sb->s_op= &afs_super_ops;
sb->s_bdi   = &as->volume->bdi;
strlcpy(sb->s_id, as->volume->vlocation->vldb.name, sizeof(sb->s_id));
+   sb->s_time_max = Y2106_EXPIRY_TIMESTAMP;
+   sb->s_time_min = 0;
 
/* allocate the root inode and dentry */
fid.vid = as->volume->vid;
-- 
2.7.4

___
Y2038 mailing list
Y2038@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/y2038


[Y2038] [RFC 4/6] ext4: Initialize timestamps limits

2016-11-23 Thread Deepa Dinamani
ext4 has different overflow limits for max filesystem
timestamps based on the extra bytes available.

Signed-off-by: Deepa Dinamani 
Cc: "Theodore Ts'o" 
Cc: Andreas Dilger 
Cc: linux-e...@vger.kernel.org
---
 fs/ext4/ext4.h  | 4 
 fs/ext4/super.c | 7 ++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index aff204f..e15c081 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -1636,6 +1636,10 @@ static inline void ext4_clear_state_flags(struct 
ext4_inode_info *ei)
 
 #define EXT4_GOOD_OLD_INODE_SIZE 128
 
+#define EXT4_EXTRA_TIMESTAMP_MAX   (((s64)1 << 34) - 1  + S32_MIN)
+#define EXT4_NON_EXTRA_TIMESTAMP_MAX   Y2038_EXPIRY_TIMESTAMP
+#define EXT4_TIMESTAMP_MIN S32_MIN
+
 /*
  * Feature set definitions
  */
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 72b459d..0519c52 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -3672,8 +3672,13 @@ static int ext4_fill_super(struct super_block *sb, void 
*data, int silent)
   sbi->s_inode_size);
goto failed_mount;
}
-   if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE)
+   if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) {
sb->s_time_gran = 1 << (EXT4_EPOCH_BITS - 2);
+   sb->s_time_max = EXT4_EXTRA_TIMESTAMP_MAX;
+   } else
+   sb->s_time_max = EXT4_NON_EXTRA_TIMESTAMP_MAX;
+
+   sb->s_time_min = EXT4_TIMESTAMP_MIN;
}
 
sbi->s_desc_size = le16_to_cpu(es->s_desc_size);
-- 
2.7.4

___
Y2038 mailing list
Y2038@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/y2038


[Y2038] [RFC 2/6] vfs: Add checks for filesystem timestamp limits

2016-11-23 Thread Deepa Dinamani
Allow read only mounts for filesystems that do not
have maximum timestamps beyond the y2038 expiry
timestamp.

Also, allow a sysctl override to all such filesystems
to be mounted with write permissions.

Alternatively, a mount option can be created to allow or
disallow range check based clamps and the least max
timestamp supported.

If we take the sysctl approach, then the plan is to also
add a boot param to support initial override of these
checks without recompilation.

Suggested-by: Arnd Bergmann 
Signed-off-by: Deepa Dinamani 
---
 fs/inode.c  |  5 +
 fs/internal.h   |  2 ++
 fs/namespace.c  | 12 
 fs/super.c  |  7 +++
 include/linux/fs.h  |  1 +
 include/linux/time64.h  |  4 
 include/uapi/linux/fs.h |  6 +-
 kernel/sysctl.c |  7 +++
 8 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/fs/inode.c b/fs/inode.c
index 88110fd..7b2b78d 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -75,6 +75,11 @@ static DEFINE_PER_CPU(unsigned long, nr_unused);
 
 static struct kmem_cache *inode_cachep __read_mostly;
 
+struct vfs_max_timestamp_check timestamp_check = {
+   .timestamp_supported = Y2038_EXPIRY_TIMESTAMP,
+   .check_on = 1,
+};
+
 static long get_nr_inodes(void)
 {
int i;
diff --git a/fs/internal.h b/fs/internal.h
index f4da334..5a144a8 100644
--- a/fs/internal.h
+++ b/fs/internal.h
@@ -67,6 +67,8 @@ extern int finish_automount(struct vfsmount *, struct path *);
 
 extern int sb_prepare_remount_readonly(struct super_block *);
 
+extern bool sb_file_times_updatable(struct super_block *sb);
+
 extern void __init mnt_init(void);
 
 extern int __mnt_want_write(struct vfsmount *);
diff --git a/fs/namespace.c b/fs/namespace.c
index 5ef9618..27eab32 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -543,6 +543,18 @@ static void __mnt_unmake_readonly(struct mount *mnt)
unlock_mount_hash();
 }
 
+bool sb_file_times_updatable(struct super_block *sb)
+{
+
+   if (!timestamp_check.check_on)
+   return true;
+
+   if (sb->s_time_max > timestamp_check.timestamp_supported)
+   return true;
+
+   return false;
+}
+
 int sb_prepare_remount_readonly(struct super_block *sb)
 {
struct mount *mnt;
diff --git a/fs/super.c b/fs/super.c
index 27c973e..d21327f 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -1199,6 +1199,13 @@ mount_fs(struct file_system_type *type, int flags, const 
char *name, void *data)
WARN((sb->s_maxbytes < 0), "%s set sb->s_maxbytes to "
"negative value (%lld)\n", type->name, sb->s_maxbytes);
 
+   if (!(sb->s_flags & MS_RDONLY) && !sb_file_times_updatable(sb)) {
+   WARN(1, "File times cannot be updated on the filesystem.\n");
+   WARN(1, "Retry mounting the filesystem readonly.\n");
+   error = -EROFS;
+   goto out_sb;
+   }
+
up_write(&sb->s_umount);
free_secdata(secdata);
return root;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 8eba822..b80d1e2 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -68,6 +68,7 @@ extern struct inodes_stat_t inodes_stat;
 extern int leases_enable, lease_break_time;
 extern int sysctl_protected_symlinks;
 extern int sysctl_protected_hardlinks;
+extern struct vfs_max_timestamp_check timestamp_check;
 
 struct buffer_head;
 typedef int (get_block_t)(struct inode *inode, sector_t iblock,
diff --git a/include/linux/time64.h b/include/linux/time64.h
index 25433b18..906e0b3 100644
--- a/include/linux/time64.h
+++ b/include/linux/time64.h
@@ -43,6 +43,10 @@ struct itimerspec64 {
 #define KTIME_MAX  ((s64)~((u64)1 << 63))
 #define KTIME_SEC_MAX  (KTIME_MAX / NSEC_PER_SEC)
 
+/* Timestamps on boundary */
+#define Y2038_EXPIRY_TIMESTAMP S32_MAX /* 2147483647 */
+#define Y2106_EXPIRY_TIMESTAMP U32_MAX /* 4294967295 */
+
 #if __BITS_PER_LONG == 64
 
 static inline struct timespec timespec64_to_timespec(const struct timespec64 
ts64)
diff --git a/include/uapi/linux/fs.h b/include/uapi/linux/fs.h
index c1d11df..07d225c 100644
--- a/include/uapi/linux/fs.h
+++ b/include/uapi/linux/fs.h
@@ -91,6 +91,11 @@ struct files_stat_struct {
unsigned long max_files;/* tunable */
 };
 
+struct vfs_max_timestamp_check {
+   time64_t timestamp_supported;
+   int check_on;
+};
+
 struct inodes_stat_t {
long nr_inodes;
long nr_unused;
@@ -100,7 +105,6 @@ struct inodes_stat_t {
 
 #define NR_FILE  8192  /* this can well be larger on a larger system */
 
-
 /*
  * These are the fs-independent mount-flags: up to 32 flags are supported
  */
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
index 1475d25..b6030d5 100644
--- a/kernel/sysctl.c
+++ b/kernel/sysctl.c
@@ -1667,6 +1667,13 @@ static struct ctl_table fs_table[] = {
.proc_handler   = proc_doulongvec_minmax,
},
{
+   .procname   = 

[Y2038] [RFC 1/6] vfs: Add file timestamp range support

2016-11-23 Thread Deepa Dinamani
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 save 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 
---
 fs/libfs.c | 4 
 fs/super.c | 2 ++
 include/linux/fs.h | 3 +++
 include/linux/time64.h | 2 ++
 4 files changed, 11 insertions(+)

diff --git a/fs/libfs.c b/fs/libfs.c
index 48826d4..f03c904 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -256,6 +256,8 @@ struct dentry *mount_pseudo_xattr(struct file_system_type 
*fs_type, char *name,
s->s_op = ops ? ops : &simple_super_operations;
s->s_xattr = xattr;
s->s_time_gran = 1;
+   s->s_time_min = TIME64_MIN;
+   s->s_time_max = TIME64_MAX;
root = new_inode(s);
if (!root)
goto Enomem;
@@ -515,6 +517,8 @@ int simple_fill_super(struct super_block *s, unsigned long 
magic,
s->s_magic = magic;
s->s_op = &simple_super_operations;
s->s_time_gran = 1;
+   s->s_time_min = TIME64_MIN;
+   s->s_time_max = TIME64_MAX;
 
inode = new_inode(s);
if (!inode)
diff --git a/fs/super.c b/fs/super.c
index c183835..27c973e 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -248,6 +248,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 = 10;
+   s->s_time_min = TIME64_MIN;
+   s->s_time_max = TIME64_MAX;
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 03a5a39..8eba822 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1329,6 +1329,9 @@ struct super_block {
/* Granularity of c/m/atime in ns.
   Cannot be worse than a second */
u32s_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

___
Y2038 mailing list
Y2038@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/y2038


[Y2038] [RFC 0/6] vfs: Add timestamp range check support

2016-11-23 Thread Deepa Dinamani
The original thread is at https://lkml.org/lkml/2016/11/2/294

The branch is available at
https://github.com/deepa-hub/vfs.git refs/heads/vfs_timestamp_policy

Changes since v1:
* return EROFS on mount errors
* fix mtime copy/paste error in utimes

Deepa Dinamani (6):
  vfs: Add file timestamp range support
  vfs: Add checks for filesystem timestamp limits
  afs: Add time limits in the super block
  ext4: Initialize timestamps limits
  vfs: Add timestamp_truncate() api
  utimes: Clamp the timestamps before update

 fs/afs/super.c  |  2 ++
 fs/ext4/ext4.h  |  4 
 fs/ext4/super.c |  7 ++-
 fs/inode.c  | 37 -
 fs/internal.h   |  2 ++
 fs/libfs.c  |  4 
 fs/namespace.c  | 12 
 fs/super.c  |  9 +
 fs/utimes.c | 17 +
 include/linux/fs.h  |  4 
 include/linux/time64.h  |  6 ++
 include/uapi/linux/fs.h |  6 +-
 kernel/sysctl.c |  7 +++
 13 files changed, 110 insertions(+), 7 deletions(-)

-- 
2.7.4

___
Y2038 mailing list
Y2038@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/y2038