[PATCH] scsi: qla2xxx: Rework BUILD_BUG_ON() assertion

From: Finn Thain

Date: Tue Mar 10 2026 - 02:02:35 EST


The LKP bot reported a build failure with CONFIG_COLDFIRE=y together with
CONFIG_SCSI_QLA_FC=y, that is attributable to the BUILD_BUG_ON() in
qlt_queue_unknown_atio().

That function uses kzalloc() to obtain memory for the following struct,
plus some extra bytes at the end.

struct qla_tgt_sess_op {
struct scsi_qla_host *vha;
uint32_t chip_reset;
struct work_struct work;
struct list_head cmd_list;
bool aborted;
struct rsp_que *rsp;

struct atio_from_isp atio;
/* DO NOT ADD ANYTHING ELSE HERE - atio must be last member */
};

The location of the 'atio' member is subsequently used as the destination
for a memcpy() that's expected to fill in the extra bytes beyond the end
of the struct.

That explains the loud warning in the comment above, which ought to be
sufficient to prevent some newly-added member from accidentally getting
clobbered. But, in case that warning was missed somehow, we also have the
failing assertion,

BUILD_BUG_ON(offsetof(struct qla_tgt_sess_op, atio) + sizeof(u->atio) !=
sizeof(*u));

Unfortunately, this size assertion doesn't guarantee that 'atio' is the
last member. Indeed, adding a zero-length array member at the end does
not increase the struct size.

Moreover, the assertion can fail even when 'atio' really is the last
member, and that's what happened with commit e428b013d9df ("atomic:
specify alignment for atomic_t and atomic64_t"), which added 2 bytes of
harmless padding to the end of the struct.

To resolve those issues, place a flex array at the end of struct
qla_tgt_sess_op (as any member after the flex array would result in a
compiler error) and then use the BUILD_BUG_ON to ensure that the 'atio'
member ends at the offset of the flex array (as compilers aren't expected
to place any padding between the two members that would mess up this
calculation).

Cc: Tony Battersby <tonyb@xxxxxxxxxxxxxxx>
Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
Cc: Arnd Bergmann <arnd@xxxxxxxx>
Cc: Geert Uytterhoeven <geert@xxxxxxxxxxxxxx>
Cc: linux-m68k@xxxxxxxxxxxxxxxxxxxx
Reported-by: kernel test robot <lkp@xxxxxxxxx>
Closes: https://lore.kernel.org/oe-kbuild-all/202603030747.VX0v4otS-lkp@xxxxxxxxx/
Fixes: 091719c21d5a ("scsi: qla2xxx: target: Fix invalid memory access with big CDBs")
Fixes: e428b013d9df ("atomic: specify alignment for atomic_t and atomic64_t").
Suggested-by: Tony Battersby <tonyb@xxxxxxxxxxxxxxx>
Signed-off-by: Finn Thain <fthain@xxxxxxxxxxxxxx>
---
This patch is submitted as a possible alternative to "[PATCH] scsi: qla2xxx:
Remove problematic BUILD_BUG_ON() assertion", dated 2026-03-06.
Either one would do the job. Compile-tested only.
---
drivers/scsi/qla2xxx/qla_target.c | 5 +++--
drivers/scsi/qla2xxx/qla_target.h | 9 +++++++--
2 files changed, 10 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
index d772136984c9..eb1de988f69c 100644
--- a/drivers/scsi/qla2xxx/qla_target.c
+++ b/drivers/scsi/qla2xxx/qla_target.c
@@ -212,8 +212,9 @@ static void qlt_queue_unknown_atio(scsi_qla_host_t *vha,
unsigned long flags;
unsigned int add_cdb_len = 0;

- /* atio must be the last member of qla_tgt_sess_op for add_cdb_len */
- BUILD_BUG_ON(offsetof(struct qla_tgt_sess_op, atio) + sizeof(u->atio) != sizeof(*u));
+ /* atio_u_isp24_fcp_cmnd_add_cdb follows immediately after atio */
+ BUILD_BUG_ON(offsetof(struct qla_tgt_sess_op, atio) + sizeof(struct atio_from_isp) !=
+ offsetof(struct qla_tgt_sess_op, atio_u_isp24_fcp_cmnd_add_cdb));

if (tgt->tgt_stop) {
ql_dbg(ql_dbg_async, vha, 0x502c,
diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h
index 61072fb41b29..11a406ee2187 100644
--- a/drivers/scsi/qla2xxx/qla_target.h
+++ b/drivers/scsi/qla2xxx/qla_target.h
@@ -309,7 +309,8 @@ struct atio7_fcp_cmnd {
/*
* add_cdb is optional and can absent from struct atio7_fcp_cmnd. Size 4
* only to make sizeof(struct atio7_fcp_cmnd) be as expected by
- * BUILD_BUG_ON in qlt_init().
+ * BUILD_BUG_ON in tcm_qla2xxx_init(). See also, BUILD_BUG_ON in
+ * qlt_queue_unknown_atio().
*/
uint8_t add_cdb[4];
/* __le32 data_length; */
@@ -845,7 +846,11 @@ struct qla_tgt_sess_op {
struct rsp_que *rsp;

struct atio_from_isp atio;
- /* DO NOT ADD ANYTHING ELSE HERE - atio must be last member */
+ /*
+ * DO NOT ADD ANYTHING ELSE HERE.
+ * atio.u.isp24.fcp_cmnd.add_cdb may extend past end of atio.
+ */
+ uint8_t atio_u_isp24_fcp_cmnd_add_cdb[];
};

enum trace_flags {
--
2.49.1