Commit 1fcb79c1 authored by Deepa Dinamani's avatar Deepa Dinamani

fs: nfs: Initialize filesystem timestamp ranges

Fill in the appropriate limits to avoid inconsistencies
in the vfs cached inode times when timestamps are
outside the permitted range.

The time formats for various verious is detailed in the
RFCs as below:

https://tools.ietf.org/html/rfc7862(time metadata)
https://tools.ietf.org/html/rfc7530:

nfstime4

   struct nfstime4 {
           int64_t         seconds;
           uint32_t        nseconds;
   };

https://tools.ietf.org/html/rfc1094

          struct timeval {
              unsigned int seconds;
              unsigned int useconds;
          };

https://tools.ietf.org/html/rfc1813

struct nfstime3 {
         uint32   seconds;
         uint32   nseconds;
      };

Use the limits as per the RFC.
Signed-off-by: default avatarDeepa Dinamani <deepa.kernel@gmail.com>
Acked-by: default avatarJeff Layton <jlayton@kernel.org>
Cc: trond.myklebust@hammerspace.com
Cc: anna.schumaker@netapp.com
Cc: linux-nfs@vger.kernel.org
parent 4881c497
...@@ -2382,6 +2382,15 @@ void nfs_fill_super(struct super_block *sb, struct nfs_mount_info *mount_info) ...@@ -2382,6 +2382,15 @@ void nfs_fill_super(struct super_block *sb, struct nfs_mount_info *mount_info)
sb->s_flags |= SB_POSIXACL; sb->s_flags |= SB_POSIXACL;
sb->s_time_gran = 1; sb->s_time_gran = 1;
sb->s_export_op = &nfs_export_ops; sb->s_export_op = &nfs_export_ops;
} else
sb->s_time_gran = 1000;
if (server->nfs_client->rpc_ops->version != 4) {
sb->s_time_min = 0;
sb->s_time_max = U32_MAX;
} else {
sb->s_time_min = S64_MIN;
sb->s_time_max = S64_MAX;
} }
nfs_initialise_sb(sb); nfs_initialise_sb(sb);
...@@ -2402,7 +2411,6 @@ static void nfs_clone_super(struct super_block *sb, ...@@ -2402,7 +2411,6 @@ static void nfs_clone_super(struct super_block *sb,
sb->s_maxbytes = old_sb->s_maxbytes; sb->s_maxbytes = old_sb->s_maxbytes;
sb->s_xattr = old_sb->s_xattr; sb->s_xattr = old_sb->s_xattr;
sb->s_op = old_sb->s_op; sb->s_op = old_sb->s_op;
sb->s_time_gran = 1;
sb->s_export_op = old_sb->s_export_op; sb->s_export_op = old_sb->s_export_op;
if (server->nfs_client->rpc_ops->version != 2) { if (server->nfs_client->rpc_ops->version != 2) {
...@@ -2410,6 +2418,16 @@ static void nfs_clone_super(struct super_block *sb, ...@@ -2410,6 +2418,16 @@ static void nfs_clone_super(struct super_block *sb,
* so ourselves when necessary. * so ourselves when necessary.
*/ */
sb->s_flags |= SB_POSIXACL; sb->s_flags |= SB_POSIXACL;
sb->s_time_gran = 1;
} else
sb->s_time_gran = 1000;
if (server->nfs_client->rpc_ops->version != 4) {
sb->s_time_min = 0;
sb->s_time_max = U32_MAX;
} else {
sb->s_time_min = S64_MIN;
sb->s_time_max = S64_MAX;
} }
nfs_initialise_sb(sb); nfs_initialise_sb(sb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment