|
@@ -427,6 +427,7 @@ int
|
|
zfcp_qdio_reqid_check(struct zfcp_adapter *adapter, void *sbale_addr)
|
|
zfcp_qdio_reqid_check(struct zfcp_adapter *adapter, void *sbale_addr)
|
|
{
|
|
{
|
|
struct zfcp_fsf_req *fsf_req;
|
|
struct zfcp_fsf_req *fsf_req;
|
|
|
|
+ unsigned long flags;
|
|
|
|
|
|
/* invalid (per convention used in this driver) */
|
|
/* invalid (per convention used in this driver) */
|
|
if (unlikely(!sbale_addr)) {
|
|
if (unlikely(!sbale_addr)) {
|
|
@@ -438,15 +439,15 @@ zfcp_qdio_reqid_check(struct zfcp_adapter *adapter, void *sbale_addr)
|
|
fsf_req = (struct zfcp_fsf_req *) sbale_addr;
|
|
fsf_req = (struct zfcp_fsf_req *) sbale_addr;
|
|
|
|
|
|
/* serialize with zfcp_fsf_req_dismiss_all */
|
|
/* serialize with zfcp_fsf_req_dismiss_all */
|
|
- spin_lock(&adapter->fsf_req_list_lock);
|
|
|
|
|
|
+ spin_lock_irqsave(&adapter->fsf_req_list_lock, flags);
|
|
if (list_empty(&adapter->fsf_req_list_head)) {
|
|
if (list_empty(&adapter->fsf_req_list_head)) {
|
|
- spin_unlock(&adapter->fsf_req_list_lock);
|
|
|
|
|
|
+ spin_unlock_irqrestore(&adapter->fsf_req_list_lock, flags);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
list_del(&fsf_req->list);
|
|
list_del(&fsf_req->list);
|
|
atomic_dec(&adapter->fsf_reqs_active);
|
|
atomic_dec(&adapter->fsf_reqs_active);
|
|
- spin_unlock(&adapter->fsf_req_list_lock);
|
|
|
|
-
|
|
|
|
|
|
+ spin_unlock_irqrestore(&adapter->fsf_req_list_lock, flags);
|
|
|
|
+
|
|
if (unlikely(adapter != fsf_req->adapter)) {
|
|
if (unlikely(adapter != fsf_req->adapter)) {
|
|
ZFCP_LOG_NORMAL("bug: invalid reqid (fsf_req=%p, "
|
|
ZFCP_LOG_NORMAL("bug: invalid reqid (fsf_req=%p, "
|
|
"fsf_req->adapter=%p, adapter=%p)\n",
|
|
"fsf_req->adapter=%p, adapter=%p)\n",
|