On Fri, Aug 28, 2020 at 07:39:32AM -0700, Konstantin Komarov wrote: > +static struct dentry *__ntfs_lookup(struct inode *dir, struct dentry *dentry, > + struct ntfs_fnd *fnd) > +{ > + struct dentry *d; > + struct inode *inode; > + > + inode = dir_search(dir, &dentry->d_name, fnd); > + > + if (!inode) { > + d_add(dentry, NULL); > + d = NULL; > + goto out; > + } > + > + if (IS_ERR(inode)) { > + d = ERR_CAST(inode); > + goto out; > + } > + > + d = d_splice_alias(inode, dentry); > + if (IS_ERR(d)) { > + iput(inode); > + goto out; > + } > + > +out: > + return d; > +} This is bollocks. First and foremost, d_splice_alias() *does* iput() on failure, so you've got double-put there. What's more * d_splice_alias(ERR_PTR(err), dentry) return err * d_splice_alias(NULL, dentry) is equivalent to d_add(dentry, NULL) and returns NULL IOW, all that boilerplate could be replaced with one line: return d_splice_alias(dir_search(dir, &dentry->d_name, fnd), dentry);