From: Wenchao Hao <haowenchao22@gmail.com>
To: "James E . J . Bottomley" <James.Bottomley@HansenPartnership.com>,
"Martin K . Petersen" <martin.petersen@oracle.com>,
linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: Wenchao Hao <haowenchao22@gmail.com>
Subject: [PATCH v5 0/3] SCSI: Fix issues between removing device and error handle
Date: Wed, 5 Jun 2024 17:17:28 +0800 [thread overview]
Message-ID: <20240605091731.3111195-1-haowenchao22@gmail.com> (raw)
2 issues are triggered because devices in removing would be skipped
when calling shost_for_each_device(), these issues are mainly in error
recovery path, which are:
1. statistic info printed at beginning of scsi_error_handler is wrong;
2. device reset is not triggered. drivers like smartpqi only implement
eh_device_reset_handler, if device reset is skipped, the commands
which had been sent to firmware or devices hardware are not cleared.
The error handle would flush all these commands in scsi_unjam_host().
When the commands are finished by hardware, use after free issue is
triggered.
The issue first happened with smartpqi devices, and can be reproduced
with scsi_debug. I did not see any description about SDEV_DEL state
can not perform device, so this is should be addressed.
A new macro shost_for_each_device_include_deleted() is added to address
these issues. The newly added macro would not skip scsi_device which is
in removing when iterate host's scsi_device and is called when statistic
host's error info and trying to reset scsi_device in error recovery path.
V5:
- Rewrite cover letter and add fixes tag to each patch
V4:
- Remove the forth patch which fix IO hang when device removing
becaust the issue is fixed by commit '6df0e077d76bd (scsi: core:
Kick the requeue list after inserting when flushing)'
V3:
- Update patch description
- Update comments of functions added
V2:
- Fix IO hang by run all devices' queue after error handler
- Do not modify shost_for_each_device() directly but add a new
helper to iterate devices but do not skip devices in removing
Wenchao Hao (3):
scsi: core: Add new helper to iterate all devices of host
scsi: scsi_error: Fix wrong statistic when print error info
scsi: scsi_error: Fix device reset is not triggered
drivers/scsi/scsi.c | 46 ++++++++++++++++++++++++++------------
drivers/scsi/scsi_error.c | 4 ++--
include/scsi/scsi_device.h | 25 ++++++++++++++++++---
3 files changed, 56 insertions(+), 19 deletions(-)
--
2.38.1
next reply other threads:[~2024-06-05 9:17 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-05 9:17 Wenchao Hao [this message]
2024-06-05 9:17 ` [PATCH v5 1/3] scsi: core: Add new helper to iterate all devices of host Wenchao Hao
2024-06-12 8:33 ` Hannes Reinecke
2024-06-12 15:06 ` Wenchao Hao
2024-06-13 6:27 ` Hannes Reinecke
2024-06-13 7:10 ` Wenchao Hao
2024-07-12 2:20 ` Wenchao Hao
2024-06-05 9:17 ` [PATCH v5 2/3] scsi: scsi_error: Fix wrong statistic when print error info Wenchao Hao
2024-06-12 8:34 ` Hannes Reinecke
2024-06-12 15:12 ` Wenchao Hao
2024-06-05 9:17 ` [PATCH v5 3/3] scsi: scsi_error: Fix device reset is not triggered Wenchao Hao
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240605091731.3111195-1-haowenchao22@gmail.com \
--to=haowenchao22@gmail.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.