aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390/scsi/zfcp_aux.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/s390/scsi/zfcp_aux.c')
-rw-r--r--drivers/s390/scsi/zfcp_aux.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c
index de623292277b..f785cbc7520d 100644
--- a/drivers/s390/scsi/zfcp_aux.c
+++ b/drivers/s390/scsi/zfcp_aux.c
@@ -176,8 +176,6 @@ static int __init zfcp_module_init(void)
176 if (!zfcp_data.gid_pn_cache) 176 if (!zfcp_data.gid_pn_cache)
177 goto out_gid_cache; 177 goto out_gid_cache;
178 178
179 zfcp_data.work_queue = create_singlethread_workqueue("zfcp_wq");
180
181 sema_init(&zfcp_data.config_sema, 1); 179 sema_init(&zfcp_data.config_sema, 1);
182 rwlock_init(&zfcp_data.config_lock); 180 rwlock_init(&zfcp_data.config_lock);
183 181
@@ -458,6 +456,27 @@ static void zfcp_print_sl(struct seq_file *m, struct service_level *sl)
458 adapter->fsf_lic_version); 456 adapter->fsf_lic_version);
459} 457}
460 458
459static int zfcp_setup_adapter_work_queue(struct zfcp_adapter *adapter)
460{
461 char name[TASK_COMM_LEN];
462
463 snprintf(name, sizeof(name), "zfcp_q_%s",
464 dev_name(&adapter->ccw_device->dev));
465 adapter->work_queue = create_singlethread_workqueue(name);
466
467 if (adapter->work_queue)
468 return 0;
469 return -ENOMEM;
470}
471
472static void zfcp_destroy_adapter_work_queue(struct zfcp_adapter *adapter)
473{
474 if (adapter->work_queue)
475 destroy_workqueue(adapter->work_queue);
476 adapter->work_queue = NULL;
477
478}
479
461/** 480/**
462 * zfcp_adapter_enqueue - enqueue a new adapter to the list 481 * zfcp_adapter_enqueue - enqueue a new adapter to the list
463 * @ccw_device: pointer to the struct cc_device 482 * @ccw_device: pointer to the struct cc_device
@@ -504,6 +523,9 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
504 if (zfcp_adapter_debug_register(adapter)) 523 if (zfcp_adapter_debug_register(adapter))
505 goto debug_register_failed; 524 goto debug_register_failed;
506 525
526 if (zfcp_setup_adapter_work_queue(adapter))
527 goto work_queue_failed;
528
507 init_waitqueue_head(&adapter->remove_wq); 529 init_waitqueue_head(&adapter->remove_wq);
508 init_waitqueue_head(&adapter->erp_thread_wqh); 530 init_waitqueue_head(&adapter->erp_thread_wqh);
509 init_waitqueue_head(&adapter->erp_done_wqh); 531 init_waitqueue_head(&adapter->erp_done_wqh);
@@ -543,6 +565,8 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
543 return 0; 565 return 0;
544 566
545sysfs_failed: 567sysfs_failed:
568 zfcp_destroy_adapter_work_queue(adapter);
569work_queue_failed:
546 zfcp_adapter_debug_unregister(adapter); 570 zfcp_adapter_debug_unregister(adapter);
547debug_register_failed: 571debug_register_failed:
548 dev_set_drvdata(&ccw_device->dev, NULL); 572 dev_set_drvdata(&ccw_device->dev, NULL);
@@ -579,6 +603,7 @@ void zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
579 if (!retval) 603 if (!retval)
580 return; 604 return;
581 605
606 zfcp_destroy_adapter_work_queue(adapter);
582 zfcp_adapter_debug_unregister(adapter); 607 zfcp_adapter_debug_unregister(adapter);
583 zfcp_qdio_free(adapter); 608 zfcp_qdio_free(adapter);
584 zfcp_free_low_mem_buffers(adapter); 609 zfcp_free_low_mem_buffers(adapter);