mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-30 06:26:48 +07:00
[SCSI] zfcp: Fix request list handling in error path
Fix the handling of the request list in the error path: - Use irqsave for the lock as in the good path. - Before removing the request, check if it is still in the list, a call to dismiss_all might have changed the list in between. - zfcp_qdio_send does not change the queue counters on failure, trying revert something is wrong, so remove this. Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: Swen Schillig <swen@vnet.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
88f2a97787
commit
3765138ae9
@ -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);
|
||||
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(&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_unlock_irqrestore(&adapter->req_list_lock, flags);
|
||||
zfcp_erp_adapter_reopen(adapter, 0, 116, req);
|
||||
return -EIO;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user