git: 835b12a5f9c5 - main - mrsas: don't reference the removed physical disk of RAID1 during IO submission
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 12 Mar 2024 10:08:14 UTC
The branch main has been updated by ssaxena:
URL: https://cgit.FreeBSD.org/src/commit/?id=835b12a5f9c5dfaec3bcd9446369fdad995ee538
commit 835b12a5f9c5dfaec3bcd9446369fdad995ee538
Author: Sumit Saxena <ssaxena@FreeBSD.org>
AuthorDate: 2024-03-12 06:51:09 +0000
Commit: Sumit Saxena <ssaxena@FreeBSD.org>
CommitDate: 2024-03-12 09:51:48 +0000
mrsas: don't reference the removed physical disk of RAID1 during IO submission
When a physical disk(PD) [belonging to a RAID1 Virtual disk(VD)] is
removed, driver may still use the reference to the removed PD while submitting
IO to the controller. Controller firmware faults upon receipt of such IO.
This patch fixes this issue by not using any reference to the removed PD.
Reviewed by: imp
Approved by: imp
Sponsored by: Broadcom Inc
Differential Revision: https://reviews.freebsd.org/D44282
---
sys/dev/mrsas/mrsas_fp.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/sys/dev/mrsas/mrsas_fp.c b/sys/dev/mrsas/mrsas_fp.c
index 9fdb24cc0569..c08558e78b46 100644
--- a/sys/dev/mrsas/mrsas_fp.c
+++ b/sys/dev/mrsas/mrsas_fp.c
@@ -964,7 +964,8 @@ mr_spanset_get_phy_params(struct mrsas_softc *sc, u_int32_t ld, u_int64_t stripR
raid->regTypeReqOnRead != REGION_TYPE_UNUSED)))
pRAID_Context->regLockFlags = REGION_TYPE_EXCLUSIVE;
else if (raid->level == 1) {
- pd = MR_ArPdGet(arRef, physArm + 1, map);
+ physArm++;
+ pd = MR_ArPdGet(arRef, physArm, map);
if (pd != MR_PD_INVALID) {
*pDevHandle = MR_PdDevHandleGet(pd, map);
*pPdInterface = MR_PdInterfaceTypeGet(pd, map);
@@ -1711,7 +1712,8 @@ MR_GetPhyParams(struct mrsas_softc *sc, u_int32_t ld,
pRAID_Context->regLockFlags = REGION_TYPE_EXCLUSIVE;
else if (raid->level == 1) {
/* Get Alternate Pd. */
- pd = MR_ArPdGet(arRef, physArm + 1, map);
+ physArm++;
+ pd = MR_ArPdGet(arRef, physArm, map);
if (pd != MR_PD_INVALID) {
/* Get dev handle from Pd. */
*pDevHandle = MR_PdDevHandleGet(pd, map);