diff options
Diffstat (limited to 'drivers/s390/scsi/zfcp_qdio.c')
-rw-r--r-- | drivers/s390/scsi/zfcp_qdio.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index b9fffc8d94a..50b5615848f 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
@@ -102,18 +102,22 @@ static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err, | |||
102 | { | 102 | { |
103 | struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; | 103 | struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; |
104 | struct zfcp_adapter *adapter = qdio->adapter; | 104 | struct zfcp_adapter *adapter = qdio->adapter; |
105 | struct qdio_buffer_element *sbale; | ||
106 | int sbal_no, sbal_idx; | 105 | int sbal_no, sbal_idx; |
107 | void *pl[ZFCP_QDIO_MAX_SBALS_PER_REQ + 1]; | ||
108 | u64 req_id; | ||
109 | u8 scount; | ||
110 | 106 | ||
111 | if (unlikely(qdio_err)) { | 107 | if (unlikely(qdio_err)) { |
112 | memset(pl, 0, ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *)); | ||
113 | if (zfcp_adapter_multi_buffer_active(adapter)) { | 108 | if (zfcp_adapter_multi_buffer_active(adapter)) { |
109 | void *pl[ZFCP_QDIO_MAX_SBALS_PER_REQ + 1]; | ||
110 | struct qdio_buffer_element *sbale; | ||
111 | u64 req_id; | ||
112 | u8 scount; | ||
113 | |||
114 | memset(pl, 0, | ||
115 | ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *)); | ||
114 | sbale = qdio->res_q[idx]->element; | 116 | sbale = qdio->res_q[idx]->element; |
115 | req_id = (u64) sbale->addr; | 117 | req_id = (u64) sbale->addr; |
116 | scount = sbale->scount + 1; /* incl. signaling SBAL */ | 118 | scount = min(sbale->scount + 1, |
119 | ZFCP_QDIO_MAX_SBALS_PER_REQ + 1); | ||
120 | /* incl. signaling SBAL */ | ||
117 | 121 | ||
118 | for (sbal_no = 0; sbal_no < scount; sbal_no++) { | 122 | for (sbal_no = 0; sbal_no < scount; sbal_no++) { |
119 | sbal_idx = (idx + sbal_no) % | 123 | sbal_idx = (idx + sbal_no) % |