Skip to content

Commit 121bec7

Browse files
author
Chandrakanth Patil
committed
scsi: mpi3mr: Fix I/O failures during controller reset
JIRA: https://issues.redhat.com/browse/RHEL-111654 I/Os can race with controller reset and fail. Block requests at the mid layer when reset starts using scsi_host_block(), and resume with scsi_host_unblock() after reset completes. Signed-off-by: Chandrakanth Patil <chandrakanth.patil@broadcom.com> Link: https://lore.kernel.org/r/20250820084138.228471-4-chandrakanth.patil@broadcom.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> (cherry picked from commit b7b2176) Signed-off-by: Chandrakanth Patil <chanpati@redhat.com>
1 parent 58fc3cc commit 121bec7

File tree

2 files changed

+5
-0
lines changed

2 files changed

+5
-0
lines changed

drivers/scsi/mpi3mr/mpi3mr_fw.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5430,6 +5430,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
54305430
mpi3mr_reset_rc_name(reset_reason));
54315431

54325432
mrioc->device_refresh_on = 0;
5433+
scsi_block_requests(mrioc->shost);
54335434
mrioc->reset_in_progress = 1;
54345435
mrioc->stop_bsgs = 1;
54355436
mrioc->prev_reset_result = -1;
@@ -5538,6 +5539,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
55385539
if (!retval) {
55395540
mrioc->diagsave_timeout = 0;
55405541
mrioc->reset_in_progress = 0;
5542+
scsi_unblock_requests(mrioc->shost);
55415543
mrioc->pel_abort_requested = 0;
55425544
if (mrioc->pel_enabled) {
55435545
mrioc->pel_cmds.retry_count = 0;
@@ -5562,6 +5564,7 @@ int mpi3mr_soft_reset_handler(struct mpi3mr_ioc *mrioc,
55625564
mrioc->device_refresh_on = 0;
55635565
mrioc->unrecoverable = 1;
55645566
mrioc->reset_in_progress = 0;
5567+
scsi_unblock_requests(mrioc->shost);
55655568
mrioc->stop_bsgs = 0;
55665569
retval = -1;
55675570
mpi3mr_flush_cmds_for_unrecovered_controller(mrioc);

drivers/scsi/mpi3mr/mpi3mr_os.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2866,12 +2866,14 @@ static void mpi3mr_preparereset_evt_th(struct mpi3mr_ioc *mrioc,
28662866
"prepare for reset event top half with rc=start\n");
28672867
if (mrioc->prepare_for_reset)
28682868
return;
2869+
scsi_block_requests(mrioc->shost);
28692870
mrioc->prepare_for_reset = 1;
28702871
mrioc->prepare_for_reset_timeout_counter = 0;
28712872
} else if (evtdata->reason_code == MPI3_EVENT_PREPARE_RESET_RC_ABORT) {
28722873
dprint_event_th(mrioc,
28732874
"prepare for reset top half with rc=abort\n");
28742875
mrioc->prepare_for_reset = 0;
2876+
scsi_unblock_requests(mrioc->shost);
28752877
mrioc->prepare_for_reset_timeout_counter = 0;
28762878
}
28772879
if ((event_reply->msg_flags & MPI3_EVENT_NOTIFY_MSGFLAGS_ACK_MASK)

0 commit comments

Comments
 (0)