On Fri, Feb 07, 2025 at 02:36:48PM +1100, NeilBrown wrote:
> @@ -1690,6 +1692,15 @@ struct dentry *lookup_one_qstr_excl(const struct qstr 
> *name,
>               dput(dentry);
>               dentry = old;
>       }
> +found:

... and if ->lookup() returns an error, this will blow up (as bot has just
reported).

> +     if (d_is_negative(dentry) && !(flags & LOOKUP_CREATE)) {
> +             dput(dentry);
> +             return ERR_PTR(-ENOENT);
> +     }
> +     if (d_is_positive(dentry) && (flags & LOOKUP_EXCL)) {
> +             dput(dentry);
> +             return ERR_PTR(-EEXIST);
> +     }


> @@ -4077,27 +4084,13 @@ static struct dentry *filename_create(int dfd, struct 
> filename *name,
>        * '/', and a directory wasn't requested.
>        */
>       if (last.name[last.len] && !want_dir)
> -             create_flags = 0;
> +             create_flags &= ~LOOKUP_CREATE;

See the patch I've posted in earlier thread; the entire "strip LOOKUP_CREATE"
thing is wrong.

Reply via email to