|
@@ -174,9 +174,6 @@ static __be32 *
|
|
|
encode_fattr3(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
|
|
|
struct kstat *stat)
|
|
|
{
|
|
|
- struct dentry *dentry = fhp->fh_dentry;
|
|
|
- struct timespec time;
|
|
|
-
|
|
|
*p++ = htonl(nfs3_ftypes[(stat->mode & S_IFMT) >> 12]);
|
|
|
*p++ = htonl((u32) stat->mode);
|
|
|
*p++ = htonl((u32) stat->nlink);
|
|
@@ -191,10 +188,9 @@ encode_fattr3(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
|
|
|
*p++ = htonl((u32) MAJOR(stat->rdev));
|
|
|
*p++ = htonl((u32) MINOR(stat->rdev));
|
|
|
p = encode_fsid(p, fhp);
|
|
|
- p = xdr_encode_hyper(p, (u64) stat->ino);
|
|
|
+ p = xdr_encode_hyper(p, stat->ino);
|
|
|
p = encode_time3(p, &stat->atime);
|
|
|
- lease_get_mtime(dentry->d_inode, &time);
|
|
|
- p = encode_time3(p, &time);
|
|
|
+ p = encode_time3(p, &stat->mtime);
|
|
|
p = encode_time3(p, &stat->ctime);
|
|
|
|
|
|
return p;
|
|
@@ -203,31 +199,9 @@ encode_fattr3(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
|
|
|
static __be32 *
|
|
|
encode_saved_post_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
|
|
|
{
|
|
|
- struct inode *inode = fhp->fh_dentry->d_inode;
|
|
|
-
|
|
|
/* Attributes to follow */
|
|
|
*p++ = xdr_one;
|
|
|
-
|
|
|
- *p++ = htonl(nfs3_ftypes[(fhp->fh_post_mode & S_IFMT) >> 12]);
|
|
|
- *p++ = htonl((u32) fhp->fh_post_mode);
|
|
|
- *p++ = htonl((u32) fhp->fh_post_nlink);
|
|
|
- *p++ = htonl((u32) nfsd_ruid(rqstp, fhp->fh_post_uid));
|
|
|
- *p++ = htonl((u32) nfsd_rgid(rqstp, fhp->fh_post_gid));
|
|
|
- if (S_ISLNK(fhp->fh_post_mode) && fhp->fh_post_size > NFS3_MAXPATHLEN) {
|
|
|
- p = xdr_encode_hyper(p, (u64) NFS3_MAXPATHLEN);
|
|
|
- } else {
|
|
|
- p = xdr_encode_hyper(p, (u64) fhp->fh_post_size);
|
|
|
- }
|
|
|
- p = xdr_encode_hyper(p, ((u64)fhp->fh_post_blocks) << 9);
|
|
|
- *p++ = fhp->fh_post_rdev[0];
|
|
|
- *p++ = fhp->fh_post_rdev[1];
|
|
|
- p = encode_fsid(p, fhp);
|
|
|
- p = xdr_encode_hyper(p, (u64) inode->i_ino);
|
|
|
- p = encode_time3(p, &fhp->fh_post_atime);
|
|
|
- p = encode_time3(p, &fhp->fh_post_mtime);
|
|
|
- p = encode_time3(p, &fhp->fh_post_ctime);
|
|
|
-
|
|
|
- return p;
|
|
|
+ return encode_fattr3(rqstp, p, fhp, &fhp->fh_post_attr);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -246,6 +220,7 @@ encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
|
|
|
err = vfs_getattr(fhp->fh_export->ex_mnt, dentry, &stat);
|
|
|
if (!err) {
|
|
|
*p++ = xdr_one; /* attributes follow */
|
|
|
+ lease_get_mtime(dentry->d_inode, &stat.mtime);
|
|
|
return encode_fattr3(rqstp, p, fhp, &stat);
|
|
|
}
|
|
|
}
|
|
@@ -284,6 +259,23 @@ encode_wcc_data(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
|
|
|
return encode_post_op_attr(rqstp, p, fhp);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Fill in the post_op attr for the wcc data
|
|
|
+ */
|
|
|
+void fill_post_wcc(struct svc_fh *fhp)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+
|
|
|
+ if (fhp->fh_post_saved)
|
|
|
+ printk("nfsd: inode locked twice during operation.\n");
|
|
|
+
|
|
|
+ err = vfs_getattr(fhp->fh_export->ex_mnt, fhp->fh_dentry,
|
|
|
+ &fhp->fh_post_attr);
|
|
|
+ if (err)
|
|
|
+ fhp->fh_post_saved = 0;
|
|
|
+ else
|
|
|
+ fhp->fh_post_saved = 1;
|
|
|
+}
|
|
|
|
|
|
/*
|
|
|
* XDR decode functions
|
|
@@ -643,8 +635,11 @@ int
|
|
|
nfs3svc_encode_attrstat(struct svc_rqst *rqstp, __be32 *p,
|
|
|
struct nfsd3_attrstat *resp)
|
|
|
{
|
|
|
- if (resp->status == 0)
|
|
|
+ if (resp->status == 0) {
|
|
|
+ lease_get_mtime(resp->fh.fh_dentry->d_inode,
|
|
|
+ &resp->stat.mtime);
|
|
|
p = encode_fattr3(rqstp, p, &resp->fh, &resp->stat);
|
|
|
+ }
|
|
|
return xdr_ressize_check(rqstp, p);
|
|
|
}
|
|
|
|
|
@@ -802,7 +797,7 @@ nfs3svc_encode_readdirres(struct svc_rqst *rqstp, __be32 *p,
|
|
|
|
|
|
static __be32 *
|
|
|
encode_entry_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name,
|
|
|
- int namlen, ino_t ino)
|
|
|
+ int namlen, u64 ino)
|
|
|
{
|
|
|
*p++ = xdr_one; /* mark entry present */
|
|
|
p = xdr_encode_hyper(p, ino); /* file id */
|
|
@@ -873,7 +868,7 @@ compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp,
|
|
|
#define NFS3_ENTRYPLUS_BAGGAGE (1 + 21 + 1 + (NFS3_FHSIZE >> 2))
|
|
|
static int
|
|
|
encode_entry(struct readdir_cd *ccd, const char *name, int namlen,
|
|
|
- loff_t offset, ino_t ino, unsigned int d_type, int plus)
|
|
|
+ loff_t offset, u64 ino, unsigned int d_type, int plus)
|
|
|
{
|
|
|
struct nfsd3_readdirres *cd = container_of(ccd, struct nfsd3_readdirres,
|
|
|
common);
|