-Wflex-array-member-not-at-end is coming in GCC-14, and we are getting ready to enable it globally.
There is currently a local structure `template` that is using a flexible `struct fw_iso_packet` as a header for an on-stack array `__be32 header[CIP_HEADER_QUADLETS];`.
struct { struct fw_iso_packet params; __be32 header[CIP_HEADER_QUADLETS]; } template = { {0}, {0} };
However, we are deprecating flexible arrays in the middle of another struct. So, in order to avoid this, we use the `struct_group_tagged()` helper to separate the flexible array from the rest of the members in the flexible structure:
struct fw_iso_packet { struct_group_tagged(fw_iso_packet_hdr, hdr, ... the rest of the members ); u32 header[]; /* tx: Top of 1394 isoch. data_block */ };
With the change described above, we can now declare an object of the type of the tagged struct, without embedding the flexible array in the middle of another struct:
struct { struct fw_iso_packet_hdr params; __be32 header[CIP_HEADER_QUADLETS]; } template = { {0}, {0} };
We also use `container_of()` whenever we need to retrieve a pointer to the flexible structure.
So, with these changes, fix the following warning:
sound/firewire/amdtp-stream.c: In function ‘process_rx_packets’: sound/firewire/amdtp-stream.c:1184:46: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end] 1184 | struct fw_iso_packet params; |
Signed-off-by: Gustavo A. R. Silva gustavoars@kernel.org --- sound/firewire/amdtp-stream.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/sound/firewire/amdtp-stream.c b/sound/firewire/amdtp-stream.c index c9f153f85ae6..7ba1cd64d7f1 100644 --- a/sound/firewire/amdtp-stream.c +++ b/sound/firewire/amdtp-stream.c @@ -1181,12 +1181,14 @@ static void process_rx_packets(struct fw_iso_context *context, u32 tstamp, size_
for (i = 0; i < packets; ++i) { struct { - struct fw_iso_packet params; + struct fw_iso_packet_hdr params; __be32 header[CIP_HEADER_QUADLETS]; } template = { {0}, {0} }; + struct fw_iso_packet *params = + container_of(&template.params, struct fw_iso_packet, hdr); bool sched_irq = false;
- build_it_pkt_header(s, desc->cycle, &template.params, pkt_header_length, + build_it_pkt_header(s, desc->cycle, params, pkt_header_length, desc->data_blocks, desc->data_block_counter, desc->syt, i, curr_cycle_time);
@@ -1198,7 +1200,7 @@ static void process_rx_packets(struct fw_iso_context *context, u32 tstamp, size_ } }
- if (queue_out_packet(s, &template.params, sched_irq) < 0) { + if (queue_out_packet(s, params, sched_irq) < 0) { cancel_stream(s); return; }