|
@@ -770,7 +770,6 @@ static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_adapter *adapter,
|
|
|
static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
|
|
|
{
|
|
|
struct zfcp_adapter *adapter = req->adapter;
|
|
|
- struct zfcp_qdio_queue *req_q = &adapter->req_q;
|
|
|
unsigned long flags;
|
|
|
int idx;
|
|
|
|
|
@@ -780,19 +779,15 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
|
|
|
list_add_tail(&req->list, &adapter->req_list[idx]);
|
|
|
spin_unlock_irqrestore(&adapter->req_list_lock, flags);
|
|
|
|
|
|
- req->qdio_outb_usage = atomic_read(&req_q->count);
|
|
|
+ req->qdio_outb_usage = atomic_read(&adapter->req_q.count);
|
|
|
req->issued = get_clock();
|
|
|
if (zfcp_qdio_send(req)) {
|
|
|
- /* Queues are down..... */
|
|
|
del_timer(&req->timer);
|
|
|
- spin_lock(&adapter->req_list_lock);
|
|
|
- zfcp_reqlist_remove(adapter, req);
|
|
|
- spin_unlock(&adapter->req_list_lock);
|
|
|
- /* undo changes in request queue made for this request */
|
|
|
- atomic_add(req->sbal_number, &req_q->count);
|
|
|
- req_q->first -= req->sbal_number;
|
|
|
- req_q->first += QDIO_MAX_BUFFERS_PER_Q;
|
|
|
- req_q->first %= QDIO_MAX_BUFFERS_PER_Q; /* wrap */
|
|
|
+ spin_lock_irqsave(&adapter->req_list_lock, flags);
|
|
|
+ /* lookup request again, list might have changed */
|
|
|
+ if (zfcp_reqlist_find_safe(adapter, req))
|
|
|
+ zfcp_reqlist_remove(adapter, req);
|
|
|
+ spin_unlock_irqrestore(&adapter->req_list_lock, flags);
|
|
|
zfcp_erp_adapter_reopen(adapter, 0, 116, req);
|
|
|
return -EIO;
|
|
|
}
|