aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/scsi
diff options
context:
space:
mode:
authorChristof Schmitt <christof.schmitt@de.ibm.com>2010-02-17 05:18:50 -0500
committerJames Bottomley <James.Bottomley@suse.de>2010-02-17 18:46:19 -0500
commitb6bd2fb92a7bb9f1f3feecd9945c21e6c227dd51 (patch)
tree764374b8317b504336ef0c9ba4160ff7124c3e10 /drivers/s390/scsi
parente60a6d69f1f84c2ef1cc63aefaadfe7ae9f12934 (diff)
[SCSI] zfcp: Move FSF request tracking code to new file
Move the code for tracking FSF requests to new file to have this code in one place. The functions for adding and removing requests on the I/O path are already inline. The alloc and free functions are only called once, so it does not hurt to inline them and add them to the same file. Reviewed-by: Swen Schillig <swen@vnet.ibm.com> Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/s390/scsi')
-rw-r--r--drivers/s390/scsi/zfcp_aux.c36
-rw-r--r--drivers/s390/scsi/zfcp_ccw.c3
-rw-r--r--drivers/s390/scsi/zfcp_def.h34
-rw-r--r--drivers/s390/scsi/zfcp_erp.c7
-rw-r--r--drivers/s390/scsi/zfcp_ext.h1
-rw-r--r--drivers/s390/scsi/zfcp_fsf.c32
-rw-r--r--drivers/s390/scsi/zfcp_reqlist.h183
-rw-r--r--drivers/s390/scsi/zfcp_scsi.c5
8 files changed, 203 insertions, 98 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c
index 9d0c941b7d33..f42da9d57093 100644
--- a/drivers/s390/scsi/zfcp_aux.c
+++ b/drivers/s390/scsi/zfcp_aux.c
@@ -32,6 +32,7 @@
32#include <linux/seq_file.h> 32#include <linux/seq_file.h>
33#include "zfcp_ext.h" 33#include "zfcp_ext.h"
34#include "zfcp_fc.h" 34#include "zfcp_fc.h"
35#include "zfcp_reqlist.h"
35 36
36#define ZFCP_BUS_ID_SIZE 20 37#define ZFCP_BUS_ID_SIZE 20
37 38
@@ -49,36 +50,6 @@ static struct kmem_cache *zfcp_cache_hw_align(const char *name,
49 return kmem_cache_create(name, size, roundup_pow_of_two(size), 0, NULL); 50 return kmem_cache_create(name, size, roundup_pow_of_two(size), 0, NULL);
50} 51}
51 52
52static int zfcp_reqlist_alloc(struct zfcp_adapter *adapter)
53{
54 int idx;
55
56 adapter->req_list = kcalloc(REQUEST_LIST_SIZE, sizeof(struct list_head),
57 GFP_KERNEL);
58 if (!adapter->req_list)
59 return -ENOMEM;
60
61 for (idx = 0; idx < REQUEST_LIST_SIZE; idx++)
62 INIT_LIST_HEAD(&adapter->req_list[idx]);
63 return 0;
64}
65
66/**
67 * zfcp_reqlist_isempty - is the request list empty
68 * @adapter: pointer to struct zfcp_adapter
69 *
70 * Returns: true if list is empty, false otherwise
71 */
72int zfcp_reqlist_isempty(struct zfcp_adapter *adapter)
73{
74 unsigned int idx;
75
76 for (idx = 0; idx < REQUEST_LIST_SIZE; idx++)
77 if (!list_empty(&adapter->req_list[idx]))
78 return 0;
79 return 1;
80}
81
82static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun) 53static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun)
83{ 54{
84 struct ccw_device *cdev; 55 struct ccw_device *cdev;
@@ -539,7 +510,8 @@ struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *ccw_device)
539 if (zfcp_allocate_low_mem_buffers(adapter)) 510 if (zfcp_allocate_low_mem_buffers(adapter))
540 goto failed; 511 goto failed;
541 512
542 if (zfcp_reqlist_alloc(adapter)) 513 adapter->req_list = zfcp_reqlist_alloc();
514 if (!adapter->req_list)
543 goto failed; 515 goto failed;
544 516
545 if (zfcp_dbf_adapter_register(adapter)) 517 if (zfcp_dbf_adapter_register(adapter))
@@ -560,8 +532,6 @@ struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *ccw_device)
560 INIT_LIST_HEAD(&adapter->erp_ready_head); 532 INIT_LIST_HEAD(&adapter->erp_ready_head);
561 INIT_LIST_HEAD(&adapter->erp_running_head); 533 INIT_LIST_HEAD(&adapter->erp_running_head);
562 534
563 spin_lock_init(&adapter->req_list_lock);
564
565 rwlock_init(&adapter->erp_lock); 535 rwlock_init(&adapter->erp_lock);
566 rwlock_init(&adapter->abort_lock); 536 rwlock_init(&adapter->abort_lock);
567 537
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c
index c22cb72a5ae8..6f65a2179537 100644
--- a/drivers/s390/scsi/zfcp_ccw.c
+++ b/drivers/s390/scsi/zfcp_ccw.c
@@ -10,6 +10,7 @@
10#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt 10#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
11 11
12#include "zfcp_ext.h" 12#include "zfcp_ext.h"
13#include "zfcp_reqlist.h"
13 14
14#define ZFCP_MODEL_PRIV 0x4 15#define ZFCP_MODEL_PRIV 0x4
15 16
@@ -162,7 +163,7 @@ static int zfcp_ccw_set_online(struct ccw_device *cdev)
162 } 163 }
163 164
164 /* initialize request counter */ 165 /* initialize request counter */
165 BUG_ON(!zfcp_reqlist_isempty(adapter)); 166 BUG_ON(!zfcp_reqlist_isempty(adapter->req_list));
166 adapter->req_no = 0; 167 adapter->req_no = 0;
167 168
168 zfcp_erp_modify_adapter_status(adapter, "ccsonl1", NULL, 169 zfcp_erp_modify_adapter_status(adapter, "ccsonl1", NULL,
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h
index 6ed48654c299..ff4e2ca19beb 100644
--- a/drivers/s390/scsi/zfcp_def.h
+++ b/drivers/s390/scsi/zfcp_def.h
@@ -39,9 +39,7 @@
39#include <asm/sysinfo.h> 39#include <asm/sysinfo.h>
40#include "zfcp_fsf.h" 40#include "zfcp_fsf.h"
41 41
42/********************* GENERAL DEFINES *********************************/ 42struct zfcp_reqlist;
43
44#define REQUEST_LIST_SIZE 128
45 43
46/********************* SCSI SPECIFIC DEFINES *********************************/ 44/********************* SCSI SPECIFIC DEFINES *********************************/
47#define ZFCP_SCSI_ER_TIMEOUT (10*HZ) 45#define ZFCP_SCSI_ER_TIMEOUT (10*HZ)
@@ -206,8 +204,7 @@ struct zfcp_adapter {
206 struct list_head port_list; /* remote port list */ 204 struct list_head port_list; /* remote port list */
207 rwlock_t port_list_lock; /* port list lock */ 205 rwlock_t port_list_lock; /* port list lock */
208 unsigned long req_no; /* unique FSF req number */ 206 unsigned long req_no; /* unique FSF req number */
209 struct list_head *req_list; /* list of pending reqs */ 207 struct zfcp_reqlist *req_list;
210 spinlock_t req_list_lock; /* request list lock */
211 u32 fsf_req_seq_no; /* FSF cmnd seq number */ 208 u32 fsf_req_seq_no; /* FSF cmnd seq number */
212 rwlock_t abort_lock; /* Protects against SCSI 209 rwlock_t abort_lock; /* Protects against SCSI
213 stack abort/command 210 stack abort/command
@@ -351,31 +348,4 @@ struct zfcp_data {
351#define ZFCP_SET 0x00000100 348#define ZFCP_SET 0x00000100
352#define ZFCP_CLEAR 0x00000200 349#define ZFCP_CLEAR 0x00000200
353 350
354/*
355 * Helper functions for request ID management.
356 */
357static inline int zfcp_reqlist_hash(unsigned long req_id)
358{
359 return req_id % REQUEST_LIST_SIZE;
360}
361
362static inline void zfcp_reqlist_remove(struct zfcp_adapter *adapter,
363 struct zfcp_fsf_req *fsf_req)
364{
365 list_del(&fsf_req->list);
366}
367
368static inline struct zfcp_fsf_req *
369zfcp_reqlist_find(struct zfcp_adapter *adapter, unsigned long req_id)
370{
371 struct zfcp_fsf_req *request;
372 unsigned int idx;
373
374 idx = zfcp_reqlist_hash(req_id);
375 list_for_each_entry(request, &adapter->req_list[idx], list)
376 if (request->req_id == req_id)
377 return request;
378 return NULL;
379}
380
381#endif /* ZFCP_DEF_H */ 351#endif /* ZFCP_DEF_H */
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c
index d40d5b0f263f..fe8e4c2b9563 100644
--- a/drivers/s390/scsi/zfcp_erp.c
+++ b/drivers/s390/scsi/zfcp_erp.c
@@ -11,6 +11,7 @@
11 11
12#include <linux/kthread.h> 12#include <linux/kthread.h>
13#include "zfcp_ext.h" 13#include "zfcp_ext.h"
14#include "zfcp_reqlist.h"
14 15
15#define ZFCP_MAX_ERPS 3 16#define ZFCP_MAX_ERPS 3
16 17
@@ -483,8 +484,8 @@ static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act)
483 if (!act->fsf_req_id) 484 if (!act->fsf_req_id)
484 return; 485 return;
485 486
486 spin_lock(&adapter->req_list_lock); 487 spin_lock(&adapter->req_list->lock);
487 req = zfcp_reqlist_find(adapter, act->fsf_req_id); 488 req = _zfcp_reqlist_find(adapter->req_list, act->fsf_req_id);
488 if (req && req->erp_action == act) { 489 if (req && req->erp_action == act) {
489 if (act->status & (ZFCP_STATUS_ERP_DISMISSED | 490 if (act->status & (ZFCP_STATUS_ERP_DISMISSED |
490 ZFCP_STATUS_ERP_TIMEDOUT)) { 491 ZFCP_STATUS_ERP_TIMEDOUT)) {
@@ -498,7 +499,7 @@ static void zfcp_erp_strategy_check_fsfreq(struct zfcp_erp_action *act)
498 act->fsf_req_id = 0; 499 act->fsf_req_id = 0;
499 } else 500 } else
500 act->fsf_req_id = 0; 501 act->fsf_req_id = 0;
501 spin_unlock(&adapter->req_list_lock); 502 spin_unlock(&adapter->req_list->lock);
502} 503}
503 504
504/** 505/**
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h
index 66bdb34143cb..85cb135d5e7f 100644
--- a/drivers/s390/scsi/zfcp_ext.h
+++ b/drivers/s390/scsi/zfcp_ext.h
@@ -21,7 +21,6 @@ extern struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *);
21extern struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *, u64, u32, 21extern struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *, u64, u32,
22 u32); 22 u32);
23extern struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *, u64); 23extern struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *, u64);
24extern int zfcp_reqlist_isempty(struct zfcp_adapter *);
25extern void zfcp_sg_free_table(struct scatterlist *, int); 24extern void zfcp_sg_free_table(struct scatterlist *, int);
26extern int zfcp_sg_setup_table(struct scatterlist *, int); 25extern int zfcp_sg_setup_table(struct scatterlist *, int);
27extern void zfcp_device_unregister(struct device *, 26extern void zfcp_device_unregister(struct device *,
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c
index fd2371b69489..36a6f4a7b8d7 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
18static void zfcp_fsf_request_timeout_handler(unsigned long data) 19static 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)
457void zfcp_fsf_req_dismiss_all(struct zfcp_adapter *adapter) 458void 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);
diff --git a/drivers/s390/scsi/zfcp_reqlist.h b/drivers/s390/scsi/zfcp_reqlist.h
new file mode 100644
index 000000000000..a72d1b730aba
--- /dev/null
+++ b/drivers/s390/scsi/zfcp_reqlist.h
@@ -0,0 +1,183 @@
1/*
2 * zfcp device driver
3 *
4 * Data structure and helper functions for tracking pending FSF
5 * requests.
6 *
7 * Copyright IBM Corporation 2009
8 */
9
10#ifndef ZFCP_REQLIST_H
11#define ZFCP_REQLIST_H
12
13/* number of hash buckets */
14#define ZFCP_REQ_LIST_BUCKETS 128
15
16/**
17 * struct zfcp_reqlist - Container for request list (reqlist)
18 * @lock: Spinlock for protecting the hash list
19 * @list: Array of hashbuckets, each is a list of requests in this bucket
20 */
21struct zfcp_reqlist {
22 spinlock_t lock;
23 struct list_head buckets[ZFCP_REQ_LIST_BUCKETS];
24};
25
26static inline int zfcp_reqlist_hash(unsigned long req_id)
27{
28 return req_id % ZFCP_REQ_LIST_BUCKETS;
29}
30
31/**
32 * zfcp_reqlist_alloc - Allocate and initialize reqlist
33 *
34 * Returns pointer to allocated reqlist on success, or NULL on
35 * allocation failure.
36 */
37static inline struct zfcp_reqlist *zfcp_reqlist_alloc(void)
38{
39 unsigned int i;
40 struct zfcp_reqlist *rl;
41
42 rl = kzalloc(sizeof(struct zfcp_reqlist), GFP_KERNEL);
43 if (!rl)
44 return NULL;
45
46 spin_lock_init(&rl->lock);
47
48 for (i = 0; i < ZFCP_REQ_LIST_BUCKETS; i++)
49 INIT_LIST_HEAD(&rl->buckets[i]);
50
51 return rl;
52}
53
54/**
55 * zfcp_reqlist_isempty - Check whether the request list empty
56 * @rl: pointer to reqlist
57 *
58 * Returns: 1 if list is empty, 0 if not
59 */
60static inline int zfcp_reqlist_isempty(struct zfcp_reqlist *rl)
61{
62 unsigned int i;
63
64 for (i = 0; i < ZFCP_REQ_LIST_BUCKETS; i++)
65 if (!list_empty(&rl->buckets[i]))
66 return 0;
67 return 1;
68}
69
70/**
71 * zfcp_reqlist_free - Free allocated memory for reqlist
72 * @rl: The reqlist where to free memory
73 */
74static inline void zfcp_reqlist_free(struct zfcp_reqlist *rl)
75{
76 /* sanity check */
77 BUG_ON(!zfcp_reqlist_isempty(rl));
78
79 kfree(rl);
80}
81
82static inline struct zfcp_fsf_req *
83_zfcp_reqlist_find(struct zfcp_reqlist *rl, unsigned long req_id)
84{
85 struct zfcp_fsf_req *req;
86 unsigned int i;
87
88 i = zfcp_reqlist_hash(req_id);
89 list_for_each_entry(req, &rl->buckets[i], list)
90 if (req->req_id == req_id)
91 return req;
92 return NULL;
93}
94
95/**
96 * zfcp_reqlist_find - Lookup FSF request by its request id
97 * @rl: The reqlist where to lookup the FSF request
98 * @req_id: The request id to look for
99 *
100 * Returns a pointer to the FSF request with the specified request id
101 * or NULL if there is no known FSF request with this id.
102 */
103static inline struct zfcp_fsf_req *
104zfcp_reqlist_find(struct zfcp_reqlist *rl, unsigned long req_id)
105{
106 unsigned long flags;
107 struct zfcp_fsf_req *req;
108
109 spin_lock_irqsave(&rl->lock, flags);
110 req = _zfcp_reqlist_find(rl, req_id);
111 spin_unlock_irqrestore(&rl->lock, flags);
112
113 return req;
114}
115
116/**
117 * zfcp_reqlist_find_rm - Lookup request by id and remove it from reqlist
118 * @rl: reqlist where to search and remove entry
119 * @req_id: The request id of the request to look for
120 *
121 * This functions tries to find the FSF request with the specified
122 * id and then removes it from the reqlist. The reqlist lock is held
123 * during both steps of the operation.
124 *
125 * Returns: Pointer to the FSF request if the request has been found,
126 * NULL if it has not been found.
127 */
128static inline struct zfcp_fsf_req *
129zfcp_reqlist_find_rm(struct zfcp_reqlist *rl, unsigned long req_id)
130{
131 unsigned long flags;
132 struct zfcp_fsf_req *req;
133
134 spin_lock_irqsave(&rl->lock, flags);
135 req = _zfcp_reqlist_find(rl, req_id);
136 if (req)
137 list_del(&req->list);
138 spin_unlock_irqrestore(&rl->lock, flags);
139
140 return req;
141}
142
143/**
144 * zfcp_reqlist_add - Add entry to reqlist
145 * @rl: reqlist where to add the entry
146 * @req: The entry to add
147 *
148 * The request id always increases. As an optimization new requests
149 * are added here with list_add_tail at the end of the bucket lists
150 * while old requests are looked up starting at the beginning of the
151 * lists.
152 */
153static inline void zfcp_reqlist_add(struct zfcp_reqlist *rl,
154 struct zfcp_fsf_req *req)
155{
156 unsigned int i;
157 unsigned long flags;
158
159 i = zfcp_reqlist_hash(req->req_id);
160
161 spin_lock_irqsave(&rl->lock, flags);
162 list_add_tail(&req->list, &rl->buckets[i]);
163 spin_unlock_irqrestore(&rl->lock, flags);
164}
165
166/**
167 * zfcp_reqlist_move - Move all entries from reqlist to simple list
168 * @rl: The zfcp_reqlist where to remove all entries
169 * @list: The list where to move all entries
170 */
171static inline void zfcp_reqlist_move(struct zfcp_reqlist *rl,
172 struct list_head *list)
173{
174 unsigned int i;
175 unsigned long flags;
176
177 spin_lock_irqsave(&rl->lock, flags);
178 for (i = 0; i < ZFCP_REQ_LIST_BUCKETS; i++)
179 list_splice_init(&rl->buckets[i], list);
180 spin_unlock_irqrestore(&rl->lock, flags);
181}
182
183#endif /* ZFCP_REQLIST_H */
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c
index 8e6fc68d6bd4..e1e56f523116 100644
--- a/drivers/s390/scsi/zfcp_scsi.c
+++ b/drivers/s390/scsi/zfcp_scsi.c
@@ -15,6 +15,7 @@
15#include "zfcp_ext.h" 15#include "zfcp_ext.h"
16#include "zfcp_dbf.h" 16#include "zfcp_dbf.h"
17#include "zfcp_fc.h" 17#include "zfcp_fc.h"
18#include "zfcp_reqlist.h"
18 19
19static unsigned int default_depth = 32; 20static unsigned int default_depth = 32;
20module_param_named(queue_depth, default_depth, uint, 0600); 21module_param_named(queue_depth, default_depth, uint, 0600);
@@ -189,9 +190,7 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
189 /* avoid race condition between late normal completion and abort */ 190 /* avoid race condition between late normal completion and abort */
190 write_lock_irqsave(&adapter->abort_lock, flags); 191 write_lock_irqsave(&adapter->abort_lock, flags);
191 192
192 spin_lock(&adapter->req_list_lock); 193 old_req = zfcp_reqlist_find(adapter->req_list, old_reqid);
193 old_req = zfcp_reqlist_find(adapter, old_reqid);
194 spin_unlock(&adapter->req_list_lock);
195 if (!old_req) { 194 if (!old_req) {
196 write_unlock_irqrestore(&adapter->abort_lock, flags); 195 write_unlock_irqrestore(&adapter->abort_lock, flags);
197 zfcp_dbf_scsi_abort("lte1", adapter->dbf, scpnt, NULL, 196 zfcp_dbf_scsi_abort("lte1", adapter->dbf, scpnt, NULL,