Thanks for the cleanup. This runs through xfstests with no regressions on 4.17-rc7. Please add: Tested-by: Mike Marshall <hubcap@xxxxxxxxxxxx> -Mike On Fri, May 25, 2018 at 7:54 PM, Al Viro <viro@xxxxxxxxxxxxxxxxxx> wrote: > From: Al Viro <viro@xxxxxxxxxxxxxxxxxx> > > d_splice_alias() can handle NULL and ERR_PTR() for inode just fine... > > Signed-off-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> > --- > fs/orangefs/namei.c | 64 +++++++---------------------------------------------- > 1 file changed, 8 insertions(+), 56 deletions(-) > > diff --git a/fs/orangefs/namei.c b/fs/orangefs/namei.c > index 1b5707c44c3f..365cd73d9109 100644 > --- a/fs/orangefs/namei.c > +++ b/fs/orangefs/namei.c > @@ -110,7 +110,6 @@ static struct dentry *orangefs_lookup(struct inode *dir, struct dentry *dentry, > struct orangefs_inode_s *parent = ORANGEFS_I(dir); > struct orangefs_kernel_op_s *new_op; > struct inode *inode; > - struct dentry *res; > int ret = -EINVAL; > > /* > @@ -158,65 +157,18 @@ static struct dentry *orangefs_lookup(struct inode *dir, struct dentry *dentry, > new_op->downcall.resp.lookup.refn.fs_id, > ret); > > - if (ret < 0) { > - if (ret == -ENOENT) { > - /* > - * if no inode was found, add a negative dentry to > - * dcache anyway; if we don't, we don't hold expected > - * lookup semantics and we most noticeably break > - * during directory renames. > - * > - * however, if the operation failed or exited, do not > - * add the dentry (e.g. in the case that a touch is > - * issued on a file that already exists that was > - * interrupted during this lookup -- no need to add > - * another negative dentry for an existing file) > - */ > - > - gossip_debug(GOSSIP_NAME_DEBUG, > - "orangefs_lookup: Adding *negative* dentry " > - "%p for %pd\n", > - dentry, > - dentry); > - > - d_add(dentry, NULL); > - res = NULL; > - goto out; > - } > - > + if (ret >= 0) { > + orangefs_set_timeout(dentry); > + inode = orangefs_iget(dir->i_sb, &new_op->downcall.resp.lookup.refn); > + } else if (ret == -ENOENT) { > + inode = NULL; > + } else { > /* must be a non-recoverable error */ > - res = ERR_PTR(ret); > - goto out; > - } > - > - orangefs_set_timeout(dentry); > - > - inode = orangefs_iget(dir->i_sb, &new_op->downcall.resp.lookup.refn); > - if (IS_ERR(inode)) { > - gossip_debug(GOSSIP_NAME_DEBUG, > - "error %ld from iget\n", PTR_ERR(inode)); > - res = ERR_CAST(inode); > - goto out; > + inode = ERR_PTR(ret); > } > > - gossip_debug(GOSSIP_NAME_DEBUG, > - "%s:%s:%d " > - "Found good inode [%lu] with count [%d]\n", > - __FILE__, > - __func__, > - __LINE__, > - inode->i_ino, > - (int)atomic_read(&inode->i_count)); > - > - /* update dentry/inode pair into dcache */ > - res = d_splice_alias(inode, dentry); > - > - gossip_debug(GOSSIP_NAME_DEBUG, > - "Lookup success (inode ct = %d)\n", > - (int)atomic_read(&inode->i_count)); > -out: > op_release(new_op); > - return res; > + return d_splice_alias(inode, dentry); > } > > /* return 0 on success; non-zero otherwise */ > -- > 2.11.0 >