From 6c1f87dcee514bdbc52e73a0e668d206020f8e8f Mon Sep 17 00:00:00 2001 From: Andrew Morton Date: Thu, 26 Feb 2004 06:46:32 -0800 Subject: [PATCH] [PATCH] kNFSd: Use higher-resolution time for the changeinfo, instead of using time and filesize. From: NeilBrown Use higher-resolution time for the changeinfo, instead of using time and filesize. --- fs/nfsd/nfs4xdr.c | 31 +++++++------------------------ include/linux/nfsd/xdr4.h | 16 ++++++++-------- 2 files changed, 15 insertions(+), 32 deletions(-) diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index ee228a05b7557..919141d7cbcf3 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -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) diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h index 6aa76d0619e15..4e275cea93b54 100644 --- a/include/linux/nfsd/xdr4.h +++ b/include/linux/nfsd/xdr4.h @@ -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 *); -- 2.53.0