[SCSI] zfcp: Move debug data from zfcp_data to own data structure
[pandora-kernel.git] / drivers / s390 / scsi / zfcp_aux.c
index 3ac27ee..870fe79 100644 (file)
@@ -470,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);
@@ -496,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);
 
@@ -523,8 +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;
@@ -571,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);
 }
 
@@ -666,12 +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)
+       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);