nfsd: minor nfsd4_change_attribute cleanup
authorJ. Bruce Fields <bfields@redhat.com>
Mon, 30 Nov 2020 22:46:16 +0000 (17:46 -0500)
committerChuck Lever <chuck.lever@oracle.com>
Wed, 9 Dec 2020 14:39:37 +0000 (09:39 -0500)
Minor cleanup, no change in behavior.

Also pull out a common helper that'll be useful elsewhere.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/nfsd/nfsfh.h
include/linux/iversion.h

index 39d764b..45bd776 100644 (file)
@@ -259,19 +259,16 @@ fh_clear_wcc(struct svc_fh *fhp)
 static inline u64 nfsd4_change_attribute(struct kstat *stat,
                                         struct inode *inode)
 {
-       u64 chattr;
-
        if (IS_I_VERSION(inode)) {
+               u64 chattr;
+
                chattr =  stat->ctime.tv_sec;
                chattr <<= 30;
                chattr += stat->ctime.tv_nsec;
                chattr += inode_query_iversion(inode);
-       } else {
-               chattr = stat->ctime.tv_sec;
-               chattr <<= 32;
-               chattr += stat->ctime.tv_nsec;
-       }
-       return chattr;
+               return chattr;
+       } else
+               return time_to_chattr(&stat->ctime);
 }
 
 extern void fill_pre_wcc(struct svc_fh *fhp);
index 2917ef9..3bfebde 100644 (file)
@@ -328,6 +328,19 @@ inode_query_iversion(struct inode *inode)
        return cur >> I_VERSION_QUERIED_SHIFT;
 }
 
+/*
+ * For filesystems without any sort of change attribute, the best we can
+ * do is fake one up from the ctime:
+ */
+static inline u64 time_to_chattr(struct timespec64 *t)
+{
+       u64 chattr = t->tv_sec;
+
+       chattr <<= 32;
+       chattr += t->tv_nsec;
+       return chattr;
+}
+
 /**
  * inode_eq_iversion_raw - check whether the raw i_version counter has changed
  * @inode: inode to check