diff options
Diffstat (limited to 'drivers/s390/scsi/zfcp_fsf.c')
-rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 32 |
1 files changed, 7 insertions, 25 deletions
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index fd2371b6948..36a6f4a7b8d 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include "zfcp_ext.h" | 14 | #include "zfcp_ext.h" |
15 | #include "zfcp_fc.h" | 15 | #include "zfcp_fc.h" |
16 | #include "zfcp_dbf.h" | 16 | #include "zfcp_dbf.h" |
17 | #include "zfcp_reqlist.h" | ||
17 | 18 | ||
18 | static void zfcp_fsf_request_timeout_handler(unsigned long data) | 19 | static void zfcp_fsf_request_timeout_handler(unsigned long data) |
19 | { | 20 | { |
@@ -457,15 +458,10 @@ static void zfcp_fsf_req_complete(struct zfcp_fsf_req *req) | |||
457 | void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) | 458 | void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) |
458 | { | 459 | { |
459 | struct zfcp_fsf_req *req, *tmp; | 460 | struct zfcp_fsf_req *req, *tmp; |
460 | unsigned long flags; | ||
461 | LIST_HEAD(remove_queue); | 461 | LIST_HEAD(remove_queue); |
462 | unsigned int i; | ||
463 | 462 | ||
464 | BUG_ON(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP); | 463 | BUG_ON(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP); |
465 | spin_lock_irqsave(&adapter->req_list_lock, flags); | 464 | zfcp_reqlist_move(adapter->req_list, &remove_queue); |
466 | for (i = 0; i < REQUEST_LIST_SIZE; i++) | ||
467 | list_splice_init(&adapter->req_list[i], &remove_queue); | ||
468 | spin_unlock_irqrestore(&adapter->req_list_lock, flags); | ||
469 | 465 | ||
470 | list_for_each_entry_safe(req, tmp, &remove_queue, list) { | 466 | list_for_each_entry_safe(req, tmp, &remove_queue, list) { |
471 | list_del(&req->list); | 467 | list_del(&req->list); |
@@ -770,27 +766,17 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req) | |||
770 | { | 766 | { |
771 | struct zfcp_adapter *adapter = req->adapter; | 767 | struct zfcp_adapter *adapter = req->adapter; |
772 | struct zfcp_qdio *qdio = adapter->qdio; | 768 | struct zfcp_qdio *qdio = adapter->qdio; |
773 | unsigned long flags; | 769 | int with_qtcb = (req->qtcb != NULL); |
774 | int idx; | ||
775 | int with_qtcb = (req->qtcb != NULL); | ||
776 | int req_id = req->req_id; | 770 | int req_id = req->req_id; |
777 | 771 | ||
778 | /* put allocated FSF request into hash table */ | 772 | zfcp_reqlist_add(adapter->req_list, req); |
779 | spin_lock_irqsave(&adapter->req_list_lock, flags); | ||
780 | idx = zfcp_reqlist_hash(req_id); | ||
781 | list_add_tail(&req->list, &adapter->req_list[idx]); | ||
782 | spin_unlock_irqrestore(&adapter->req_list_lock, flags); | ||
783 | 773 | ||
784 | req->queue_req.qdio_outb_usage = atomic_read(&qdio->req_q.count); | 774 | req->queue_req.qdio_outb_usage = atomic_read(&qdio->req_q.count); |
785 | req->issued = get_clock(); | 775 | req->issued = get_clock(); |
786 | if (zfcp_qdio_send(qdio, &req->queue_req)) { | 776 | if (zfcp_qdio_send(qdio, &req->queue_req)) { |
787 | del_timer(&req->timer); | 777 | del_timer(&req->timer); |
788 | spin_lock_irqsave(&adapter->req_list_lock, flags); | ||
789 | /* lookup request again, list might have changed */ | 778 | /* lookup request again, list might have changed */ |
790 | req = zfcp_reqlist_find(adapter, req_id); | 779 | zfcp_reqlist_find_rm(adapter->req_list, req_id); |
791 | if (req) | ||
792 | zfcp_reqlist_remove(adapter, req); | ||
793 | spin_unlock_irqrestore(&adapter->req_list_lock, flags); | ||
794 | zfcp_erp_adapter_reopen(adapter, 0, "fsrs__1", req); | 780 | zfcp_erp_adapter_reopen(adapter, 0, "fsrs__1", req); |
795 | return -EIO; | 781 | return -EIO; |
796 | } | 782 | } |
@@ -2518,15 +2504,14 @@ void zfcp_fsf_reqid_check(struct zfcp_qdio *qdio, int sbal_idx) | |||
2518 | struct qdio_buffer *sbal = qdio->resp_q.sbal[sbal_idx]; | 2504 | struct qdio_buffer *sbal = qdio->resp_q.sbal[sbal_idx]; |
2519 | struct qdio_buffer_element *sbale; | 2505 | struct qdio_buffer_element *sbale; |
2520 | struct zfcp_fsf_req *fsf_req; | 2506 | struct zfcp_fsf_req *fsf_req; |
2521 | unsigned long flags, req_id; | 2507 | unsigned long req_id; |
2522 | int idx; | 2508 | int idx; |
2523 | 2509 | ||
2524 | for (idx = 0; idx < QDIO_MAX_ELEMENTS_PER_BUFFER; idx++) { | 2510 | for (idx = 0; idx < QDIO_MAX_ELEMENTS_PER_BUFFER; idx++) { |
2525 | 2511 | ||
2526 | sbale = &sbal->element[idx]; | 2512 | sbale = &sbal->element[idx]; |
2527 | req_id = (unsigned long) sbale->addr; | 2513 | req_id = (unsigned long) sbale->addr; |
2528 | spin_lock_irqsave(&adapter->req_list_lock, flags); | 2514 | fsf_req = zfcp_reqlist_find_rm(adapter->req_list, req_id); |
2529 | fsf_req = zfcp_reqlist_find(adapter, req_id); | ||
2530 | 2515 | ||
2531 | if (!fsf_req) | 2516 | if (!fsf_req) |
2532 | /* | 2517 | /* |
@@ -2536,9 +2521,6 @@ void zfcp_fsf_reqid_check(struct zfcp_qdio *qdio, int sbal_idx) | |||
2536 | panic("error: unknown req_id (%lx) on adapter %s.\n", | 2521 | panic("error: unknown req_id (%lx) on adapter %s.\n", |
2537 | req_id, dev_name(&adapter->ccw_device->dev)); | 2522 | req_id, dev_name(&adapter->ccw_device->dev)); |
2538 | 2523 | ||
2539 | list_del(&fsf_req->list); | ||
2540 | spin_unlock_irqrestore(&adapter->req_list_lock, flags); | ||
2541 | |||
2542 | fsf_req->queue_req.sbal_response = sbal_idx; | 2524 | fsf_req->queue_req.sbal_response = sbal_idx; |
2543 | fsf_req->queue_req.qdio_inb_usage = | 2525 | fsf_req->queue_req.qdio_inb_usage = |
2544 | atomic_read(&qdio->resp_q.count); | 2526 | atomic_read(&qdio->resp_q.count); |