mirror of
https://github.com/torvalds/linux.git
synced 2026-10-12 13:27:02 +02:00
scsi: qla2xxx: Fix response queue over-consumption in __qla_consume_iocb()
qla24xx_process_response_queue() advances ring_ptr past the head IOCB
before dispatching, so by the time __qla_consume_iocb() runs, ring_ptr
already points at the first continuation IOCB. The function however
looped purex->entry_count times starting at ring_ptr. As entry_count
includes the head, this consumed one entry too many: it stamped
RESPONSE_PROCESSED on the next, unrelated IOCB and advanced the ring
past it, silently dropping a legitimate firmware response. The head
IOCB's signature was also never marked.
Mark the head processed and account for it, then consume only the
entry_count - 1 continuation IOCBs, matching __qla_copy_purex_to_buffer().
Fixes: fac2807946 ("scsi: qla2xxx: edif: Add extraction of auth_els from the wire")
Cc: stable@vger.kernel.org
Reported-by: Sashiko <sashiko-dev@google.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Link: https://patch.msgid.link/20260730155838.2119230-14-njavali@marvell.com
Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
This commit is contained in:
parent
6d90f0feb9
commit
3ba019bdd8
|
|
@ -259,6 +259,17 @@ void __qla_consume_iocb(struct scsi_qla_host *vha,
|
|||
struct purex_entry_24xx *purex = *pkt;
|
||||
|
||||
entry_count_remaining = purex->entry_count;
|
||||
|
||||
/*
|
||||
* The caller already advanced ring_ptr past the head IOCB, so mark
|
||||
* the head processed and account for it here, then consume only the
|
||||
* continuation IOCBs that follow.
|
||||
*/
|
||||
((response_t *)purex)->signature = RESPONSE_PROCESSED;
|
||||
/* flush signature */
|
||||
wmb();
|
||||
--entry_count_remaining;
|
||||
|
||||
while (entry_count_remaining > 0) {
|
||||
new_pkt = rsp_q->ring_ptr;
|
||||
*pkt = new_pkt;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user