Commit dd8dd403 authored by NeilBrown's avatar NeilBrown Committed by Chuck Lever
Browse files

NFSD: discard fh_locked flag and fh_lock/fh_unlock



As all inode locking is now fully balanced, fh_put() does not need to
call fh_unlock().
fh_lock() and fh_unlock() are no longer used, so discard them.
These are the only real users of ->fh_locked, so discard that too.

Reviewed-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent bb4d53d6
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -549,7 +549,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry,
	if (ref_fh == fhp)
	if (ref_fh == fhp)
		fh_put(ref_fh);
		fh_put(ref_fh);


	if (fhp->fh_locked || fhp->fh_dentry) {
	if (fhp->fh_dentry) {
		printk(KERN_ERR "fh_compose: fh %pd2 not initialized!\n",
		printk(KERN_ERR "fh_compose: fh %pd2 not initialized!\n",
		       dentry);
		       dentry);
	}
	}
@@ -700,7 +700,6 @@ fh_put(struct svc_fh *fhp)
	struct dentry * dentry = fhp->fh_dentry;
	struct dentry * dentry = fhp->fh_dentry;
	struct svc_export * exp = fhp->fh_export;
	struct svc_export * exp = fhp->fh_export;
	if (dentry) {
	if (dentry) {
		fh_unlock(fhp);
		fhp->fh_dentry = NULL;
		fhp->fh_dentry = NULL;
		dput(dentry);
		dput(dentry);
		fh_clear_pre_post_attrs(fhp);
		fh_clear_pre_post_attrs(fhp);
+4 −52
Original line number Original line Diff line number Diff line
@@ -81,7 +81,6 @@ typedef struct svc_fh {
	struct dentry *		fh_dentry;	/* validated dentry */
	struct dentry *		fh_dentry;	/* validated dentry */
	struct svc_export *	fh_export;	/* export pointer */
	struct svc_export *	fh_export;	/* export pointer */


	bool			fh_locked;	/* inode locked by us */
	bool			fh_want_write;	/* remount protection taken */
	bool			fh_want_write;	/* remount protection taken */
	bool			fh_no_wcc;	/* no wcc data needed */
	bool			fh_no_wcc;	/* no wcc data needed */
	bool			fh_no_atomic_attr;
	bool			fh_no_atomic_attr;
@@ -93,7 +92,7 @@ typedef struct svc_fh {
	bool			fh_post_saved;	/* post-op attrs saved */
	bool			fh_post_saved;	/* post-op attrs saved */
	bool			fh_pre_saved;	/* pre-op attrs saved */
	bool			fh_pre_saved;	/* pre-op attrs saved */


	/* Pre-op attributes saved during fh_lock */
	/* Pre-op attributes saved when inode is locked */
	__u64			fh_pre_size;	/* size before operation */
	__u64			fh_pre_size;	/* size before operation */
	struct timespec64	fh_pre_mtime;	/* mtime before oper */
	struct timespec64	fh_pre_mtime;	/* mtime before oper */
	struct timespec64	fh_pre_ctime;	/* ctime before oper */
	struct timespec64	fh_pre_ctime;	/* ctime before oper */
@@ -103,7 +102,7 @@ typedef struct svc_fh {
	 */
	 */
	u64			fh_pre_change;
	u64			fh_pre_change;


	/* Post-op attributes saved in fh_unlock */
	/* Post-op attributes saved in fh_fill_post_attrs() */
	struct kstat		fh_post_attr;	/* full attrs after operation */
	struct kstat		fh_post_attr;	/* full attrs after operation */
	u64			fh_post_change; /* nfsv4 change; see above */
	u64			fh_post_change; /* nfsv4 change; see above */
} svc_fh;
} svc_fh;
@@ -223,7 +222,7 @@ void fh_put(struct svc_fh *);
static __inline__ struct svc_fh *
static __inline__ struct svc_fh *
fh_copy(struct svc_fh *dst, struct svc_fh *src)
fh_copy(struct svc_fh *dst, struct svc_fh *src)
{
{
	WARN_ON(src->fh_dentry || src->fh_locked);
	WARN_ON(src->fh_dentry);


	*dst = *src;
	*dst = *src;
	return dst;
	return dst;
@@ -323,51 +322,4 @@ static inline u64 nfsd4_change_attribute(struct kstat *stat,
extern void fh_fill_pre_attrs(struct svc_fh *fhp);
extern void fh_fill_pre_attrs(struct svc_fh *fhp);
extern void fh_fill_post_attrs(struct svc_fh *fhp);
extern void fh_fill_post_attrs(struct svc_fh *fhp);
extern void fh_fill_both_attrs(struct svc_fh *fhp);
extern void fh_fill_both_attrs(struct svc_fh *fhp);

/*
 * Lock a file handle/inode
 * NOTE: both fh_lock and fh_unlock are done "by hand" in
 * vfs.c:nfsd_rename as it needs to grab 2 i_mutex's at once
 * so, any changes here should be reflected there.
 */

static inline void
fh_lock_nested(struct svc_fh *fhp, unsigned int subclass)
{
	struct dentry	*dentry = fhp->fh_dentry;
	struct inode	*inode;

	BUG_ON(!dentry);

	if (fhp->fh_locked) {
		printk(KERN_WARNING "fh_lock: %pd2 already locked!\n",
			dentry);
		return;
	}

	inode = d_inode(dentry);
	inode_lock_nested(inode, subclass);
	fh_fill_pre_attrs(fhp);
	fhp->fh_locked = true;
}

static inline void
fh_lock(struct svc_fh *fhp)
{
	fh_lock_nested(fhp, I_MUTEX_NORMAL);
}

/*
 * Unlock a file handle/inode
 */
static inline void
fh_unlock(struct svc_fh *fhp)
{
	if (fhp->fh_locked) {
		fh_fill_post_attrs(fhp);
		inode_unlock(d_inode(fhp->fh_dentry));
		fhp->fh_locked = false;
	}
}

#endif /* _LINUX_NFSD_NFSFH_H */
#endif /* _LINUX_NFSD_NFSFH_H */
+1 −16
Original line number Original line Diff line number Diff line
@@ -1265,13 +1265,6 @@ nfsd_create_locked(struct svc_rqst *rqstp, struct svc_fh *fhp,
	dirp = d_inode(dentry);
	dirp = d_inode(dentry);


	dchild = dget(resfhp->fh_dentry);
	dchild = dget(resfhp->fh_dentry);
	if (!fhp->fh_locked) {
		WARN_ONCE(1, "nfsd_create: parent %pd2 not locked!\n",
				dentry);
		err = nfserr_io;
		goto out;
	}

	err = nfsd_permission(rqstp, fhp->fh_export, dentry, NFSD_MAY_CREATE);
	err = nfsd_permission(rqstp, fhp->fh_export, dentry, NFSD_MAY_CREATE);
	if (err)
	if (err)
		goto out;
		goto out;
@@ -1634,10 +1627,7 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
		goto out;
		goto out;
	}
	}


	/* cannot use fh_lock as we need deadlock protective ordering
	 * so do it by hand */
	trap = lock_rename(tdentry, fdentry);
	trap = lock_rename(tdentry, fdentry);
	ffhp->fh_locked = tfhp->fh_locked = true;
	fh_fill_pre_attrs(ffhp);
	fh_fill_pre_attrs(ffhp);
	fh_fill_pre_attrs(tfhp);
	fh_fill_pre_attrs(tfhp);


@@ -1693,17 +1683,12 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,
	dput(odentry);
	dput(odentry);
 out_nfserr:
 out_nfserr:
	err = nfserrno(host_err);
	err = nfserrno(host_err);
	/*

	 * We cannot rely on fh_unlock on the two filehandles,
	 * as that would do the wrong thing if the two directories
	 * were the same, so again we do it by hand.
	 */
	if (!close_cached) {
	if (!close_cached) {
		fh_fill_post_attrs(ffhp);
		fh_fill_post_attrs(ffhp);
		fh_fill_post_attrs(tfhp);
		fh_fill_post_attrs(tfhp);
	}
	}
	unlock_rename(tdentry, fdentry);
	unlock_rename(tdentry, fdentry);
	ffhp->fh_locked = tfhp->fh_locked = false;
	fh_drop_write(ffhp);
	fh_drop_write(ffhp);


	/*
	/*