diff options
author | Sreekanth Reddy <Sreekanth.Reddy@lsi.com> | 2013-07-25 01:59:45 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2013-09-03 10:27:52 -0400 |
commit | 1c50e8d26e2c2c810f28730a13d885c64fa2058d (patch) | |
tree | 71abf96357823ee4135e455b79af4607d7e03a5b /drivers/scsi/mpt2sas/mpt2sas_scsih.c | |
parent | d648d5a9a803eb94d6a13beee3e9d40e8f09a9ed (diff) |
[SCSI] mpt2sas: Infinite loop can occur if MPI2_IOCSTATUS_CONFIG_INVALID_PAGE is not returned
Infinite loop can occur if IOCStatus is not equal to
MPI2_IOCSTATUS_CONFIG_INVALID_PAGE value in the while loops in functions
_scsih_search_responding_sas_devices,
_scsih_search_responding_raid_devices and
_scsih_search_responding_expanders
So, Instead of checking for MPI2_IOCSTATUS_CONFIG_INVALID_PAGE value,
in this patch code is modified to check for IOCStatus not equals to
MPI2_IOCSTATUS_SUCCESS to break the while loop.
Signed-off-by: Sreekanth Reddy <Sreekanth.Reddy@lsi.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/mpt2sas/mpt2sas_scsih.c')
-rw-r--r-- | drivers/scsi/mpt2sas/mpt2sas_scsih.c | 16 |
1 files changed, 4 insertions, 12 deletions
diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c index e592b8ee81b7..9854385deadf 100644 --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c | |||
@@ -6753,7 +6753,7 @@ _scsih_search_responding_sas_devices(struct MPT2SAS_ADAPTER *ioc) | |||
6753 | handle))) { | 6753 | handle))) { |
6754 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | 6754 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & |
6755 | MPI2_IOCSTATUS_MASK; | 6755 | MPI2_IOCSTATUS_MASK; |
6756 | if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) | 6756 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) |
6757 | break; | 6757 | break; |
6758 | handle = le16_to_cpu(sas_device_pg0.DevHandle); | 6758 | handle = le16_to_cpu(sas_device_pg0.DevHandle); |
6759 | device_info = le32_to_cpu(sas_device_pg0.DeviceInfo); | 6759 | device_info = le32_to_cpu(sas_device_pg0.DeviceInfo); |
@@ -6862,7 +6862,7 @@ _scsih_search_responding_raid_devices(struct MPT2SAS_ADAPTER *ioc) | |||
6862 | &volume_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE, handle))) { | 6862 | &volume_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE, handle))) { |
6863 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | 6863 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & |
6864 | MPI2_IOCSTATUS_MASK; | 6864 | MPI2_IOCSTATUS_MASK; |
6865 | if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) | 6865 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) |
6866 | break; | 6866 | break; |
6867 | handle = le16_to_cpu(volume_pg1.DevHandle); | 6867 | handle = le16_to_cpu(volume_pg1.DevHandle); |
6868 | 6868 | ||
@@ -6887,7 +6887,7 @@ _scsih_search_responding_raid_devices(struct MPT2SAS_ADAPTER *ioc) | |||
6887 | phys_disk_num))) { | 6887 | phys_disk_num))) { |
6888 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | 6888 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & |
6889 | MPI2_IOCSTATUS_MASK; | 6889 | MPI2_IOCSTATUS_MASK; |
6890 | if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) | 6890 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) |
6891 | break; | 6891 | break; |
6892 | phys_disk_num = pd_pg0.PhysDiskNum; | 6892 | phys_disk_num = pd_pg0.PhysDiskNum; |
6893 | handle = le16_to_cpu(pd_pg0.DevHandle); | 6893 | handle = le16_to_cpu(pd_pg0.DevHandle); |
@@ -6967,7 +6967,7 @@ _scsih_search_responding_expanders(struct MPT2SAS_ADAPTER *ioc) | |||
6967 | 6967 | ||
6968 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | 6968 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & |
6969 | MPI2_IOCSTATUS_MASK; | 6969 | MPI2_IOCSTATUS_MASK; |
6970 | if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) | 6970 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) |
6971 | break; | 6971 | break; |
6972 | 6972 | ||
6973 | handle = le16_to_cpu(expander_pg0.DevHandle); | 6973 | handle = le16_to_cpu(expander_pg0.DevHandle); |
@@ -7109,8 +7109,6 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) | |||
7109 | MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL, handle))) { | 7109 | MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL, handle))) { |
7110 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | 7110 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & |
7111 | MPI2_IOCSTATUS_MASK; | 7111 | MPI2_IOCSTATUS_MASK; |
7112 | if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) | ||
7113 | break; | ||
7114 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { | 7112 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { |
7115 | printk(MPT2SAS_INFO_FMT "\tbreak from expander scan: " | 7113 | printk(MPT2SAS_INFO_FMT "\tbreak from expander scan: " |
7116 | "ioc_status(0x%04x), loginfo(0x%08x)\n", | 7114 | "ioc_status(0x%04x), loginfo(0x%08x)\n", |
@@ -7153,8 +7151,6 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) | |||
7153 | phys_disk_num))) { | 7151 | phys_disk_num))) { |
7154 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | 7152 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & |
7155 | MPI2_IOCSTATUS_MASK; | 7153 | MPI2_IOCSTATUS_MASK; |
7156 | if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) | ||
7157 | break; | ||
7158 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { | 7154 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { |
7159 | printk(MPT2SAS_INFO_FMT "\tbreak from phys disk scan:" | 7155 | printk(MPT2SAS_INFO_FMT "\tbreak from phys disk scan:" |
7160 | "ioc_status(0x%04x), loginfo(0x%08x)\n", | 7156 | "ioc_status(0x%04x), loginfo(0x%08x)\n", |
@@ -7219,8 +7215,6 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) | |||
7219 | &volume_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE, handle))) { | 7215 | &volume_pg1, MPI2_RAID_VOLUME_PGAD_FORM_GET_NEXT_HANDLE, handle))) { |
7220 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | 7216 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & |
7221 | MPI2_IOCSTATUS_MASK; | 7217 | MPI2_IOCSTATUS_MASK; |
7222 | if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) | ||
7223 | break; | ||
7224 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { | 7218 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { |
7225 | printk(MPT2SAS_INFO_FMT "\tbreak from volume scan: " | 7219 | printk(MPT2SAS_INFO_FMT "\tbreak from volume scan: " |
7226 | "ioc_status(0x%04x), loginfo(0x%08x)\n", | 7220 | "ioc_status(0x%04x), loginfo(0x%08x)\n", |
@@ -7278,8 +7272,6 @@ _scsih_scan_for_devices_after_reset(struct MPT2SAS_ADAPTER *ioc) | |||
7278 | handle))) { | 7272 | handle))) { |
7279 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & | 7273 | ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & |
7280 | MPI2_IOCSTATUS_MASK; | 7274 | MPI2_IOCSTATUS_MASK; |
7281 | if (ioc_status == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) | ||
7282 | break; | ||
7283 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { | 7275 | if (ioc_status != MPI2_IOCSTATUS_SUCCESS) { |
7284 | printk(MPT2SAS_INFO_FMT "\tbreak from end device scan:" | 7276 | printk(MPT2SAS_INFO_FMT "\tbreak from end device scan:" |
7285 | " ioc_status(0x%04x), loginfo(0x%08x)\n", | 7277 | " ioc_status(0x%04x), loginfo(0x%08x)\n", |