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: Jeff Layton <jlayton@kernel.org> Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
bb4d53d66e
commit
dd8dd403d7
@ -549,7 +549,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry,
|
||||
if (ref_fh == fhp)
|
||||
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",
|
||||
dentry);
|
||||
}
|
||||
@ -700,7 +700,6 @@ fh_put(struct svc_fh *fhp)
|
||||
struct dentry * dentry = fhp->fh_dentry;
|
||||
struct svc_export * exp = fhp->fh_export;
|
||||
if (dentry) {
|
||||
fh_unlock(fhp);
|
||||
fhp->fh_dentry = NULL;
|
||||
dput(dentry);
|
||||
fh_clear_pre_post_attrs(fhp);
|
||||
|
@ -81,7 +81,6 @@ typedef struct svc_fh {
|
||||
struct dentry * fh_dentry; /* validated dentry */
|
||||
struct svc_export * fh_export; /* export pointer */
|
||||
|
||||
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;
|
||||
@ -93,7 +92,7 @@ typedef struct svc_fh {
|
||||
bool fh_post_saved; /* post-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 */
|
||||
struct timespec64 fh_pre_mtime; /* mtime before oper */
|
||||
struct timespec64 fh_pre_ctime; /* ctime before oper */
|
||||
@ -103,7 +102,7 @@ typedef struct svc_fh {
|
||||
*/
|
||||
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 */
|
||||
u64 fh_post_change; /* nfsv4 change; see above */
|
||||
} svc_fh;
|
||||
@ -223,7 +222,7 @@ void fh_put(struct svc_fh *);
|
||||
static __inline__ struct svc_fh *
|
||||
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;
|
||||
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_post_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 */
|
||||
|
@ -1265,13 +1265,6 @@ nfsd_create_locked(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
dirp = d_inode(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);
|
||||
if (err)
|
||||
goto out;
|
||||
@ -1634,10 +1627,7 @@ retry:
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* cannot use fh_lock as we need deadlock protective ordering
|
||||
* so do it by hand */
|
||||
trap = lock_rename(tdentry, fdentry);
|
||||
ffhp->fh_locked = tfhp->fh_locked = true;
|
||||
fh_fill_pre_attrs(ffhp);
|
||||
fh_fill_pre_attrs(tfhp);
|
||||
|
||||
@ -1693,17 +1683,12 @@ retry:
|
||||
dput(odentry);
|
||||
out_nfserr:
|
||||
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) {
|
||||
fh_fill_post_attrs(ffhp);
|
||||
fh_fill_post_attrs(tfhp);
|
||||
}
|
||||
unlock_rename(tdentry, fdentry);
|
||||
ffhp->fh_locked = tfhp->fh_locked = false;
|
||||
fh_drop_write(ffhp);
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user