]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: mpi3mr: Fix race between config read submit and interrupt completion
authorRanjan Kumar <ranjan.kumar@broadcom.com>
Fri, 27 Jun 2025 19:45:36 +0000 (01:15 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 15 Jul 2025 00:52:45 +0000 (20:52 -0400)
The "is_waiting" flag was updated after calling complete(), which could
lead to a race where the waiting thread wakes up before the flag is
cleared. This may cause a missed wakeup or stale state check.

Reorder the operations to update "is_waiting" before signaling completion
to ensure consistent state.

Fixes: 824a156633df ("scsi: mpi3mr: Base driver code")
Cc: stable@vger.kernel.org
Co-developed-by: Chandrakanth Patil <chandrakanth.patil@broadcom.com>
Signed-off-by: Chandrakanth Patil <chandrakanth.patil@broadcom.com>
Signed-off-by: Ranjan Kumar <ranjan.kumar@broadcom.com>
Link: https://lore.kernel.org/r/20250627194539.48851-2-ranjan.kumar@broadcom.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpi3mr/mpi3mr_fw.c

index 1d7901a8f0e40658b78415704e8c81e28ef6d3df..0186676698d4fb027cc74dd5ea7301d7f383be70 100644 (file)
@@ -428,8 +428,8 @@ static void mpi3mr_process_admin_reply_desc(struct mpi3mr_ioc *mrioc,
                                       MPI3MR_SENSE_BUF_SZ);
                        }
                        if (cmdptr->is_waiting) {
-                               complete(&cmdptr->done);
                                cmdptr->is_waiting = 0;
+                               complete(&cmdptr->done);
                        } else if (cmdptr->callback)
                                cmdptr->callback(mrioc, cmdptr);
                }