> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c > index 46d2762f5993..9ba67089bf9d 100644 > --- a/tools/lib/bpf/libbpf.c > +++ b/tools/lib/bpf/libbpf.c [ ... ] > @@ -13503,7 +13510,9 @@ struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map) > return &link->link; > } > > - fd = bpf_link_create(map->fd, 0, BPF_STRUCT_OPS, NULL); > + link_opts.flags = OPTS_GET(opts, flags, 0); > + target_fd = OPTS_GET(opts, target_fd, 0); > + fd = bpf_link_create(map->fd, target_fd, BPF_STRUCT_OPS, &link_opts); The code reads flags and target_fd from opts, but the expected_revision field declared in struct bpf_struct_ops_opts is never read. Looking at similar opts structures (bpf_cgroup_opts, bpf_tcx_opts, bpf_netkit_opts), they all pass expected_revision to bpf_link_create_opts. For example: link_create_opts.cgroup.expected_revision = OPTS_GET(opts, expected_revision, 0); However, bpf_link_create_opts has no struct_ops sub-struct to receive expected_revision, and the kernel's bpf_attr link_create union has no struct_ops.expected_revision field either. Is expected_revision in bpf_struct_ops_opts intentionally unused? If so, should the field be removed from the struct to avoid user confusion? If users set expected_revision expecting it to be honored, the value is silently ignored. [ ... ] > diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h > index dfc37a615578..2c28cf80e7fe 100644 > --- a/tools/lib/bpf/libbpf.h > +++ b/tools/lib/bpf/libbpf.h > @@ -920,6 +920,20 @@ bpf_program__attach_cgroup_opts(const struct bpf_program *prog, int cgroup_fd, > struct bpf_map; > > LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map); > + > +struct bpf_struct_ops_opts { > + /* size of this struct, for forward/backward compatibility */ > + size_t sz; > + __u32 flags; > + __u32 target_fd; > + __u64 expected_revision; ^^^^^^^^^^^^^^^^^ The expected_revision field is declared here, matching the pattern used in bpf_cgroup_opts, bpf_tcx_opts, and bpf_netkit_opts. However, unlike those structures where expected_revision is read and passed through, this field has no corresponding code path in bpf_map__attach_struct_ops_opts(). > + size_t :0; > +}; > +#define bpf_struct_ops_opts__last_field expected_revision [ ... ] --- AI reviewed your patch. Please fix the bug or email reply why it's not a bug. See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md CI run summary: https://github.com/kernel-patches/bpf/actions/runs/21382620878 AI-authorship-score: low AI-authorship-explanation: The commit follows kernel conventions and existing code patterns, with an oversight (unused expected_revision field) more typical of human development than AI-generated code. issues-found: 1 issue-severity-score: low issue-severity-explanation: The expected_revision field in bpf_struct_ops_opts is declared but never used, causing silent data loss if users set this field expecting it to be honored.