scsi: sd: Remove the stream_status member from scsi_stream_status_header
authorChristoph Hellwig <hch@lst.de>
Mon, 5 May 2025 06:06:37 +0000 (08:06 +0200)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 13 May 2025 02:16:10 +0000 (22:16 -0400)
Having a variable length array at the end of scsi_stream_status_header
only causes problems.  Remove it and switch sd_is_perm_stream(), which is
the only place that currently uses it, to use the scsi_stream_status
directly following it in the local buf structure.

Besides being a much better data structure design, this also avoids a
-Wflex-array-member-not-at-end warning.

Reported-by: Gustavo A. R. Silva <gustavoars@kernel.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20250505060640.3398500-1-hch@lst.de
Reviewed-by: John Garry <john.g.garry@oracle.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/sd.c
include/scsi/scsi_proto.h

index 950d8c9fb88437e3be05b797d53c672a9f3edaa2..3f6e87705b62e59a5bf599d414f9ae7b3a61c3cb 100644 (file)
@@ -3215,7 +3215,7 @@ static bool sd_is_perm_stream(struct scsi_disk *sdkp, unsigned int stream_id)
                return false;
        if (get_unaligned_be32(&buf.h.len) < sizeof(struct scsi_stream_status))
                return false;
-       return buf.h.stream_status[0].perm;
+       return buf.s.perm;
 }
 
 static void sd_read_io_hints(struct scsi_disk *sdkp, unsigned char *buffer)
index aeca37816506dd187360f5d43cd60bb489e9321e..f64385cde5b93163efbd2e06f13a24dee786b8ef 100644 (file)
@@ -346,10 +346,9 @@ static_assert(sizeof(struct scsi_stream_status) == 8);
 
 /* GET STREAM STATUS parameter data */
 struct scsi_stream_status_header {
-       __be32 len;     /* length in bytes of stream_status[] array. */
+       __be32 len;     /* length in bytes of following payload */
        u16 reserved;
        __be16 number_of_open_streams;
-       DECLARE_FLEX_ARRAY(struct scsi_stream_status, stream_status);
 };
 
 static_assert(sizeof(struct scsi_stream_status_header) == 8);