|
@@ -118,97 +118,32 @@ _zfcp_hex_dump(char *addr, int count)
|
|
|
|
|
|
#define ZFCP_LOG_AREA ZFCP_LOG_AREA_FSF
|
|
#define ZFCP_LOG_AREA ZFCP_LOG_AREA_FSF
|
|
|
|
|
|
-static int zfcp_reqlist_init(struct zfcp_adapter *adapter)
|
|
|
|
|
|
+static int zfcp_reqlist_alloc(struct zfcp_adapter *adapter)
|
|
{
|
|
{
|
|
- int i;
|
|
|
|
|
|
+ int idx;
|
|
|
|
|
|
adapter->req_list = kcalloc(REQUEST_LIST_SIZE, sizeof(struct list_head),
|
|
adapter->req_list = kcalloc(REQUEST_LIST_SIZE, sizeof(struct list_head),
|
|
GFP_KERNEL);
|
|
GFP_KERNEL);
|
|
-
|
|
|
|
if (!adapter->req_list)
|
|
if (!adapter->req_list)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
- for (i=0; i<REQUEST_LIST_SIZE; i++)
|
|
|
|
- INIT_LIST_HEAD(&adapter->req_list[i]);
|
|
|
|
-
|
|
|
|
|
|
+ for (idx = 0; idx < REQUEST_LIST_SIZE; idx++)
|
|
|
|
+ INIT_LIST_HEAD(&adapter->req_list[idx]);
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
static void zfcp_reqlist_free(struct zfcp_adapter *adapter)
|
|
static void zfcp_reqlist_free(struct zfcp_adapter *adapter)
|
|
{
|
|
{
|
|
- struct zfcp_fsf_req *request, *tmp;
|
|
|
|
- unsigned int i;
|
|
|
|
-
|
|
|
|
- for (i=0; i<REQUEST_LIST_SIZE; i++) {
|
|
|
|
- if (list_empty(&adapter->req_list[i]))
|
|
|
|
- continue;
|
|
|
|
-
|
|
|
|
- list_for_each_entry_safe(request, tmp,
|
|
|
|
- &adapter->req_list[i], list)
|
|
|
|
- list_del(&request->list);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
kfree(adapter->req_list);
|
|
kfree(adapter->req_list);
|
|
}
|
|
}
|
|
|
|
|
|
-void zfcp_reqlist_add(struct zfcp_adapter *adapter,
|
|
|
|
- struct zfcp_fsf_req *fsf_req)
|
|
|
|
-{
|
|
|
|
- unsigned int i;
|
|
|
|
-
|
|
|
|
- i = fsf_req->req_id % REQUEST_LIST_SIZE;
|
|
|
|
- list_add_tail(&fsf_req->list, &adapter->req_list[i]);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void zfcp_reqlist_remove(struct zfcp_adapter *adapter, unsigned long req_id)
|
|
|
|
-{
|
|
|
|
- struct zfcp_fsf_req *request, *tmp;
|
|
|
|
- unsigned int i, counter;
|
|
|
|
- u64 dbg_tmp[2];
|
|
|
|
-
|
|
|
|
- i = req_id % REQUEST_LIST_SIZE;
|
|
|
|
- BUG_ON(list_empty(&adapter->req_list[i]));
|
|
|
|
-
|
|
|
|
- counter = 0;
|
|
|
|
- list_for_each_entry_safe(request, tmp, &adapter->req_list[i], list) {
|
|
|
|
- if (request->req_id == req_id) {
|
|
|
|
- dbg_tmp[0] = (u64) atomic_read(&adapter->reqs_active);
|
|
|
|
- dbg_tmp[1] = (u64) counter;
|
|
|
|
- debug_event(adapter->erp_dbf, 4, (void *) dbg_tmp, 16);
|
|
|
|
- list_del(&request->list);
|
|
|
|
- break;
|
|
|
|
- }
|
|
|
|
- counter++;
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-struct zfcp_fsf_req *zfcp_reqlist_ismember(struct zfcp_adapter *adapter,
|
|
|
|
- unsigned long req_id)
|
|
|
|
-{
|
|
|
|
- struct zfcp_fsf_req *request, *tmp;
|
|
|
|
- unsigned int i;
|
|
|
|
-
|
|
|
|
- /* 0 is reserved as an invalid req_id */
|
|
|
|
- if (req_id == 0)
|
|
|
|
- return NULL;
|
|
|
|
-
|
|
|
|
- i = req_id % REQUEST_LIST_SIZE;
|
|
|
|
-
|
|
|
|
- list_for_each_entry_safe(request, tmp, &adapter->req_list[i], list)
|
|
|
|
- if (request->req_id == req_id)
|
|
|
|
- return request;
|
|
|
|
-
|
|
|
|
- return NULL;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
int zfcp_reqlist_isempty(struct zfcp_adapter *adapter)
|
|
int zfcp_reqlist_isempty(struct zfcp_adapter *adapter)
|
|
{
|
|
{
|
|
- unsigned int i;
|
|
|
|
|
|
+ unsigned int idx;
|
|
|
|
|
|
- for (i=0; i<REQUEST_LIST_SIZE; i++)
|
|
|
|
- if (!list_empty(&adapter->req_list[i]))
|
|
|
|
|
|
+ for (idx = 0; idx < REQUEST_LIST_SIZE; idx++)
|
|
|
|
+ if (!list_empty(&adapter->req_list[idx]))
|
|
return 0;
|
|
return 0;
|
|
-
|
|
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1106,7 +1041,7 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device)
|
|
|
|
|
|
/* initialize list of fsf requests */
|
|
/* initialize list of fsf requests */
|
|
spin_lock_init(&adapter->req_list_lock);
|
|
spin_lock_init(&adapter->req_list_lock);
|
|
- retval = zfcp_reqlist_init(adapter);
|
|
|
|
|
|
+ retval = zfcp_reqlist_alloc(adapter);
|
|
if (retval) {
|
|
if (retval) {
|
|
ZFCP_LOG_INFO("request list initialization failed\n");
|
|
ZFCP_LOG_INFO("request list initialization failed\n");
|
|
goto failed_low_mem_buffers;
|
|
goto failed_low_mem_buffers;
|
|
@@ -1167,6 +1102,7 @@ zfcp_adapter_enqueue(struct ccw_device *ccw_device)
|
|
zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev);
|
|
zfcp_sysfs_adapter_remove_files(&adapter->ccw_device->dev);
|
|
sysfs_failed:
|
|
sysfs_failed:
|
|
dev_set_drvdata(&ccw_device->dev, NULL);
|
|
dev_set_drvdata(&ccw_device->dev, NULL);
|
|
|
|
+ zfcp_reqlist_free(adapter);
|
|
failed_low_mem_buffers:
|
|
failed_low_mem_buffers:
|
|
zfcp_free_low_mem_buffers(adapter);
|
|
zfcp_free_low_mem_buffers(adapter);
|
|
if (qdio_free(ccw_device) != 0)
|
|
if (qdio_free(ccw_device) != 0)
|