On Fri, 2021-05-14 at 11:58 +0800, Nick Huang wrote: > From: Yu Hsiang Huang <nickhuang@xxxxxxxxxxxx> > > Truncation of an unlinked inode may take a long time for I/O waiting, > and > it doesn't have to prevent access to the directory. Thus, let > truncation > occur outside the directory's mutex, just like do_unlinkat() does. > > Signed-off-by: Yu Hsiang Huang <nickhuang@xxxxxxxxxxxx> > Signed-off-by: Bing Jing Chang <bingjingc@xxxxxxxxxxxx> > Signed-off-by: Robbie Ko <robbieko@xxxxxxxxxxxx> > --- > fs/nfsd/vfs.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c > index 15adf1f6ab21..39948f130712 100644 > --- a/fs/nfsd/vfs.c > +++ b/fs/nfsd/vfs.c > @@ -1859,6 +1859,7 @@ nfsd_unlink(struct svc_rqst *rqstp, struct > svc_fh *fhp, int type, > { > struct dentry *dentry, *rdentry; > struct inode *dirp; > + struct inode *rinode; > __be32 err; > int host_err; > > @@ -1887,6 +1888,8 @@ nfsd_unlink(struct svc_rqst *rqstp, struct > svc_fh *fhp, int type, > host_err = -ENOENT; > goto out_drop_write; > } > + rinode = d_inode(rdentry); > + ihold(rinode); > > if (!type) > type = d_inode(rdentry)->i_mode & S_IFMT; > @@ -1902,6 +1905,8 @@ nfsd_unlink(struct svc_rqst *rqstp, struct > svc_fh *fhp, int type, > if (!host_err) > host_err = commit_metadata(fhp); Why leave the commit_metadata() call under the lock? If you're concerned about latency, then it makes more sense to call fh_unlock() before flushing those metadata updates to disk. This is, BTW, an optimisation that appears to be possible in several other cases in fs/nfsd/vfs.c. > dput(rdentry); > + fh_unlock(fhp); > + iput(rinode); /* truncate the inode here */ > > out_drop_write: > fh_drop_write(fhp); -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx