mirror of
https://github.com/opnsense/src.git
synced 2026-02-10 06:15:40 -05:00
manifested itself in out of chain frame conditions. When the driver ran out of chain frames, the request in question would get completed early, and go through mpssas_scsiio_complete(). In mpssas_scsiio_complete(), the negation of the CAM status values (CAM_STATUS_MASK | CAM_SIM_QUEUED) was ORed in instead of being ANDed in. This resulted in a bogus CAM CCB status value. This didn't show up in the non-error case, because the status was reset to something valid (e.g. CAM_REQ_CMP) later on in the function. But in the error case, such as when the driver ran out of chain frames, the CAM_REQUEUE_REQ status was ORed in to the bogus status value. This led to the CAM transport layer repeatedly releasing the SIM queue, because it though that the CAM_RELEASE_SIMQ flag had been set. The symptom was messages like this on the console when INVARIANTS were enabled: xpt_release_simq: requested 1 > present 0 xpt_release_simq: requested 1 > present 0 xpt_release_simq: requested 1 > present 0 mps_sas.c: In mpssas_scsiio_complete(), use &= to take status bits out. |= adds them in. In the error case in mpssas_scsiio_complete(), set the status to CAM_REQUEUE_REQ, don't OR it in. MFC after: 3 days Sponsored by: Spectra Logic |
||
|---|---|---|
| .. | ||
| mpi | ||
| mps.c | ||
| mps_config.c | ||
| mps_ioctl.h | ||
| mps_mapping.c | ||
| mps_mapping.h | ||
| mps_pci.c | ||
| mps_sas.c | ||
| mps_sas.h | ||
| mps_sas_lsi.c | ||
| mps_table.c | ||
| mps_table.h | ||
| mps_user.c | ||
| mpsvar.h | ||