Commit 6c1f87dc authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] kNFSd: Use higher-resolution time for the changeinfo, instead of using time and filesize.

From: NeilBrown <neilb@cse.unsw.edu.au>

Use higher-resolution time for the changeinfo, instead of using time and
filesize.
parent 06f78b95
...@@ -1183,10 +1183,10 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp) ...@@ -1183,10 +1183,10 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
} while (0) } while (0)
#define WRITECINFO(c) do { \ #define WRITECINFO(c) do { \
*p++ = htonl(c.atomic); \ *p++ = htonl(c.atomic); \
*p++ = htonl(c.before_size); \ *p++ = htonl(c.before_ctime_sec); \
*p++ = htonl(c.before_ctime); \ *p++ = htonl(c.before_ctime_nsec); \
*p++ = htonl(c.after_size); \ *p++ = htonl(c.after_ctime_sec); \
*p++ = htonl(c.after_ctime); \ *p++ = htonl(c.after_ctime_nsec); \
} while (0) } while (0)
#define RESERVE_SPACE(nbytes) do { \ #define RESERVE_SPACE(nbytes) do { \
...@@ -1326,32 +1326,15 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp, ...@@ -1326,32 +1326,15 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
} }
if (bmval0 & FATTR4_WORD0_CHANGE) { if (bmval0 & FATTR4_WORD0_CHANGE) {
/* /*
* XXX: We currently use the inode ctime as the nfsv4 "changeid" * Note: This _must_ be consistent with the scheme for writing
* 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
* change_info, so any changes made here must be reflected there * change_info, so any changes made here must be reflected there
* as well. (See xdr4.h:set_change_info() and the WRITECINFO() * as well. (See xdr4.h:set_change_info() and the WRITECINFO()
* macro above.) * macro above.)
*/ */
if ((buflen -= 8) < 0) if ((buflen -= 8) < 0)
goto out_resource; goto out_resource;
WRITE32(stat.size); WRITE32(stat.ctime.tv_sec);
WRITE32(stat.mtime.tv_sec); /* AK: nsec dropped? */ WRITE32(stat.ctime.tv_nsec);
} }
if (bmval0 & FATTR4_WORD0_SIZE) { if (bmval0 & FATTR4_WORD0_SIZE) {
if ((buflen -= 8) < 0) if ((buflen -= 8) < 0)
......
...@@ -54,10 +54,10 @@ typedef struct { ...@@ -54,10 +54,10 @@ typedef struct {
struct nfsd4_change_info { struct nfsd4_change_info {
u32 atomic; u32 atomic;
u32 before_size; u32 before_ctime_sec;
u32 before_ctime; u32 before_ctime_nsec;
u32 after_size; u32 after_ctime_sec;
u32 after_ctime; u32 after_ctime_nsec;
}; };
struct nfsd4_access { struct nfsd4_access {
...@@ -406,10 +406,10 @@ set_change_info(struct nfsd4_change_info *cinfo, struct svc_fh *fhp) ...@@ -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); BUG_ON(!fhp->fh_pre_saved || !fhp->fh_post_saved);
cinfo->atomic = 1; cinfo->atomic = 1;
cinfo->before_size = fhp->fh_pre_size; cinfo->before_ctime_sec = fhp->fh_pre_ctime.tv_sec;
cinfo->before_ctime = fhp->fh_pre_ctime.tv_sec; cinfo->before_ctime_nsec = fhp->fh_pre_ctime.tv_nsec;
cinfo->after_size = fhp->fh_post_size; cinfo->after_ctime_sec = fhp->fh_post_ctime.tv_sec;
cinfo->after_ctime = 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 *); int nfs4svc_encode_voidres(struct svc_rqst *, u32 *, void *);
......
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