[SCSI] zfcp: Simplify zfcp data structures
authorChristof Schmitt <christof.schmitt@de.ibm.com>
Wed, 1 Oct 2008 10:42:20 +0000 (12:42 +0200)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Fri, 3 Oct 2008 17:11:54 +0000 (12:11 -0500)
Reduce the size of zfcp data structures by removing unused and
redundant members. scsi_lun is only the mangled version of the
fcp_lun. So, remove the redundant field and use the fcp_lun instead.

Since the queue lock and the pci_batch indicator are only used in the
request queue, move them from the common queue struct to the adapter
struct.

Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: Swen Schillig <swen@vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/s390/scsi/zfcp_aux.c
drivers/s390/scsi/zfcp_ccw.c
drivers/s390/scsi/zfcp_def.h
drivers/s390/scsi/zfcp_erp.c
drivers/s390/scsi/zfcp_fc.c
drivers/s390/scsi/zfcp_fsf.c
drivers/s390/scsi/zfcp_qdio.c
drivers/s390/scsi/zfcp_scsi.c
drivers/s390/scsi/zfcp_sysfs.c

index 6397de0..b998464 100644 (file)
@@ -169,8 +169,6 @@ static int __init zfcp_module_init(void)
                goto out_gid_cache;
 
        INIT_LIST_HEAD(&zfcp_data.adapter_list_head);
-       INIT_LIST_HEAD(&zfcp_data.adapter_remove_lh);
-
        sema_init(&zfcp_data.config_sema, 1);
        rwlock_init(&zfcp_data.config_lock);
 
@@ -312,7 +310,6 @@ struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun)
        }
 
        zfcp_unit_get(unit);
-       unit->scsi_lun = scsilun_to_int((struct scsi_lun *)&unit->fcp_lun);
 
        write_lock_irq(&zfcp_data.config_lock);
        list_add_tail(&unit->list, &port->unit_list_head);
@@ -321,7 +318,6 @@ struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun)
 
        write_unlock_irq(&zfcp_data.config_lock);
 
-       port->units++;
        zfcp_port_get(port);
 
        return unit;
@@ -344,7 +340,6 @@ void zfcp_unit_dequeue(struct zfcp_unit *unit)
        write_lock_irq(&zfcp_data.config_lock);
        list_del(&unit->list);
        write_unlock_irq(&zfcp_data.config_lock);
-       unit->port->units--;
        zfcp_port_put(unit->port);
        sysfs_remove_group(&unit->sysfs_device.kobj, &zfcp_sysfs_unit_attrs);
        device_unregister(&unit->sysfs_device);
@@ -405,11 +400,6 @@ static void zfcp_free_low_mem_buffers(struct zfcp_adapter *adapter)
                mempool_destroy(adapter->pool.data_gid_pn);
 }
 
-static void zfcp_dummy_release(struct device *dev)
-{
-       return;
-}
-
 /**
  * zfcp_status_read_refill - refill the long running status_read_requests
  * @adapter: ptr to struct zfcp_adapter for which the buffers should be refilled
@@ -484,7 +474,6 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
        init_waitqueue_head(&adapter->erp_done_wqh);
 
        INIT_LIST_HEAD(&adapter->port_list_head);
-       INIT_LIST_HEAD(&adapter->port_remove_lh);
        INIT_LIST_HEAD(&adapter->erp_ready_head);
        INIT_LIST_HEAD(&adapter->erp_running_head);
 
@@ -494,7 +483,7 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
        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->req_q_lock);
 
        rwlock_init(&adapter->erp_lock);
        rwlock_init(&adapter->abort_lock);
@@ -513,28 +502,15 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
                               &zfcp_sysfs_adapter_attrs))
                goto sysfs_failed;
 
-       adapter->generic_services.parent = &adapter->ccw_device->dev;
-       adapter->generic_services.release = zfcp_dummy_release;
-       snprintf(adapter->generic_services.bus_id, BUS_ID_SIZE,
-                "generic_services");
-
-       if (device_register(&adapter->generic_services))
-               goto generic_services_failed;
-
        write_lock_irq(&zfcp_data.config_lock);
        atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
        list_add_tail(&adapter->list, &zfcp_data.adapter_list_head);
        write_unlock_irq(&zfcp_data.config_lock);
 
-       zfcp_data.adapters++;
-
        zfcp_fc_nameserver_init(adapter);
 
        return 0;
 
-generic_services_failed:
-       sysfs_remove_group(&ccw_device->dev.kobj,
-                          &zfcp_sysfs_adapter_attrs);
 sysfs_failed:
        zfcp_adapter_debug_unregister(adapter);
 debug_register_failed:
@@ -561,7 +537,6 @@ void zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
        cancel_work_sync(&adapter->scan_work);
        cancel_work_sync(&adapter->stat_work);
        zfcp_adapter_scsi_unregister(adapter);
-       device_unregister(&adapter->generic_services);
        sysfs_remove_group(&adapter->ccw_device->dev.kobj,
                           &zfcp_sysfs_adapter_attrs);
        dev_set_drvdata(&adapter->ccw_device->dev, NULL);
@@ -579,9 +554,6 @@ void zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
        list_del(&adapter->list);
        write_unlock_irq(&zfcp_data.config_lock);
 
-       /* decrease number of adapters in list */
-       zfcp_data.adapters--;
-
        zfcp_qdio_free(adapter);
 
        zfcp_free_low_mem_buffers(adapter);
@@ -620,9 +592,7 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn,
                return ERR_PTR(-ENOMEM);
 
        init_waitqueue_head(&port->remove_wq);
-
        INIT_LIST_HEAD(&port->unit_list_head);
-       INIT_LIST_HEAD(&port->unit_remove_lh);
        INIT_WORK(&port->gid_pn_work, zfcp_erp_port_strategy_open_lookup);
 
        port->adapter = adapter;
@@ -665,7 +635,6 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn,
        list_add_tail(&port->list, &adapter->port_list_head);
        atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
        atomic_set_mask(ZFCP_STATUS_COMMON_RUNNING, &port->status);
-       adapter->ports++;
 
        write_unlock_irq(&zfcp_data.config_lock);
 
@@ -687,7 +656,6 @@ 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);
-       port->adapter->ports--;
        write_unlock_irq(&zfcp_data.config_lock);
        if (port->rport)
                fc_remote_port_delete(port->rport);
index 3a9bd54..b04038c 100644 (file)
@@ -47,6 +47,8 @@ static void zfcp_ccw_remove(struct ccw_device *ccw_device)
        struct zfcp_adapter *adapter;
        struct zfcp_port *port, *p;
        struct zfcp_unit *unit, *u;
+       LIST_HEAD(unit_remove_lh);
+       LIST_HEAD(port_remove_lh);
 
        ccw_device_set_offline(ccw_device);
        down(&zfcp_data.config_sema);
@@ -55,18 +57,18 @@ static void zfcp_ccw_remove(struct ccw_device *ccw_device)
        write_lock_irq(&zfcp_data.config_lock);
        list_for_each_entry_safe(port, p, &adapter->port_list_head, list) {
                list_for_each_entry_safe(unit, u, &port->unit_list_head, list) {
-                       list_move(&unit->list, &port->unit_remove_lh);
+                       list_move(&unit->list, &unit_remove_lh);
                        atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE,
                                        &unit->status);
                }
-               list_move(&port->list, &adapter->port_remove_lh);
+               list_move(&port->list, &port_remove_lh);
                atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
        }
        atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
        write_unlock_irq(&zfcp_data.config_lock);
 
-       list_for_each_entry_safe(port, p, &adapter->port_remove_lh, list) {
-               list_for_each_entry_safe(unit, u, &port->unit_remove_lh, list) {
+       list_for_each_entry_safe(port, p, &port_remove_lh, list) {
+               list_for_each_entry_safe(unit, u, &unit_remove_lh, list) {
                        if (atomic_read(&unit->status) &
                            ZFCP_STATUS_UNIT_REGISTERED)
                                scsi_remove_device(unit->device);
index cbbfd87..7fa8937 100644 (file)
@@ -412,14 +412,9 @@ struct zfcp_wka_port {
 };
 
 struct zfcp_qdio_queue {
-       struct qdio_buffer *sbal[QDIO_MAX_BUFFERS_PER_Q]; /* SBALs */
-       u8                 first;             /* index of next free bfr
-                                                in queue (free_count>0) */
-       atomic_t           count;             /* number of free buffers
-                                                in queue */
-       spinlock_t         lock;              /* lock for operations on queue */
-       int                pci_batch;         /* SBALs since PCI indication
-                                                was last set */
+       struct qdio_buffer *sbal[QDIO_MAX_BUFFERS_PER_Q];
+       u8                 first;       /* index of next free bfr in queue */
+       atomic_t           count;       /* number of free buffers in queue */
 };
 
 struct zfcp_erp_action {
@@ -471,13 +466,13 @@ struct zfcp_adapter {
        u16                     timer_ticks;       /* time int for a tick */
        struct Scsi_Host        *scsi_host;        /* Pointer to mid-layer */
        struct list_head        port_list_head;    /* remote port list */
-       struct list_head        port_remove_lh;    /* head of ports to be
-                                                     removed */
-       u32                     ports;             /* number of remote ports */
        unsigned long           req_no;            /* unique FSF req number */
        struct list_head        *req_list;         /* list of pending reqs */
        spinlock_t              req_list_lock;     /* request list lock */
        struct zfcp_qdio_queue  req_q;             /* request queue */
+       spinlock_t              req_q_lock;        /* for operations on queue */
+       int                     req_q_pci_batch;   /* SBALs since PCI indication
+                                                     was last set */
        u32                     fsf_req_seq_no;    /* FSF cmnd seq number */
        wait_queue_head_t       request_wq;        /* can be used to wait for
                                                      more avaliable SBALs */
@@ -516,7 +511,6 @@ struct zfcp_adapter {
        struct zfcp_scsi_dbf_record     scsi_dbf_buf;
        struct zfcp_adapter_mempool     pool;      /* Adapter memory pools */
        struct qdio_initialize  qdio_init_data;    /* for qdio_establish */
-       struct device           generic_services;  /* directory for WKA ports */
        struct fc_host_statistics *fc_stats;
        struct fsf_qtcb_bottom_port *stats_reset_data;
        unsigned long           stats_reset;
@@ -533,9 +527,6 @@ struct zfcp_port {
                                                  refcount drop to zero */
        struct zfcp_adapter    *adapter;       /* adapter used to access port */
        struct list_head       unit_list_head; /* head of logical unit list */
-       struct list_head       unit_remove_lh; /* head of luns to be removed
-                                                 list */
-       u32                    units;          /* # of logical units in list */
        atomic_t               status;         /* status of this remote port */
        u64                    wwnn;           /* WWNN if known */
        u64                    wwpn;           /* WWPN */
@@ -556,7 +547,6 @@ struct zfcp_unit {
                                                  refcount drop to zero */
        struct zfcp_port       *port;          /* remote port of unit */
        atomic_t               status;         /* status of this logical unit */
-       unsigned int           scsi_lun;       /* own SCSI LUN */
        u64                    fcp_lun;        /* own FCP_LUN */
        u32                    handle;         /* handle assigned by FSF */
         struct scsi_device     *device;        /* scsi device struct pointer */
@@ -599,11 +589,7 @@ struct zfcp_fsf_req {
 struct zfcp_data {
        struct scsi_host_template scsi_host_template;
        struct scsi_transport_template *scsi_transport_template;
-        atomic_t                status;             /* Module status flags */
        struct list_head        adapter_list_head;  /* head of adapter list */
-       struct list_head        adapter_remove_lh;  /* head of adapters to be
-                                                      removed */
-       u32                     adapters;           /* # of adapters in list */
        rwlock_t                config_lock;        /* serialises changes
                                                       to adapter/port/unit
                                                       lists */
index 07d22f3..174b38f 100644 (file)
@@ -1186,7 +1186,7 @@ static void zfcp_erp_scsi_scan(struct work_struct *work)
        struct zfcp_unit *unit = p->unit;
        struct fc_rport *rport = unit->port->rport;
        scsi_scan_target(&rport->dev, 0, rport->scsi_target_id,
-                        unit->scsi_lun, 0);
+                        scsilun_to_int((struct scsi_lun *)&unit->fcp_lun), 0);
        atomic_clear_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
        zfcp_unit_put(unit);
        kfree(p);
index 3a573b0..1a7c80a 100644 (file)
@@ -526,7 +526,8 @@ static void zfcp_validate_port(struct zfcp_port *port)
 
        atomic_clear_mask(ZFCP_STATUS_COMMON_NOESC, &port->status);
 
-       if ((port->supported_classes != 0) || (port->units != 0)) {
+       if ((port->supported_classes != 0) ||
+           !list_empty(&port->unit_list_head)) {
                zfcp_port_put(port);
                return;
        }
index 02a5700..c10b88d 100644 (file)
@@ -639,12 +639,14 @@ static void zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *req)
        }
 }
 
-static int zfcp_fsf_sbal_check(struct zfcp_qdio_queue *queue)
+static int zfcp_fsf_sbal_check(struct zfcp_adapter *adapter)
 {
-       spin_lock_bh(&queue->lock);
-       if (atomic_read(&queue->count))
+       struct zfcp_qdio_queue *req_q = &adapter->req_q;
+
+       spin_lock_bh(&adapter->req_q_lock);
+       if (atomic_read(&req_q->count))
                return 1;
-       spin_unlock_bh(&queue->lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return 0;
 }
 
@@ -659,17 +661,16 @@ static int zfcp_fsf_sbal_available(struct zfcp_adapter *adapter)
 static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
 {
        long ret;
-       struct zfcp_qdio_queue *req_q = &adapter->req_q;
 
-       spin_unlock_bh(&req_q->lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        ret = wait_event_interruptible_timeout(adapter->request_wq,
-                                       zfcp_fsf_sbal_check(req_q), 5 * HZ);
+                                       zfcp_fsf_sbal_check(adapter), 5 * HZ);
        if (ret > 0)
                return 0;
        if (!ret)
                atomic_inc(&adapter->qdio_outb_full);
 
-       spin_lock_bh(&req_q->lock);
+       spin_lock_bh(&adapter->req_q_lock);
        return -EIO;
 }
 
@@ -811,7 +812,7 @@ int zfcp_fsf_status_read(struct zfcp_adapter *adapter)
        struct qdio_buffer_element *sbale;
        int retval = -EIO;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;
 
@@ -851,7 +852,7 @@ failed_buf:
        zfcp_fsf_req_free(req);
        zfcp_hba_dbf_event_fsf_unsol("fail", adapter, NULL);
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return retval;
 }
 
@@ -924,7 +925,7 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long old_req_id,
        struct qdio_buffer_element *sbale;
        struct zfcp_fsf_req *req = NULL;
 
-       spin_lock(&adapter->req_q.lock);
+       spin_lock(&adapter->req_q_lock);
        if (!zfcp_fsf_sbal_available(adapter))
                goto out;
        req = zfcp_fsf_req_create(adapter, FSF_QTCB_ABORT_FCP_CMND,
@@ -954,7 +955,7 @@ out_error_free:
        zfcp_fsf_req_free(req);
        req = NULL;
 out:
-       spin_unlock(&adapter->req_q.lock);
+       spin_unlock(&adapter->req_q_lock);
        return req;
 }
 
@@ -1043,7 +1044,7 @@ int zfcp_fsf_send_ct(struct zfcp_send_ct *ct, mempool_t *pool,
        struct zfcp_fsf_req *req;
        int ret = -EIO;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;
 
@@ -1085,7 +1086,7 @@ failed_send:
        if (erp_action)
                erp_action->fsf_req = NULL;
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return ret;
 }
 
@@ -1155,7 +1156,7 @@ int zfcp_fsf_send_els(struct zfcp_send_els *els)
                       ZFCP_STATUS_COMMON_UNBLOCKED)))
                return -EBUSY;
 
-       spin_lock(&adapter->req_q.lock);
+       spin_lock(&adapter->req_q_lock);
        if (!zfcp_fsf_sbal_available(adapter))
                goto out;
        req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_ELS,
@@ -1189,7 +1190,7 @@ int zfcp_fsf_send_els(struct zfcp_send_els *els)
 failed_send:
        zfcp_fsf_req_free(req);
 out:
-       spin_unlock(&adapter->req_q.lock);
+       spin_unlock(&adapter->req_q_lock);
        return ret;
 }
 
@@ -1200,7 +1201,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
        struct zfcp_adapter *adapter = erp_action->adapter;
        int retval = -EIO;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (!zfcp_fsf_sbal_available(adapter))
                goto out;
        req = zfcp_fsf_req_create(adapter,
@@ -1232,7 +1233,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
                erp_action->fsf_req = NULL;
        }
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return retval;
 }
 
@@ -1243,7 +1244,7 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *adapter,
        struct zfcp_fsf_req *req = NULL;
        int retval = -EIO;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;
 
@@ -1271,7 +1272,7 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *adapter,
        zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
        retval = zfcp_fsf_req_send(req);
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        if (!retval)
                wait_event(req->completion_wq,
                           req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
@@ -1296,7 +1297,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
        if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
                return -EOPNOTSUPP;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (!zfcp_fsf_sbal_available(adapter))
                goto out;
        req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA,
@@ -1322,7 +1323,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action)
                erp_action->fsf_req = NULL;
        }
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return retval;
 }
 
@@ -1342,7 +1343,7 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter,
        if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT))
                return -EOPNOTSUPP;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (!zfcp_fsf_sbal_available(adapter))
                goto out;
 
@@ -1364,7 +1365,7 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter,
        zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
        retval = zfcp_fsf_req_send(req);
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        if (!retval)
                wait_event(req->completion_wq,
                           req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
@@ -1462,7 +1463,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
        struct zfcp_fsf_req *req;
        int retval = -EIO;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;
 
@@ -1492,7 +1493,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action)
                erp_action->fsf_req = NULL;
        }
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return retval;
 }
 
@@ -1530,7 +1531,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action)
        struct zfcp_fsf_req *req;
        int retval = -EIO;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;
 
@@ -1559,7 +1560,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action)
                erp_action->fsf_req = NULL;
        }
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return retval;
 }
 
@@ -1603,7 +1604,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_wka_port *wka_port)
        struct zfcp_fsf_req *req;
        int retval = -EIO;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;
 
@@ -1629,7 +1630,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_wka_port *wka_port)
        if (retval)
                zfcp_fsf_req_free(req);
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return retval;
 }
 
@@ -1658,7 +1659,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_wka_port *wka_port)
        struct zfcp_fsf_req *req;
        int retval = -EIO;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;
 
@@ -1683,7 +1684,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_wka_port *wka_port)
        if (retval)
                zfcp_fsf_req_free(req);
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return retval;
 }
 
@@ -1750,7 +1751,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
        struct zfcp_fsf_req *req;
        int retval = -EIO;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;
 
@@ -1781,7 +1782,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action)
                erp_action->fsf_req = NULL;
        }
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return retval;
 }
 
@@ -1924,7 +1925,7 @@ int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action)
        struct zfcp_fsf_req *req;
        int retval = -EIO;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;
 
@@ -1957,7 +1958,7 @@ int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action)
                erp_action->fsf_req = NULL;
        }
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return retval;
 }
 
@@ -2010,7 +2011,7 @@ int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action)
        struct zfcp_fsf_req *req;
        int retval = -EIO;
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;
        req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_LUN,
@@ -2039,7 +2040,7 @@ int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action)
                erp_action->fsf_req = NULL;
        }
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
        return retval;
 }
 
@@ -2281,7 +2282,7 @@ int zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter,
                       ZFCP_STATUS_COMMON_UNBLOCKED)))
                return -EBUSY;
 
-       spin_lock(&adapter->req_q.lock);
+       spin_lock(&adapter->req_q_lock);
        if (!zfcp_fsf_sbal_available(adapter))
                goto out;
        req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
@@ -2380,7 +2381,7 @@ failed_scsi_cmnd:
        zfcp_fsf_req_free(req);
        scsi_cmnd->host_scribble = NULL;
 out:
-       spin_unlock(&adapter->req_q.lock);
+       spin_unlock(&adapter->req_q_lock);
        return retval;
 }
 
@@ -2404,7 +2405,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_adapter *adapter,
                       ZFCP_STATUS_COMMON_UNBLOCKED)))
                return NULL;
 
-       spin_lock(&adapter->req_q.lock);
+       spin_lock(&adapter->req_q_lock);
        if (!zfcp_fsf_sbal_available(adapter))
                goto out;
        req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags,
@@ -2437,7 +2438,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_adapter *adapter,
        zfcp_fsf_req_free(req);
        req = NULL;
 out:
-       spin_unlock(&adapter->req_q.lock);
+       spin_unlock(&adapter->req_q_lock);
        return req;
 }
 
@@ -2475,7 +2476,7 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter,
                return ERR_PTR(-EINVAL);
        }
 
-       spin_lock_bh(&adapter->req_q.lock);
+       spin_lock_bh(&adapter->req_q_lock);
        if (zfcp_fsf_req_sbal_get(adapter))
                goto out;
 
@@ -2505,7 +2506,7 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter,
        zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
        retval = zfcp_fsf_req_send(req);
 out:
-       spin_unlock_bh(&adapter->req_q.lock);
+       spin_unlock_bh(&adapter->req_q_lock);
 
        if (!retval) {
                wait_event(req->completion_wq,
index 0dfaa17..3e05080 100644 (file)
@@ -346,7 +346,7 @@ int zfcp_qdio_send(struct zfcp_fsf_req *fsf_req)
        struct qdio_buffer_element *sbale;
 
        /* acknowledgements for transferred buffers */
-       pci_batch = req_q->pci_batch + count;
+       pci_batch = adapter->req_q_pci_batch + count;
        if (unlikely(pci_batch >= ZFCP_QDIO_PCI_INTERVAL)) {
                pci_batch %= ZFCP_QDIO_PCI_INTERVAL;
                pci = first + count - (pci_batch + 1);
@@ -366,7 +366,7 @@ int zfcp_qdio_send(struct zfcp_fsf_req *fsf_req)
        atomic_sub(count, &req_q->count);
        req_q->first += count;
        req_q->first %= QDIO_MAX_BUFFERS_PER_Q;
-       req_q->pci_batch = pci_batch;
+       adapter->req_q_pci_batch = pci_batch;
        return 0;
 }
 
@@ -422,9 +422,9 @@ void zfcp_qdio_close(struct zfcp_adapter *adapter)
 
        /* clear QDIOUP flag, thus do_QDIO is not called during qdio_shutdown */
        req_q = &adapter->req_q;
-       spin_lock_bh(&req_q->lock);
+       spin_lock_bh(&adapter->req_q_lock);
        atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status);
-       spin_unlock_bh(&req_q->lock);
+       spin_unlock_bh(&adapter->req_q_lock);
 
        qdio_shutdown(adapter->ccw_device, QDIO_FLAG_CLEANUP_USING_CLEAR);
 
@@ -437,7 +437,7 @@ void zfcp_qdio_close(struct zfcp_adapter *adapter)
        }
        req_q->first = 0;
        atomic_set(&req_q->count, 0);
-       req_q->pci_batch = 0;
+       adapter->req_q_pci_batch = 0;
        adapter->resp_q.first = 0;
        atomic_set(&adapter->resp_q.count, 0);
 }
@@ -475,7 +475,7 @@ int zfcp_qdio_open(struct zfcp_adapter *adapter)
        /* set index of first avalable SBALS / number of available SBALS */
        adapter->req_q.first = 0;
        atomic_set(&adapter->req_q.count, QDIO_MAX_BUFFERS_PER_Q);
-       adapter->req_q.pci_batch = 0;
+       adapter->req_q_pci_batch = 0;
 
        return 0;
 
index cf6a147..ca8f85f 100644 (file)
@@ -105,13 +105,17 @@ static struct zfcp_unit *zfcp_unit_lookup(struct zfcp_adapter *adapter,
 {
        struct zfcp_port *port;
        struct zfcp_unit *unit;
+       int scsi_lun;
 
        list_for_each_entry(port, &adapter->port_list_head, list) {
                if (!port->rport || (id != port->rport->scsi_target_id))
                        continue;
-               list_for_each_entry(unit, &port->unit_list_head, list)
-                       if (lun == unit->scsi_lun)
+               list_for_each_entry(unit, &port->unit_list_head, list) {
+                       scsi_lun = scsilun_to_int(
+                               (struct scsi_lun *)&unit->fcp_lun);
+                       if (lun == scsi_lun)
                                return unit;
+               }
        }
 
        return NULL;
index 7f7384c..2809d78 100644 (file)
@@ -137,6 +137,7 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
        struct zfcp_port *port;
        u64 wwpn;
        int retval = 0;
+       LIST_HEAD(port_remove_lh);
 
        down(&zfcp_data.config_sema);
        if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_REMOVE) {
@@ -154,7 +155,7 @@ static ssize_t zfcp_sysfs_port_remove_store(struct device *dev,
        if (port && (atomic_read(&port->refcount) == 0)) {
                zfcp_port_get(port);
                atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status);
-               list_move(&port->list, &adapter->port_remove_lh);
+               list_move(&port->list, &port_remove_lh);
        } else
                port = NULL;
        write_unlock_irq(&zfcp_data.config_lock);
@@ -235,6 +236,7 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev,
        struct zfcp_unit *unit;
        u64 fcp_lun;
        int retval = 0;
+       LIST_HEAD(unit_remove_lh);
 
        down(&zfcp_data.config_sema);
        if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_REMOVE) {
@@ -252,7 +254,7 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev,
        if (unit && (atomic_read(&unit->refcount) == 0)) {
                zfcp_unit_get(unit);
                atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
-               list_move(&unit->list, &port->unit_remove_lh);
+               list_move(&unit->list, &unit_remove_lh);
        } else
                unit = NULL;