Re: [cocci] Checking evaluation of another SmPL script

Julia Lawall <[email protected]> Mon, 25 May 2026 10:54:47 +0200 (CEST)
Newsgroups fr.inria.cocci
Message-ID <[email protected]>

On Mon, 25 May 2026, Markus Elfring wrote:

> >> We are trying to clarify different expectations for SmPL data processing
> >> with goto statements.
> > Please actually clarify your expectations. …
> Would you find the following test result “reasonable”?
>
> https://elixir.bootlin.com/linux/v7.1-rc4/source/fs/nfs/pnfs.c#L2128-L2385
>
> Markus_Elfring@Sonne:…/Projekte/Linux/next-analyses> time /usr/bin/spatch --show-ctl-text --no-gotos …/Projekte/Coccinelle/janitor/show_UAF_1.cocci fs/nfs/pnfs.c
> …
> @display@
> identifier i;
> expression e;
> @@
>
> *pnfs_put_layout_hdr*(*i*)*;
> ...   WHEN != i = e
>
> *trace_pnfs_update_layout*(*...*, *i*, *...*)
>
>
> CTL =
>
> (!EX(EX(EX(Exit))) &,
>  (Ex_ i .
>   ((Ex _v . pnfs_put_layout_hdr(i);) &,
>    EX(E[(!After &
>          (!(pnfs_put_layout_hdr(i); v
>             InnerAnd(trace_pnfs_update_layout(..., i, ...)))
>           & !(After v InnerAnd((Ex_ e . i = e)))))
>       U InnerAnd((Ex _v . trace_pnfs_update_layout(..., i, ...)))]))))
>
> diff =
> …
> @@ -2216,7 +2216,6 @@ lookup_again:
>                                            TASK_KILLABLE));
>                 if (IS_ERR(lseg))
>                         goto out_put_layout_hdr;
> -               pnfs_put_layout_hdr(lo);
>                 goto lookup_again;
>         }
>
> @@ -2229,22 +2228,14 @@ lookup_again:
>                 dprintk("%s wait for layoutreturn\n", __func__);
>                 lseg = ERR_PTR(pnfs_prepare_to_retry_layoutget(lo));
>                 if (!IS_ERR(lseg)) {
> -                       pnfs_put_layout_hdr(lo);
>                         dprintk("%s retrying\n", __func__);
> -                       trace_pnfs_update_layout(ino, pos, count, iomode, lo,
> -                                                lseg,
> -                                                PNFS_UPDATE_LAYOUT_RETRY);
>                         goto lookup_again;
>                 }
> -               trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
> -                                        PNFS_UPDATE_LAYOUT_RETURN);

When you use * there s no way to go what matches with what.  But this line
looks questionable because there isn't an obvious path from the
pnfs_put_layout_hdr above to the trace_pnfs_update_layout here.  You get
this because of the no-gotos flag not taking the goto lookup_again;

julia


>                 goto out_put_layout_hdr;
>         }
>
>         lseg = pnfs_find_lseg(lo, &arg, strict_iomode);
>         if (lseg) {
> -               trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
> -                               PNFS_UPDATE_LAYOUT_FOUND_CACHED);
>                 goto out_unlock;
>         }
>
> @@ -2268,7 +2259,6 @@ lookup_again:
>                                                 TASK_KILLABLE));
>                         if (IS_ERR(lseg))
>                                 goto out_put_layout_hdr;
> -                       pnfs_put_layout_hdr(lo);
>                         dprintk("%s retrying\n", __func__);
>                         goto lookup_again;
>                 }
> @@ -2280,12 +2270,8 @@ lookup_again:
>                                         NULL, &stateid, NULL);
>                 if (status != 0) {
>                         lseg = ERR_PTR(status);
> -                       trace_pnfs_update_layout(ino, pos, count,
> -                                       iomode, lo, lseg,
> -                                       PNFS_UPDATE_LAYOUT_INVALID_OPEN);
>                         nfs4_schedule_stateid_recovery(server, ctx->state);
>                         pnfs_clear_first_layoutget(lo);
> -                       pnfs_put_layout_hdr(lo);
>                         goto lookup_again;
>                 }
>                 spin_lock(&ino->i_lock);
> @@ -2294,8 +2280,6 @@ lookup_again:
>         }
>
>         if (pnfs_layoutgets_blocked(lo)) {
> -               trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
> -                               PNFS_UPDATE_LAYOUT_BLOCKED);
>                 goto out_unlock;
>         }
>         nfs_layoutget_begin(lo);
> @@ -2314,8 +2298,6 @@ lookup_again:
>         lgp = pnfs_alloc_init_layoutget_args(ino, ctx, &stateid, &arg, gfp_flags);
>         if (!lgp) {
>                 lseg = ERR_PTR(-ENOMEM);
> -               trace_pnfs_update_layout(ino, pos, count, iomode, lo, NULL,
> -                                        PNFS_UPDATE_LAYOUT_NOMEM);
>                 nfs_layoutget_end(lo);
>                 goto out_put_layout_hdr;
>         }
> @@ -2324,8 +2306,6 @@ lookup_again:
>         pnfs_get_layout_hdr(lo);
>
>         lseg = nfs4_proc_layoutget(lgp, &exception);
> -       trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
> -                                PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET);
>         nfs_layoutget_end(lo);
>         if (IS_ERR(lseg)) {
>                 switch(PTR_ERR(lseg)) {
> @@ -2356,7 +2336,6 @@ lookup_again:
>                                 pnfs_clear_first_layoutget(lo);
>                         trace_pnfs_update_layout(ino, pos, count,
>                                 iomode, lo, lseg, PNFS_UPDATE_LAYOUT_RETRY);
> -                       pnfs_put_layout_hdr(lo);
>                         goto lookup_again;
>                 }
>         } else {
> @@ -2366,8 +2345,6 @@ lookup_again:
>  out_put_layout_hdr:
>         if (first)
>                 pnfs_clear_first_layoutget(lo);
> -       trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
> -                                PNFS_UPDATE_LAYOUT_EXIT);
>         pnfs_put_layout_hdr(lo);
>  out:
>         dprintk("%s: inode %s/%llu pNFS layout segment %s for "
>
> real    0m1,038s
> user    0m0,997s
> sys     0m0,036s
>
>
>
> Are such technical details still questionable?
>
> Regards,
> Markus
>