]> git.hungrycats.org Git - linux/commitdiff
[PATCH] kNFSd: Use higher-resolution time for the changeinfo, instead of using time...
authorAndrew Morton <akpm@osdl.org>
Thu, 26 Feb 2004 14:46:32 +0000 (06:46 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 26 Feb 2004 14:46:32 +0000 (06:46 -0800)
From: NeilBrown <neilb@cse.unsw.edu.au>

Use higher-resolution time for the changeinfo, instead of using time and
filesize.

fs/nfsd/nfs4xdr.c
include/linux/nfsd/xdr4.h

index ee228a05b7557a56b8b5bde852baf8c4afc80ab5..919141d7cbcf30c44e395d655909888c7b61723c 100644 (file)
@@ -1183,10 +1183,10 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
 } while (0)
 #define WRITECINFO(c)          do {                            \
        *p++ = htonl(c.atomic);                                 \
-       *p++ = htonl(c.before_size);                            \
-       *p++ = htonl(c.before_ctime);                           \
-       *p++ = htonl(c.after_size);                             \
-       *p++ = htonl(c.after_ctime);                            \
+       *p++ = htonl(c.before_ctime_sec);                               \
+       *p++ = htonl(c.before_ctime_nsec);                              \
+       *p++ = htonl(c.after_ctime_sec);                                \
+       *p++ = htonl(c.after_ctime_nsec);                               \
 } while (0)
 
 #define RESERVE_SPACE(nbytes)  do {                            \
@@ -1326,32 +1326,15 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
        }
        if (bmval0 & FATTR4_WORD0_CHANGE) {
                /*
-                * XXX: We currently use the inode ctime as the nfsv4 "changeid"
-                * attribute.  This violates the spec, which says
-                *
-                *    The server may return the object's time_modify attribute
-                *    for this attribute, but only if the file system object
-                *    can not be updated more frequently than the resolution
-                *    of time_modify.
-                *
-                * Since we only have 1-second ctime resolution, this is a pretty
-                * serious violation.  Indeed, 1-second ctime resolution is known
-                * to be a problem in practice in the NFSv3 world.
-                *
-                * The real solution to this problem is probably to work on
-                * adding high-resolution mtimes to the VFS layer.
-                *
-                * Note: Started using i_size for the high 32 bits of the changeid.
-                *
-                * Note 2: This _must_ be consistent with the scheme for writing
+                * Note: This _must_ be consistent with the scheme for writing
                 * change_info, so any changes made here must be reflected there
                 * as well.  (See xdr4.h:set_change_info() and the WRITECINFO()
                 * macro above.)
                 */
                if ((buflen -= 8) < 0)
                        goto out_resource;
-               WRITE32(stat.size);
-               WRITE32(stat.mtime.tv_sec); /* AK: nsec dropped? */
+               WRITE32(stat.ctime.tv_sec);
+               WRITE32(stat.ctime.tv_nsec);
        }
        if (bmval0 & FATTR4_WORD0_SIZE) {
                if ((buflen -= 8) < 0)
index 6aa76d0619e1525221860555024ad0b2d4e36359..4e275cea93b54ae4a192fe329f1add51460b7606 100644 (file)
@@ -54,10 +54,10 @@ typedef struct {
 
 struct nfsd4_change_info {
        u32             atomic;
-       u32             before_size;
-       u32             before_ctime;
-       u32             after_size;
-       u32             after_ctime;
+       u32             before_ctime_sec;
+       u32             before_ctime_nsec;
+       u32             after_ctime_sec;
+       u32             after_ctime_nsec;
 };
 
 struct nfsd4_access {
@@ -406,10 +406,10 @@ set_change_info(struct nfsd4_change_info *cinfo, struct svc_fh *fhp)
 {
        BUG_ON(!fhp->fh_pre_saved || !fhp->fh_post_saved);
        cinfo->atomic = 1;
-       cinfo->before_size = fhp->fh_pre_size;
-       cinfo->before_ctime = fhp->fh_pre_ctime.tv_sec;
-       cinfo->after_size = fhp->fh_post_size;
-       cinfo->after_ctime = fhp->fh_post_ctime.tv_sec;
+       cinfo->before_ctime_sec = fhp->fh_pre_ctime.tv_sec;
+       cinfo->before_ctime_nsec = fhp->fh_pre_ctime.tv_nsec;
+       cinfo->after_ctime_sec = fhp->fh_post_ctime.tv_sec;
+       cinfo->after_ctime_nsec = fhp->fh_post_ctime.tv_nsec;
 }
 
 int nfs4svc_encode_voidres(struct svc_rqst *, u32 *, void *);