[SCSI] zfcp: Move debug data from zfcp_data to own data structure
[safe/jmp/linux-2.6] / drivers / s390 / scsi / zfcp_aux.c
index c4d07be..870fe79 100644 (file)
@@ -97,9 +97,7 @@ static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun)
        ccw_device_set_online(adapter->ccw_device);
 
        zfcp_erp_wait(adapter);
-       wait_event(adapter->erp_done_wqh,
-                  !(atomic_read(&unit->status) &
-                               ZFCP_STATUS_UNIT_SCSI_WORK_PENDING));
+       flush_work(&unit->scsi_work);
 
        down(&zfcp_data.config_sema);
        zfcp_unit_put(unit);
@@ -279,6 +277,7 @@ struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun)
 
        atomic_set(&unit->refcount, 0);
        init_waitqueue_head(&unit->remove_wq);
+       INIT_WORK(&unit->scsi_work, zfcp_scsi_scan);
 
        unit->port = port;
        unit->fcp_lun = fcp_lun;
@@ -471,6 +470,12 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
        if (!adapter)
                return -ENOMEM;
 
+       adapter->gs = kzalloc(sizeof(struct zfcp_wka_ports), GFP_KERNEL);
+       if (!adapter->gs) {
+               kfree(adapter);
+               return -ENOMEM;
+       }
+
        ccw_device->handler = NULL;
        adapter->ccw_device = ccw_device;
        atomic_set(&adapter->refcount, 0);
@@ -497,10 +502,6 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
 
        spin_lock_init(&adapter->req_list_lock);
 
-       spin_lock_init(&adapter->hba_dbf_lock);
-       spin_lock_init(&adapter->san_dbf_lock);
-       spin_lock_init(&adapter->scsi_dbf_lock);
-       spin_lock_init(&adapter->rec_dbf_lock);
        spin_lock_init(&adapter->req_q_lock);
        spin_lock_init(&adapter->qdio_stat_lock);
 
@@ -524,7 +525,7 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
                goto sysfs_failed;
 
        atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
-       zfcp_fc_nameserver_init(adapter);
+       zfcp_fc_wka_ports_init(adapter);
 
        if (!zfcp_adapter_scsi_register(adapter))
                return 0;
@@ -554,7 +555,6 @@ void zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
 
        cancel_work_sync(&adapter->scan_work);
        cancel_work_sync(&adapter->stat_work);
-       cancel_delayed_work_sync(&adapter->nsp.work);
        zfcp_adapter_scsi_unregister(adapter);
        sysfs_remove_group(&adapter->ccw_device->dev.kobj,
                           &zfcp_sysfs_adapter_attrs);
@@ -572,6 +572,7 @@ void zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
        kfree(adapter->req_list);
        kfree(adapter->fc_stats);
        kfree(adapter->stats_reset_data);
+       kfree(adapter->gs);
        kfree(adapter);
 }
 
@@ -667,13 +668,15 @@ err_out:
  */
 void zfcp_port_dequeue(struct zfcp_port *port)
 {
-       wait_event(port->remove_wq, atomic_read(&port->refcount) == 0);
        write_lock_irq(&zfcp_data.config_lock);
        list_del(&port->list);
        write_unlock_irq(&zfcp_data.config_lock);
-       if (port->rport)
-               fc_remote_port_delete(port->rport);
-       port->rport = NULL;
+       if (port->rport) {
+               port->rport->dd_data = NULL;
+               port->rport = NULL;
+       }
+       wait_event(port->remove_wq, atomic_read(&port->refcount) == 0);
+       cancel_work_sync(&port->rport_work); /* usually not necessary */
        zfcp_adapter_put(port->adapter);
        sysfs_remove_group(&port->sysfs_device.kobj, &zfcp_sysfs_port_attrs);
        device_unregister(&port->sysfs_device);