if (!zfcp_data.gid_pn_cache)
                goto out_gid_cache;
 
+       zfcp_data.work_queue = create_singlethread_workqueue("zfcp_wq");
+
        INIT_LIST_HEAD(&zfcp_data.adapter_list_head);
        sema_init(&zfcp_data.config_sema, 1);
        rwlock_init(&zfcp_data.config_lock);
 
        struct kmem_cache       *fsf_req_qtcb_cache;
        struct kmem_cache       *sr_buffer_cache;
        struct kmem_cache       *gid_pn_cache;
+       struct workqueue_struct *work_queue;
 };
 
 /* struct used by memory pools for fsf_requests */
 
                if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP)
                        return zfcp_erp_open_ptp_port(act);
                if (!(p_status & ZFCP_STATUS_PORT_DID_DID)) {
-                       schedule_work(&port->gid_pn_work);
+                       queue_work(zfcp_data.work_queue, &port->gid_pn_work);
                        return ZFCP_ERP_CONTINUES;
                }
        case ZFCP_ERP_STEP_NAMESERVER_LOOKUP:
        atomic_set_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
        INIT_WORK(&p->work, zfcp_erp_scsi_scan);
        p->unit = unit;
-       schedule_work(&p->work);
+       queue_work(zfcp_data.work_queue, &p->work);
 }
 
 static void zfcp_erp_rport_register(struct zfcp_port *port)
 
        zfcp_fsf_req_free(req);
 
        atomic_inc(&adapter->stat_miss);
-       schedule_work(&adapter->stat_work);
+       queue_work(zfcp_data.work_queue, &adapter->stat_work);
 }
 
 static void zfcp_fsf_fsfstatus_qual_eval(struct zfcp_fsf_req *req)