]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: smartpqi: revert propagate-the-multipath-failure-to-SML-quickly
authorGilbert Wu <Gilbert.Wu@microchip.com>
Thu, 11 Jul 2024 19:47:02 +0000 (14:47 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 3 Aug 2024 02:07:18 +0000 (22:07 -0400)
Correct a rare multipath failure issue by reverting commit 94a68c814328
("scsi: smartpqi: Quickly propagate path failures to SCSI midlayer") [1].

Reason for revert: The patch propagated the path failure to SML quickly
when one of the path fails during IO and AIO path gets disabled for a
multipath device.

But it created a new issue: when creating a volume on an encryption-enabled
controller, the firmware reports the AIO path is disabled, which cause the
driver to report a path failure to SML for a multipath device.

There will be a new fix to handle "Illegal request" and "Invalid field in
parameter list" on RAID path when the AIO path is disabled on a multipath
device.

[1] https://lore.kernel.org/all/164375209313.440833.9992416628621839233.stgit@brunhilda.pdev.net/

Fixes: 94a68c814328 ("scsi: smartpqi: Quickly propagate path failures to SCSI midlayer")
Reviewed-by: Scott Benesh <scott.benesh@microchip.com>
Reviewed-by: Scott Teel <scott.teel@microchip.com>
Reviewed-by: Mike McGowen <mike.mcgowen@microchip.com>
Signed-off-by: Gilbert Wu <Gilbert.Wu@microchip.com>
Signed-off-by: Don Brace <don.brace@microchip.com>
Link: https://lore.kernel.org/r/20240711194704.982400-4-don.brace@microchip.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/smartpqi/smartpqi_init.c

index eaebe3cc00aaf7c9b3b4a41ff501c6da2a506eec..d8df7440bbe1243dce88e6189c850794117681a4 100644 (file)
@@ -2365,14 +2365,6 @@ static inline void pqi_mask_device(u8 *scsi3addr)
        scsi3addr[3] |= 0xc0;
 }
 
-static inline bool pqi_is_multipath_device(struct pqi_scsi_dev *device)
-{
-       if (pqi_is_logical_device(device))
-               return false;
-
-       return (device->path_map & (device->path_map - 1)) != 0;
-}
-
 static inline bool pqi_expose_device(struct pqi_scsi_dev *device)
 {
        return !device->is_physical_device || !pqi_skip_device(device->scsi3addr);
@@ -3269,14 +3261,12 @@ static void pqi_process_aio_io_error(struct pqi_io_request *io_request)
        int residual_count;
        int xfer_count;
        bool device_offline;
-       struct pqi_scsi_dev *device;
 
        scmd = io_request->scmd;
        error_info = io_request->error_info;
        host_byte = DID_OK;
        sense_data_length = 0;
        device_offline = false;
-       device = scmd->device->hostdata;
 
        switch (error_info->service_response) {
        case PQI_AIO_SERV_RESPONSE_COMPLETE:
@@ -3301,14 +3291,8 @@ static void pqi_process_aio_io_error(struct pqi_io_request *io_request)
                        break;
                case PQI_AIO_STATUS_AIO_PATH_DISABLED:
                        pqi_aio_path_disabled(io_request);
-                       if (pqi_is_multipath_device(device)) {
-                               pqi_device_remove_start(device);
-                               host_byte = DID_NO_CONNECT;
-                               scsi_status = SAM_STAT_CHECK_CONDITION;
-                       } else {
-                               scsi_status = SAM_STAT_GOOD;
-                               io_request->status = -EAGAIN;
-                       }
+                       scsi_status = SAM_STAT_GOOD;
+                       io_request->status = -EAGAIN;
                        break;
                case PQI_AIO_STATUS_NO_PATH_TO_DEVICE:
                case PQI_AIO_STATUS_INVALID_DEVICE: