Commit 00c94ebe authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Don't invalidate inode attributes on delegation return



There is no need to declare attributes such as the ctime, mtime and
block size invalid when we're just returning a delegation, so it is
inappropriate to call nfs_post_op_update_inode_force_wcc().
Instead, just call nfs_refresh_inode() after faking up the change
attribute. We know that the GETATTR op occurs before the DELEGRETURN, so
we are safe when doing this.

Fixes: 0bc2c9b4 ("NFSv4: Don't discard the attributes returned by asynchronous DELEGRETURN")
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent e13433b4
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -363,6 +363,14 @@ static void nfs4_setup_readdir(u64 cookie, __be32 *verifier, struct dentry *dent
	kunmap_atomic(start);
}

static void nfs4_fattr_set_prechange(struct nfs_fattr *fattr, u64 version)
{
	if (!(fattr->valid & NFS_ATTR_FATTR_PRECHANGE)) {
		fattr->pre_change_attr = version;
		fattr->valid |= NFS_ATTR_FATTR_PRECHANGE;
	}
}

static void nfs4_test_and_free_stateid(struct nfs_server *server,
		nfs4_stateid *stateid,
		const struct cred *cred)
@@ -6553,7 +6561,9 @@ static void nfs4_delegreturn_release(void *calldata)
		pnfs_roc_release(&data->lr.arg, &data->lr.res,
				 data->res.lr_ret);
	if (inode) {
		nfs_post_op_update_inode_force_wcc(inode, &data->fattr);
		nfs4_fattr_set_prechange(&data->fattr,
					 inode_peek_iversion_raw(inode));
		nfs_refresh_inode(inode, &data->fattr);
		nfs_iput_and_deactive(inode);
	}
	kfree(calldata);