Commit 716a8bc7 authored by Trond Myklebust's avatar Trond Myklebust Committed by Chuck Lever
Browse files

nfsd: Record NFSv4 pre/post-op attributes as non-atomic



For the case of NFSv4, specify to the client that the pre/post-op
attributes were not recorded atomically with the main operation.

Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 01cbf385
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -172,5 +172,6 @@ const struct export_operations nfs_export_ops = {
	.fh_to_dentry = nfs_fh_to_dentry,
	.get_parent = nfs_get_parent,
	.flags = EXPORT_OP_NOWCC|EXPORT_OP_NOSUBTREECHK|
		EXPORT_OP_CLOSE_BEFORE_UNLINK|EXPORT_OP_REMOTE_FS,
		EXPORT_OP_CLOSE_BEFORE_UNLINK|EXPORT_OP_REMOTE_FS|
		EXPORT_OP_NOATOMIC_ATTR,
};
+4 −0
Original line number Diff line number Diff line
@@ -301,6 +301,10 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp)
	fhp->fh_export = exp;

	switch (rqstp->rq_vers) {
	case 4:
		if (dentry->d_sb->s_export_op->flags & EXPORT_OP_NOATOMIC_ATTR)
			fhp->fh_no_atomic_attr = true;
		break;
	case 3:
		if (dentry->d_sb->s_export_op->flags & EXPORT_OP_NOWCC)
			fhp->fh_no_wcc = true;
+5 −0
Original line number Diff line number Diff line
@@ -36,6 +36,11 @@ typedef struct svc_fh {
	bool			fh_locked;	/* inode locked by us */
	bool			fh_want_write;	/* remount protection taken */
	bool			fh_no_wcc;	/* no wcc data needed */
	bool			fh_no_atomic_attr;
						/*
						 * wcc data is not atomic with
						 * operation
						 */
	int			fh_flags;	/* FH flags */
#ifdef CONFIG_NFSD_V3
	bool			fh_post_saved;	/* post-op attrs saved */
+1 −1
Original line number Diff line number Diff line
@@ -748,7 +748,7 @@ static inline void
set_change_info(struct nfsd4_change_info *cinfo, struct svc_fh *fhp)
{
	BUG_ON(!fhp->fh_pre_saved);
	cinfo->atomic = (u32)fhp->fh_post_saved;
	cinfo->atomic = (u32)(fhp->fh_post_saved && !fhp->fh_no_atomic_attr);

	cinfo->before_change = fhp->fh_pre_change;
	cinfo->after_change = fhp->fh_post_change;
+3 −0
Original line number Diff line number Diff line
@@ -217,6 +217,9 @@ struct export_operations {
#define	EXPORT_OP_NOSUBTREECHK		(0x2) /* no subtree checking */
#define	EXPORT_OP_CLOSE_BEFORE_UNLINK	(0x4) /* close files before unlink */
#define EXPORT_OP_REMOTE_FS		(0x8) /* Filesystem is remote */
#define EXPORT_OP_NOATOMIC_ATTR		(0x10) /* Filesystem cannot supply
						  atomic attribute updates
						*/
	unsigned long	flags;
};