mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 05:44:11 +00:00
NFSD: NFSv4 CLOSE should release an nfsd_file immediately
The last close of a file should enable other accessors to open and use that file immediately. Leaving the file open in the filecache prevents other users from accessing that file until the filecache garbage-collects the file -- sometimes that takes several seconds. Reported-by: Wang Yugui <wangyugui@e16-tech.com> Link: https://bugzilla.linux-nfs.org/show_bug.cgi?387 Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
b40a283947
commit
5e138c4a75
3 changed files with 21 additions and 2 deletions
|
@ -452,6 +452,24 @@ nfsd_file_put(struct nfsd_file *nf)
|
||||||
nfsd_file_put_noref(nf);
|
nfsd_file_put_noref(nf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nfsd_file_close - Close an nfsd_file
|
||||||
|
* @nf: nfsd_file to close
|
||||||
|
*
|
||||||
|
* If this is the final reference for @nf, free it immediately.
|
||||||
|
* This reflects an on-the-wire CLOSE or DELEGRETURN into the
|
||||||
|
* VFS and exported filesystem.
|
||||||
|
*/
|
||||||
|
void nfsd_file_close(struct nfsd_file *nf)
|
||||||
|
{
|
||||||
|
nfsd_file_put(nf);
|
||||||
|
if (refcount_dec_if_one(&nf->nf_ref)) {
|
||||||
|
nfsd_file_unhash(nf);
|
||||||
|
nfsd_file_lru_remove(nf);
|
||||||
|
nfsd_file_free(nf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct nfsd_file *
|
struct nfsd_file *
|
||||||
nfsd_file_get(struct nfsd_file *nf)
|
nfsd_file_get(struct nfsd_file *nf)
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,6 +52,7 @@ void nfsd_file_cache_shutdown(void);
|
||||||
int nfsd_file_cache_start_net(struct net *net);
|
int nfsd_file_cache_start_net(struct net *net);
|
||||||
void nfsd_file_cache_shutdown_net(struct net *net);
|
void nfsd_file_cache_shutdown_net(struct net *net);
|
||||||
void nfsd_file_put(struct nfsd_file *nf);
|
void nfsd_file_put(struct nfsd_file *nf);
|
||||||
|
void nfsd_file_close(struct nfsd_file *nf);
|
||||||
struct nfsd_file *nfsd_file_get(struct nfsd_file *nf);
|
struct nfsd_file *nfsd_file_get(struct nfsd_file *nf);
|
||||||
void nfsd_file_close_inode_sync(struct inode *inode);
|
void nfsd_file_close_inode_sync(struct inode *inode);
|
||||||
bool nfsd_file_is_cached(struct inode *inode);
|
bool nfsd_file_is_cached(struct inode *inode);
|
||||||
|
|
|
@ -820,9 +820,9 @@ static void __nfs4_file_put_access(struct nfs4_file *fp, int oflag)
|
||||||
swap(f2, fp->fi_fds[O_RDWR]);
|
swap(f2, fp->fi_fds[O_RDWR]);
|
||||||
spin_unlock(&fp->fi_lock);
|
spin_unlock(&fp->fi_lock);
|
||||||
if (f1)
|
if (f1)
|
||||||
nfsd_file_put(f1);
|
nfsd_file_close(f1);
|
||||||
if (f2)
|
if (f2)
|
||||||
nfsd_file_put(f2);
|
nfsd_file_close(f2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue