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);

Reply via email to