On Tue, May 18, 2021 at 06:36:23PM +0000, Trond Myklebust wrote: > On Tue, 2021-05-18 at 14:21 -0400, bfields@xxxxxxxxxxxx wrote: > > On Tue, May 18, 2021 at 05:53:47PM +0000, Trond Myklebust wrote: > > > On Sat, 2021-05-15 at 08:02 +0100, Christoph Hellwig wrote: > > > > On Fri, May 14, 2021 at 03:46:57PM +0000, Trond Myklebust wrote: > > > > > 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. > > > > > > > > Also I'm not sure why the extra inode reference is needed. What > > > > speaks > > > > against just moving the dput out of the locked section? > > > > > > Isn't the inode reference taken just in order to ensure that the > > > call > > > to iput_final() (and in particular the call to > > > truncate_inode_pages_final()) is performed outside the lock? > > > > > > The dput() is presumably usually not particularly expensive, since > > > the > > > dentry is just a completely ordinary negative dentry at this point. > > > > Right, but why bother with the extra ihold/iput instead of just > > postponing the dput? > > As I said above, the dentry is negative at this point. It doesn't carry > a reference to the inode any more, so that wouldn't defer the inode > truncation. Oh, of course, thanks! --b. > > > > > diff --git a/fs/namei.c b/fs/namei.c > > index 79b0ff9b151e..aeed93c9874c 100644 > > --- a/fs/namei.c > > +++ b/fs/namei.c > > @@ -4084,7 +4084,6 @@ long do_unlinkat(int dfd, struct filename > > *name) > > inode = dentry->d_inode; > > if (d_is_negative(dentry)) > > goto slashes; > > - ihold(inode); > > error = security_path_unlink(&path, dentry); > > if (error) > > goto exit2; > > @@ -4092,11 +4091,10 @@ long do_unlinkat(int dfd, struct filename > > *name) > > error = vfs_unlink(mnt_userns, path.dentry->d_inode, > > dentry, > > &delegated_inode); > > exit2: > > - dput(dentry); > > } > > inode_unlock(path.dentry->d_inode); > > - if (inode) > > - iput(inode); /* truncate the inode here */ > > + if (!IS_ERR(dentry)) > > + dput(dentry); /* truncate the inode here */ > > inode = NULL; > > if (delegated_inode) { > > error = break_deleg_wait(&delegated_inode); > > > > ? > > > > --b. > > -- > Trond Myklebust > Linux NFS client maintainer, Hammerspace > trond.myklebust@xxxxxxxxxxxxxxx > >