zfcp updates for 2.6.28
Subsystems (3)
cover zfcp updates for 2.6.28
James,
here is the series of zfcp updates for the 2.6.28 merge window. The patches apply on top of 2.6.27-rc8.
Christof
PATCH 1/13 zfcp: add queue_full sysfs attribute
From: Stefan Raspl <[email protected]>
Adds a new sysfs attribute queue_full for adapters that records the number of incidents where a requests could not be submitted due to insufficient free space on the request queue.
--- drivers/s390/scsi/zfcp_def.h | 1 + drivers/s390/scsi/zfcp_fsf.c | 24 +++++++++++++++++------- drivers/s390/scsi/zfcp_qdio.c | 1 + drivers/s390/scsi/zfcp_sysfs.c | 13 +++++++++++++ 4 files changed, 32 insertions(+), 7 deletions(-)
drivers/s390/scsi/zfcp_def.h +1 -0
@@ -568,6 +568,7 @@ struct zfcp_adapter {struct fsf_qtcb_bottom_port *stats_reset_data;unsigned long stats_reset;struct work_struct scan_work; +atomic_t qdio_outb_full;/* queue full incidents */ };struct zfcp_port {
drivers/s390/scsi/zfcp_qdio.c +1 -0
@@ -282,6 +282,7 @@ static int zfcp_qdio_fill_sbals(struct z addr += length, remaining -= length) { sbale =zfcp_qdio_sbale_next (fsf_req, sbtype);if (!sbale) { +atomic_inc (&fsf_req->adapter->qdio_outb_full);zfcp_qdio_undo_sbals (fsf_req);return -EINVAL ; }
drivers/s390/scsi/zfcp_fsf.c +17 -7
@@ -717,6 +717,14 @@ static int zfcp_fsf_sbal_check(struct zfreturn 0 ; } +static int zfcp_fsf_sbal_available (struct zfcp_adapter *adapter) +{ +unsigned int count =atomic_read (&adapter->req_q.count); +if (!count) +atomic_inc (&adapter->qdio_outb_full); +return count >0 ; +} +static int zfcp_fsf_req_sbal_get (struct zfcp_adapter *adapter) {long ret;
@@ -727,6 +735,8 @@ static int zfcp_fsf_req_sbal_get(struct zfcp_fsf_sbal_check(req_q), 5 * HZ);if (ret >0 )return 0 ; +if (!ret) +atomic_inc (&adapter->qdio_outb_full);spin_lock_bh (&req_q->lock);return -EIO ;
@@ -984,7 +994,7 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_struct zfcp_fsf_req *req =NULL ;spin_lock (&adapter->req_q.lock); -if (!atomic_read (&adapter->req_q.count)) +if (!zfcp_fsf_sbal_available (adapter)) goto out; req =zfcp_fsf_req_create (adapter,FSF_QTCB_ABORT_FCP_CMND , req_flags, adapter->pool.fsf_req_abort);
@@ -1219,7 +1229,7 @@ int zfcp_fsf_send_els(struct zfcp_send_ereturn -EBUSY ;spin_lock (&adapter->req_q.lock); -if (!atomic_read (&adapter->req_q.count)) +if (!zfcp_fsf_sbal_available (adapter)) goto out; req =zfcp_fsf_req_create (adapter,FSF_QTCB_SEND_ELS ,ZFCP_REQ_AUTO_CLEANUP ,NULL );
@@ -1264,7 +1274,7 @@ int zfcp_fsf_exchange_config_data(structint retval = -EIO ;spin_lock_bh (&adapter->req_q.lock); -if (!atomic_read (&adapter->req_q.count)) +if (!zfcp_fsf_sbal_available (adapter)) goto out; req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_CONFIG_DATA,
@@ -1360,7 +1370,7 @@ int zfcp_fsf_exchange_port_data(struct zreturn -EOPNOTSUPP ;spin_lock_bh (&adapter->req_q.lock); -if (!atomic_read (&adapter->req_q.count)) +if (!zfcp_fsf_sbal_available (adapter)) goto out; req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, ZFCP_REQ_AUTO_CLEANUP,
@@ -1406,7 +1416,7 @@ int zfcp_fsf_exchange_port_data_sync(strreturn -EOPNOTSUPP ;spin_lock_bh (&adapter->req_q.lock); -if (!atomic_read (&adapter->req_q.count)) +if (!zfcp_fsf_sbal_available (adapter)) goto out; req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, 0,
@@ -2224,7 +2234,7 @@ int zfcp_fsf_send_fcp_command_task(strucreturn -EBUSY ;spin_lock (&adapter->req_q.lock); -if (!atomic_read (&adapter->req_q.count)) +if (!zfcp_fsf_sbal_available (adapter)) goto out; req =zfcp_fsf_req_create (adapter,FSF_QTCB_FCP_CMND , req_flags, adapter->pool.fsf_req_scsi);
@@ -2347,7 +2357,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_creturn NULL ;spin_lock (&adapter->req_q.lock); -if (!atomic_read (&adapter->req_q.count)) +if (!zfcp_fsf_sbal_available (adapter)) goto out; req =zfcp_fsf_req_create (adapter,FSF_QTCB_FCP_CMND , req_flags, adapter->pool.fsf_req_scsi);
drivers/s390/scsi/zfcp_sysfs.c +13 -0
@@ -487,10 +487,23 @@ ZFCP_SHOST_ATTR(megabytes, "%llu %llu\n"ZFCP_SHOST_ATTR (seconds_active,"%llu\n" , (unsigned long long ) stat_info.seconds_act); +static ssize_t zfcp_sysfs_adapter_q_full_show (struct device *dev, +struct device_attribute *attr, +char *buf) +{ +struct Scsi_Host *scsi_host =class_to_shost (dev); +struct zfcp_adapter *adapter = + (struct zfcp_adapter *) scsi_host->hostdata[0 ]; + +return sprintf (buf,"%d\n" ,atomic_read (&adapter->qdio_outb_full)); +} +static DEVICE_ATTR(queue_full, S_IRUGO, zfcp_sysfs_adapter_q_full_show, NULL); +struct device_attribute *zfcp_sysfs_shost_attrs[] = { &dev_attr_utilization, &dev_attr_requests, &dev_attr_megabytes, &dev_attr_seconds_active, + &dev_attr_queue_full,NULL };
PATCH 2/13 zfcp: Update message with input from review
In reply to Christof SchmittFrom: Christof Schmitt <[email protected]>
Update the kernel messages in zfcp with input from the message review and remove some messages that have been identified as redundant.
drivers/s390/scsi/zfcp_aux.c +4 -4
@@ -100,8 +100,7 @@ static int __init zfcp_device_setup(char err_out:kfree (str); -pr_err ("zfcp: Parse error for device parameter string %s, " -"device not attached.\n" , devstr); +pr_err ("zfcp: %s is not a valid SCSI device\n" , devstr);return 0 ; }
@@ -193,13 +192,14 @@ static int __init zfcp_module_init(void) retval =misc_register (&zfcp_cfdc_misc);if (retval) { -pr_err ("zfcp: registration of misc device zfcp_cfdc failed\n" ); +pr_err ("zfcp: Registering the misc device zfcp_cfdc failed\n" ); goto out_misc; } retval =zfcp_ccw_register ();if (retval) { -pr_err ("zfcp: Registration with common I/O layer failed.\n" ); +pr_err ("zfcp: The zfcp device driver could not register with " +"the common I/O layer\n" ); goto out_ccw_register; }
drivers/s390/scsi/zfcp_ccw.c +8 -4
@@ -25,7 +25,8 @@ static int zfcp_ccw_probe(struct ccw_devdown (&zfcp_data.config_sema);if (zfcp_adapter_enqueue (ccw_device)) {dev_err (&ccw_device->dev, -"Setup of data structures failed.\n" ); +"Setting up data structures for the " +"FCP adapter failed\n" ); retval = -EINVAL ; }up (&zfcp_data.config_sema);
@@ -156,15 +157,18 @@ static int zfcp_ccw_notify(struct ccw_deswitch (event) {case CIO_GONE : -dev_warn (&adapter->ccw_device->dev,"device gone\n" ); +dev_warn (&adapter->ccw_device->dev, +"The FCP device has been detached\n" );zfcp_erp_adapter_shutdown (adapter,0 ,87 ,NULL );break ;case CIO_NO_PATH : -dev_warn (&adapter->ccw_device->dev,"no path\n" ); +dev_warn (&adapter->ccw_device->dev, +"The CHPID for the FCP device is offline\n" );zfcp_erp_adapter_shutdown (adapter,0 ,88 ,NULL );break ;case CIO_OPER : -dev_info (&adapter->ccw_device->dev,"operational again\n" ); +dev_info (&adapter->ccw_device->dev, +"The FCP device is operational again\n" );zfcp_erp_modify_adapter_status (adapter,11 ,NULL ,ZFCP_STATUS_COMMON_RUNNING ,ZFCP_SET );
drivers/s390/scsi/zfcp_erp.c +22 -28
119 lines not on this page · raw message
drivers/s390/scsi/zfcp_fsf.c +80 -153
469 lines not on this page · raw message
drivers/s390/scsi/zfcp_dbf.c +1 -1
@@ -570,7 +570,7 @@ static const char *zfcp_rec_dbf_ids[] = [125] = "need newer zfcp", [126] = "need newer microcode", [127] = "arbitrated loop not supported", - [128] = "unknown topology", + [128] = "", [129] = "qtcb size mismatch", [130] = "unknown fsf status ecd", [131] = "fcp request too big",
drivers/s390/scsi/zfcp_qdio.c +10 -16
@@ -57,7 +57,7 @@ void zfcp_qdio_free(struct zfcp_adapterstatic void zfcp_qdio_handler_error (struct zfcp_adapter *adapter,u8 id) { -dev_warn (&adapter->ccw_device->dev,"QDIO problem occurred.\n" ); +dev_warn (&adapter->ccw_device->dev,"A QDIO problem occurred\n" ); zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
@@ -174,8 +174,8 @@ static void zfcp_qdio_int_resp(struct ccif (unlikely (!(sbale->flags &SBAL_FLAGS_LAST_ENTRY )))dev_warn (&adapter->ccw_device->dev, -"Protocol violation by adapter. " -"Continuing operations.\n" ); +"A QDIO protocol error occurred, " +"operations continue\n" ); }/*
@@ -457,17 +457,11 @@ int zfcp_qdio_open(struct zfcp_adapter *if (atomic_test_mask (ZFCP_STATUS_ADAPTER_QDIOUP , &adapter->status))return -EIO ; -if (qdio_establish (&adapter->qdio_init_data)) { -dev_err (&adapter->ccw_device->dev, -"Establish of QDIO queues failed.\n" ); -return -EIO ; - } +if (qdio_establish (&adapter->qdio_init_data)) + goto failed_establish; -if (qdio_activate (adapter->ccw_device)) { -dev_err (&adapter->ccw_device->dev, -"Activate of QDIO queues failed.\n" ); +if (qdio_activate (adapter->ccw_device)) goto failed_qdio; - }for (cc =0 ; cc <QDIO_MAX_BUFFERS_PER_Q ; cc++) { sbale = &(adapter->resp_q.sbal[cc]->element[0 ]);
@@ -477,11 +471,8 @@ int zfcp_qdio_open(struct zfcp_adapter * }if (do_QDIO (adapter->ccw_device,QDIO_FLAG_SYNC_INPUT ,0 ,0 , -QDIO_MAX_BUFFERS_PER_Q )) { -dev_err (&adapter->ccw_device->dev, -"Init of QDIO response queue failed.\n" ); +QDIO_MAX_BUFFERS_PER_Q )) goto failed_qdio; - }/* set index of first avalable SBALS / number of available SBALS */ adapter->req_q.first =0 ;
@@ -492,5 +483,8 @@ int zfcp_qdio_open(struct zfcp_adapter * failed_qdio:qdio_shutdown (adapter->ccw_device,QDIO_FLAG_CLEANUP_USING_CLEAR ); +failed_establish: +dev_err (&adapter->ccw_device->dev, +"Setting up the QDIO connection to the FCP adapter failed\n" );return -EIO ; }
drivers/s390/scsi/zfcp_scsi.c +2 -1
@@ -294,7 +294,8 @@ int zfcp_adapter_scsi_register(struct zf sizeof (struct zfcp_adapter *));if (!adapter->scsi_host) {dev_err (&adapter->ccw_device->dev, -"registration with SCSI stack failed." ); +"Registering the FCP device with the " +"SCSI stack failed\n" );return -EIO ; }
PATCH 3/13 zfcp: remove unused references, declarations and flags
In reply to Christof SchmittFrom: Swen Schillig <[email protected]>
- Remove unused references and declarations, including one instance of the FC ls_adisc struct that has been defined twice.
- Also remove the flags COMMON_OPENING, COMMON_CLOSING, ADAPTER_REGISTERED and XPORT_OK that are only set and cleared, but not checked anywhere.
- Remove the zfcp specific atomic_test_mask makro. Simply use atomic_read directly instead.
- Remove the zfcp internal sg helper functions and switch the places where it is still used to call sg_virt directly.
- With the update of the QDIO code, the QDIO data structures no longer use the volatile type qualifier. Now we can also remove the volatile qualifiers from the zfcp code.
drivers/s390/scsi/zfcp_ccw.c +3 -3
@@ -67,14 +67,14 @@ static void zfcp_ccw_remove(struct ccw_dlist_for_each_entry_safe (port, p, &adapter->port_remove_lh, list) {list_for_each_entry_safe (unit, u, &port->unit_remove_lh, list) { -if (atomic_test_mask (ZFCP_STATUS_UNIT_REGISTERED , - &unit->status)) +if (atomic_read (&unit->status) & +ZFCP_STATUS_UNIT_REGISTERED )scsi_remove_device (unit->device);zfcp_unit_dequeue (unit); }zfcp_port_dequeue (port); } -zfcp_adapter_wait (adapter); +wait_event (adapter->remove_wq,atomic_read (&adapter->refcount) ==0 );zfcp_adapter_dequeue (adapter);up (&zfcp_data.config_sema);
drivers/s390/scsi/zfcp_def.h +2 -79
169 lines not on this page · raw message
drivers/s390/scsi/zfcp_fc.c +10 -9
@@ -47,10 +47,11 @@ static void _zfcp_fc_incoming_rscn(strucread_lock_irqsave (&zfcp_data.config_lock, flags);list_for_each_entry (port, &fsf_req->adapter->port_list_head, list) { -if (atomic_test_mask (ZFCP_STATUS_PORT_WKA , &port->status)) +if ((atomic_read (&port->status) &ZFCP_STATUS_PORT_WKA ) == +ZFCP_STATUS_PORT_WKA )continue ;/* FIXME: ZFCP_STATUS_PORT_DID_DID check is racy */ -if (!atomic_test_mask (ZFCP_STATUS_PORT_DID_DID , &port->status)) +if (!(atomic_read (&port->status) &ZFCP_STATUS_PORT_DID_DID ))/* Try to connect to unused ports anyway. */ zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED,
@@ -255,14 +256,14 @@ struct zfcp_els_adisc {struct scatterlist req;struct scatterlist resp;struct zfcp_ls_adisc ls_adisc; -struct zfcp_ls_adisc_acc ls_adisc_acc; +struct zfcp_ls_adisc ls_adisc_acc; };static void zfcp_fc_adisc_handler (unsigned long data) {struct zfcp_els_adisc *adisc = (struct zfcp_els_adisc *) data;struct zfcp_port *port = adisc->els.port; -struct zfcp_ls_adisc_acc *ls_adisc = &adisc->ls_adisc_acc; +struct zfcp_ls_adisc *ls_adisc = &adisc->ls_adisc_acc;if (adisc->els.status) {/* request rejected or timed out */
@@ -295,7 +296,7 @@ static int zfcp_fc_adisc(struct zfcp_porsg_init_one (adisc->els.req, &adisc->ls_adisc,sizeof (struct zfcp_ls_adisc ));sg_init_one (adisc->els.resp, &adisc->ls_adisc_acc, -sizeof (struct zfcp_ls_adisc_acc )); +sizeof (struct zfcp_ls_adisc )); adisc->els.req_count =1 ; adisc->els.resp_count =1 ;
@@ -345,16 +346,16 @@ static int zfcp_scan_get_nameserver(struif (!adapter->nameserver_port)return -EINTR ; -if (!atomic_test_mask (ZFCP_STATUS_COMMON_UNBLOCKED , - &adapter->nameserver_port->status)) { +if (!(atomic_read (&adapter->nameserver_port->status) & +ZFCP_STATUS_COMMON_UNBLOCKED )) { ret =zfcp_erp_port_reopen (adapter->nameserver_port,0 ,148 ,NULL );if (ret)return ret;zfcp_erp_wait (adapter); } -return !atomic_test_mask (ZFCP_STATUS_COMMON_UNBLOCKED , - &adapter->nameserver_port->status); +return !(atomic_read (&adapter->nameserver_port->status) & +ZFCP_STATUS_COMMON_UNBLOCKED ); }static void zfcp_gpn_ft_handler (unsigned long _done)
drivers/s390/scsi/zfcp_qdio.c +13 -15
@@ -28,7 +28,7 @@ static int zfcp_qdio_buffers_enqueue(strreturn 0 ; } -static volatile struct qdio_buffer_element * +static struct qdio_buffer_element *zfcp_qdio_sbale (struct zfcp_qdio_queue *q,int sbal_idx,int sbale_idx) {return &q->sbal[sbal_idx]->element[sbale_idx];
@@ -145,7 +145,7 @@ static void zfcp_qdio_int_resp(struct cc {struct zfcp_adapter *adapter = (struct zfcp_adapter *) parm;struct zfcp_qdio_queue *queue = &adapter->resp_q; -volatile struct qdio_buffer_element *sbale; +struct qdio_buffer_element *sbale;int sbal_idx, sbale_idx, sbal_no;if (unlikely (qdio_err)) {
@@ -190,8 +190,7 @@ static void zfcp_qdio_int_resp(struct cc* @fsf_req: pointer to struct fsf_req * Returns: pointer to qdio_buffer_element (SBALE) structure */ -volatile struct qdio_buffer_element * -zfcp_qdio_sbale_req (struct zfcp_fsf_req *req) +struct qdio_buffer_element *zfcp_qdio_sbale_req (struct zfcp_fsf_req *req) {return zfcp_qdio_sbale (&req->adapter->req_q, req->sbal_last,0 ); }
@@ -201,8 +200,7 @@ zfcp_qdio_sbale_req(struct zfcp_fsf_req* @fsf_req: pointer to struct fsf_req * Returns: pointer to qdio_buffer_element (SBALE) structure */ -volatile struct qdio_buffer_element * -zfcp_qdio_sbale_curr (struct zfcp_fsf_req *req) +struct qdio_buffer_element *zfcp_qdio_sbale_curr (struct zfcp_fsf_req *req) {return zfcp_qdio_sbale (&req->adapter->req_q, req->sbal_last, req->sbale_curr);
@@ -216,10 +214,10 @@ static void zfcp_qdio_sbal_limit(struct % QDIO_MAX_BUFFERS_PER_Q; } -static volatile struct qdio_buffer_element * +static struct qdio_buffer_element *zfcp_qdio_sbal_chain (struct zfcp_fsf_req *fsf_req,unsigned long sbtype) { -volatile struct qdio_buffer_element *sbale; +struct qdio_buffer_element *sbale;/* set last entry flag in current SBALE of current SBAL */ sbale =zfcp_qdio_sbale_curr (fsf_req);
@@ -250,7 +248,7 @@ zfcp_qdio_sbal_chain(struct zfcp_fsf_reqreturn sbale; } -static volatile struct qdio_buffer_element * +static struct qdio_buffer_element *zfcp_qdio_sbale_next (struct zfcp_fsf_req *fsf_req,unsigned long sbtype) {if (fsf_req->sbale_curr ==ZFCP_LAST_SBALE_PER_SBAL )
@@ -273,7 +271,7 @@ static int zfcp_qdio_fill_sbals(struct z unsigned int sbtype, void *start_addr, unsigned int total_length) { - volatile struct qdio_buffer_element *sbale; + struct qdio_buffer_element *sbale;unsigned long remaining, length;void *addr;
@@ -308,7 +306,7 @@ static int zfcp_qdio_fill_sbals(struct zint zfcp_qdio_sbals_from_sg (struct zfcp_fsf_req *fsf_req,unsigned long sbtype,struct scatterlist *sg,int max_sbals) { -volatile struct qdio_buffer_element *sbale; +struct qdio_buffer_element *sbale;int retval, bytes =0 ;/* figure out last allowed SBAL */
@@ -345,7 +343,7 @@ int zfcp_qdio_send(struct zfcp_fsf_req *int first = fsf_req->sbal_first;int count = fsf_req->sbal_number;int retval, pci, pci_batch; -volatile struct qdio_buffer_element *sbale; +struct qdio_buffer_element *sbale;/* acknowledgements for transferred buffers */ pci_batch = req_q->pci_batch + count;
@@ -419,7 +417,7 @@ void zfcp_qdio_close(struct zfcp_adapterstruct zfcp_qdio_queue *req_q;int first, count; -if (!atomic_test_mask (ZFCP_STATUS_ADAPTER_QDIOUP , &adapter->status)) +if (!(atomic_read (&adapter->status) &ZFCP_STATUS_ADAPTER_QDIOUP ))return ;/* clear QDIOUP flag, thus do_QDIO is not called during qdio_shutdown */
@@ -451,10 +449,10 @@ void zfcp_qdio_close(struct zfcp_adapter*/ int zfcp_qdio_open (struct zfcp_adapter *adapter) { -volatile struct qdio_buffer_element *sbale; +struct qdio_buffer_element *sbale;int cc; -if (atomic_test_mask (ZFCP_STATUS_ADAPTER_QDIOUP , &adapter->status)) +if (atomic_read (&adapter->status) &ZFCP_STATUS_ADAPTER_QDIOUP )return -EIO ;if (qdio_establish (&adapter->qdio_init_data))
drivers/s390/scsi/zfcp_erp.c +3 -14
@@ -669,8 +669,6 @@ static int zfcp_erp_adapter_strategy_opeint ret;struct zfcp_adapter *adapter = act->adapter; -atomic_clear_mask (ZFCP_STATUS_ADAPTER_XPORT_OK , &adapter->status); -write_lock_irq (&adapter->erp_lock);zfcp_erp_action_to_running (act);write_unlock_irq (&adapter->erp_lock);
@@ -741,8 +739,7 @@ static int zfcp_erp_adapter_strategy_gen ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR); failed_qdio:atomic_clear_mask (ZFCP_STATUS_ADAPTER_XCONFIG_OK | -ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED | -ZFCP_STATUS_ADAPTER_XPORT_OK , +ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED , &act->adapter->status);return retval; }
@@ -751,15 +748,11 @@ static int zfcp_erp_adapter_strategy(str {int retval; -atomic_set_mask (ZFCP_STATUS_COMMON_CLOSING , &act->adapter->status);zfcp_erp_adapter_strategy_generic (act,1 );/* close */ -atomic_clear_mask (ZFCP_STATUS_COMMON_CLOSING , &act->adapter->status);if (act->status &ZFCP_STATUS_ERP_CLOSE_ONLY )return ZFCP_ERP_EXIT ; -atomic_set_mask (ZFCP_STATUS_COMMON_OPENING , &act->adapter->status); retval =zfcp_erp_adapter_strategy_generic (act,0 );/* open */ -atomic_clear_mask (ZFCP_STATUS_COMMON_OPENING , &act->adapter->status);if (retval ==ZFCP_ERP_FAILED )ssleep (8 );
@@ -783,9 +776,7 @@ static int zfcp_erp_port_forced_strategystatic void zfcp_erp_port_strategy_clearstati (struct zfcp_port *port) { - atomic_clear_mask(ZFCP_STATUS_COMMON_OPENING | - ZFCP_STATUS_COMMON_CLOSING | - ZFCP_STATUS_COMMON_ACCESS_DENIED | + atomic_clear_mask(ZFCP_STATUS_COMMON_ACCESS_DENIED | ZFCP_STATUS_PORT_DID_DID | ZFCP_STATUS_PORT_PHYS_CLOSING | ZFCP_STATUS_PORT_INVALID_WWPN,
@@ -998,9 +989,7 @@ static int zfcp_erp_port_strategy(structstatic void zfcp_erp_unit_strategy_clearstati (struct zfcp_unit *unit) { -atomic_clear_mask (ZFCP_STATUS_COMMON_OPENING | -ZFCP_STATUS_COMMON_CLOSING | -ZFCP_STATUS_COMMON_ACCESS_DENIED | +atomic_clear_mask (ZFCP_STATUS_COMMON_ACCESS_DENIED |ZFCP_STATUS_UNIT_SHARED |ZFCP_STATUS_UNIT_READONLY , &unit->status);
drivers/s390/scsi/zfcp_fsf.c +20 -39
236 lines not on this page · raw message
drivers/s390/scsi/zfcp_scsi.c +0 -3
@@ -183,7 +183,6 @@ static int zfcp_scsi_eh_abort_handler(streturn retval; } fsf_req->data =NULL ; - fsf_req->status |=ZFCP_STATUS_FSFREQ_ABORTING ;/* don't access old fsf_req after releasing the abort_lock */ write_unlock_irqrestore (&adapter->abort_lock, flags);
@@ -313,7 +312,6 @@ int zfcp_adapter_scsi_register(struct zfscsi_host_put (adapter->scsi_host);return -EIO ; } -atomic_set_mask (ZFCP_STATUS_ADAPTER_REGISTERED , &adapter->status);return 0 ; }
@@ -337,7 +335,6 @@ void zfcp_adapter_scsi_unregister(structscsi_remove_host (shost);scsi_host_put (shost); adapter->scsi_host =NULL ; -atomic_clear_mask (ZFCP_STATUS_ADAPTER_REGISTERED , &adapter->status);return ; }
drivers/s390/scsi/zfcp_aux.c +2 -2
@@ -351,7 +351,7 @@ err_out_free:*/ void zfcp_unit_dequeue (struct zfcp_unit *unit) { -zfcp_unit_wait (unit); +wait_event (unit->remove_wq,atomic_read (&unit->refcount) ==0 );write_lock_irq (&zfcp_data.config_lock);list_del (&unit->list);write_unlock_irq (&zfcp_data.config_lock);
@@ -740,7 +740,7 @@ err_out:*/ void zfcp_port_dequeue (struct zfcp_port *port) { -zfcp_port_wait (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--;
drivers/s390/scsi/zfcp_fsf.h +0 -75
147 lines not on this page · raw message
drivers/s390/scsi/zfcp_dbf.c +5 -6
@@ -831,7 +831,7 @@ void zfcp_san_dbf_event_ct_request(strucstruct zfcp_send_ct *ct = (struct zfcp_send_ct *)fsf_req->data;struct zfcp_port *port = ct->port;struct zfcp_adapter *adapter = port->adapter; -struct ct_hdr *hdr =zfcp_sg_to_address (ct->req); +struct ct_hdr *hdr =sg_virt (ct->req);struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf;struct zfcp_san_dbf_record_ct_request *oct = &r->u.ct_req;unsigned long flags;
@@ -865,7 +865,7 @@ void zfcp_san_dbf_event_ct_response(strustruct zfcp_send_ct *ct = (struct zfcp_send_ct *)fsf_req->data;struct zfcp_port *port = ct->port;struct zfcp_adapter *adapter = port->adapter; -struct ct_hdr *hdr =zfcp_sg_to_address (ct->resp); +struct ct_hdr *hdr =sg_virt (ct->resp);struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf;struct zfcp_san_dbf_record_ct_response *rct = &r->u.ct_resp;unsigned long flags;
@@ -922,8 +922,8 @@ void zfcp_san_dbf_event_els_request(struzfcp_san_dbf_event_els ("oels" ,2 , fsf_req,fc_host_port_id (els->adapter->scsi_host), - els->d_id, *(u8 *)zfcp_sg_to_address (els->req), -zfcp_sg_to_address (els->req), els->req->length); + els->d_id, *(u8 *)sg_virt (els->req), +sg_virt (els->req), els->req->length); }/**
@@ -936,8 +936,7 @@ void zfcp_san_dbf_event_els_response(strzfcp_san_dbf_event_els ("rels" ,2 , fsf_req, els->d_id,fc_host_port_id (els->adapter->scsi_host), - *(u8 *)zfcp_sg_to_address (els->req), -zfcp_sg_to_address (els->resp), + *(u8 *)sg_virt (els->req),sg_virt (els->resp), els->resp->length); }
drivers/s390/scsi/zfcp_ext.h +2 -4
@@ -135,10 +135,8 @@ extern struct zfcp_fsf_req *zfcp_fsf_aboextern int zfcp_qdio_allocate (struct zfcp_adapter *);extern void zfcp_qdio_free (struct zfcp_adapter *);extern int zfcp_qdio_send (struct zfcp_fsf_req *); -extern volatile struct qdio_buffer_element *zfcp_qdio_sbale_req ( -struct zfcp_fsf_req *); -extern volatile struct qdio_buffer_element *zfcp_qdio_sbale_curr ( -struct zfcp_fsf_req *); +extern struct qdio_buffer_element *zfcp_qdio_sbale_req (struct zfcp_fsf_req *); +extern struct qdio_buffer_element *zfcp_qdio_sbale_curr (struct zfcp_fsf_req *);extern int zfcp_qdio_sbals_from_sg (struct zfcp_fsf_req *,unsigned long ,struct scatterlist *,int );extern int zfcp_qdio_open (struct zfcp_adapter *);
PATCH 4/13 zfcp: attach and release SAN nameserver port on demand
In reply to Christof SchmittFrom: Swen Schillig <[email protected]>
Changing the zfcp behaviour from always having the nameserver port open to an on-demand strategy. This strategy reduces the use of limited resources like port connections. The patch provides a common infrastructure which could be used for all WKA ports in future.
Also reduce the number of nameserver lookups by changing the zfcp behaviour of always querying the nameserver for the corresponding destination ID of the remote port. If the destination ID has changed during the reopen process we will be informed and then trigger a nameserver query on demand.
--- drivers/s390/scsi/zfcp_aux.c | 65 +----------- drivers/s390/scsi/zfcp_dbf.c | 14 +- drivers/s390/scsi/zfcp_def.h | 31 ++++- drivers/s390/scsi/zfcp_erp.c | 149 +++++++--------------------- drivers/s390/scsi/zfcp_ext.h | 7 - drivers/s390/scsi/zfcp_fc.c | 215 ++++++++++++++++++++++++++++------------- drivers/s390/scsi/zfcp_fsf.c | 137 ++++++++++++++++++++++++-- drivers/s390/scsi/zfcp_sysfs.c | 19 --- 8 files changed, 362 insertions(+), 275 deletions(-)
drivers/s390/scsi/zfcp_aux.c +7 -58
@@ -450,19 +450,6 @@ static void _zfcp_status_read_scheduler( stat_work)); } -static int zfcp_nameserver_enqueue (struct zfcp_adapter *adapter) -{ -struct zfcp_port *port; - - port =zfcp_port_enqueue (adapter,0 ,ZFCP_STATUS_PORT_WKA , -ZFCP_DID_DIRECTORY_SERVICE ); -if (IS_ERR (port)) -return PTR_ERR (port); -zfcp_port_put (port); - -return 0 ; -} -/** * zfcp_adapter_enqueue - enqueue a new adapter to the list * @ccw_device: pointer to the struct cc_device
@@ -552,7 +539,7 @@ int zfcp_adapter_enqueue(struct ccw_devi zfcp_data.adapters++; -zfcp_nameserver_enqueue (adapter); +zfcp_fc_nameserver_init (adapter);return 0 ;
@@ -638,7 +625,6 @@ struct zfcp_port *zfcp_port_enqueue(stru {struct zfcp_port *port;int retval; -char *bus_id; port =kzalloc (sizeof (struct zfcp_port ),GFP_KERNEL );if (!port)
@@ -648,6 +634,7 @@ struct zfcp_port *zfcp_port_enqueue(struINIT_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; port->d_id = d_id;
@@ -657,34 +644,8 @@ struct zfcp_port *zfcp_port_enqueue(struatomic_set_mask (status |ZFCP_STATUS_COMMON_REMOVE , &port->status);atomic_set (&port->refcount,0 ); -if (status &ZFCP_STATUS_PORT_WKA ) { -switch (d_id) { -case ZFCP_DID_DIRECTORY_SERVICE : - bus_id ="directory" ; -break ; -case ZFCP_DID_MANAGEMENT_SERVICE : - bus_id ="management" ; -break ; -case ZFCP_DID_KEY_DISTRIBUTION_SERVICE : - bus_id ="key_distribution" ; -break ; -case ZFCP_DID_ALIAS_SERVICE : - bus_id ="alias" ; -break ; -case ZFCP_DID_TIME_SERVICE : - bus_id ="time" ; -break ; -default : -kfree (port); -return ERR_PTR (-EINVAL ); - } -snprintf (port->sysfs_device.bus_id,BUS_ID_SIZE ,"%s" , bus_id); - port->sysfs_device.parent = &adapter->generic_services; - }else { -snprintf (port->sysfs_device.bus_id, -BUS_ID_SIZE ,"0x%016llx" , wwpn); - port->sysfs_device.parent = &adapter->ccw_device->dev; - } +snprintf (port->sysfs_device.bus_id,BUS_ID_SIZE ,"0x%016llx" , wwpn); + port->sysfs_device.parent = &adapter->ccw_device->dev; port->sysfs_device.release = zfcp_sysfs_port_release;dev_set_drvdata (&port->sysfs_device, port);
@@ -700,12 +661,8 @@ struct zfcp_port *zfcp_port_enqueue(struif (device_register (&port->sysfs_device)) goto err_out_free; -if (status &ZFCP_STATUS_PORT_WKA ) - retval =sysfs_create_group (&port->sysfs_device.kobj, - &zfcp_sysfs_ns_port_attrs); -else - retval =sysfs_create_group (&port->sysfs_device.kobj, - &zfcp_sysfs_port_attrs); + retval =sysfs_create_group (&port->sysfs_device.kobj, + &zfcp_sysfs_port_attrs);if (retval) {device_unregister (&port->sysfs_device);
@@ -718,9 +675,6 @@ struct zfcp_port *zfcp_port_enqueue(strulist_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); -if (d_id ==ZFCP_DID_DIRECTORY_SERVICE ) -if (!adapter->nameserver_port) - adapter->nameserver_port = port; adapter->ports++;write_unlock_irq (&zfcp_data.config_lock);
@@ -749,12 +703,7 @@ void zfcp_port_dequeue(struct zfcp_portfc_remote_port_delete (port->rport); port->rport =NULL ;zfcp_adapter_put (port->adapter); -if (atomic_read (&port->status) &ZFCP_STATUS_PORT_WKA ) -sysfs_remove_group (&port->sysfs_device.kobj, - &zfcp_sysfs_ns_port_attrs); -else -sysfs_remove_group (&port->sysfs_device.kobj, - &zfcp_sysfs_port_attrs); +sysfs_remove_group (&port->sysfs_device.kobj, &zfcp_sysfs_port_attrs);device_unregister (&port->sysfs_device); }
drivers/s390/scsi/zfcp_def.h +23 -8
@@ -253,6 +253,7 @@ struct zfcp_ls_adisc {#define ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED 0x00000200/* FC-PH/FC-GS well-known address identifiers for generic services */ +#define ZFCP_DID_WKA 0xFFFFF0#define ZFCP_DID_MANAGEMENT_SERVICE 0xFFFFFA#define ZFCP_DID_TIME_SERVICE 0xFFFFFB#define ZFCP_DID_DIRECTORY_SERVICE 0xFFFFFC
@@ -264,13 +265,15 @@ struct zfcp_ls_adisc {#define ZFCP_STATUS_PORT_DID_DID 0x00000002#define ZFCP_STATUS_PORT_PHYS_CLOSING 0x00000004#define ZFCP_STATUS_PORT_NO_WWPN 0x00000008 -#define ZFCP_STATUS_PORT_NO_SCSI_ID 0x00000010#define ZFCP_STATUS_PORT_INVALID_WWPN 0x00000020 -/* for ports with well known addresses */ -#define ZFCP_STATUS_PORT_WKA \ - (ZFCP_STATUS_PORT_NO_WWPN | \ - ZFCP_STATUS_PORT_NO_SCSI_ID) +/* well known address (WKA) port status*/ +enum zfcp_wka_status { +ZFCP_WKA_PORT_OFFLINE , +ZFCP_WKA_PORT_CLOSING , +ZFCP_WKA_PORT_OPENING , +ZFCP_WKA_PORT_ONLINE , +};/* logical unit status */ #define ZFCP_STATUS_UNIT_SHARED 0x00000004
@@ -340,7 +343,7 @@ typedef void (*zfcp_send_ct_handler_t)(u/** * struct zfcp_send_ct - used to pass parameters to function zfcp_fsf_send_ct -* @port: port where the request is sent to +* @wka_port: port where the request is sent to * @req: scatter-gather list for request * @resp: scatter-gather list for response * @req_count: number of elements in request scatter-gather list
@@ -352,7 +355,7 @@ typedef void (*zfcp_send_ct_handler_t)(u* @status: used to pass error status to calling function */ struct zfcp_send_ct { -struct zfcp_port *port; +struct zfcp_wka_port *wka_port;struct scatterlist *req;struct scatterlist *resp;unsigned int req_count;
@@ -406,6 +409,17 @@ struct zfcp_send_els {int status; }; +struct zfcp_wka_port { +struct zfcp_adapter *adapter; +wait_queue_head_t completion_wq; +enum zfcp_wka_status status; +atomic_t refcount; +u32 d_id; +u32 handle; +struct mutex mutex; +struct delayed_work work; +}; +struct zfcp_qdio_queue {struct qdio_buffer *sbal[QDIO_MAX_BUFFERS_PER_Q ];/* SBALs */ u8 first;/* index of next free bfr
@@ -496,7 +510,7 @@ struct zfcp_adapter {actions */ u32 erp_low_mem_count;/* nr of erp actions waiting for memory */ -struct zfcp_port *nameserver_port;/* adapter's nameserver */ +struct zfcp_wka_port nsp;/* adapter's nameserver */ debug_info_t *rec_dbf;debug_info_t *hba_dbf;debug_info_t *san_dbf;/* debug feature areas */
@@ -540,6 +554,7 @@ struct zfcp_port {atomic_t erp_counter;u32 maxframe_size;u32 supported_classes; +struct work_struct gid_pn_work; };struct zfcp_unit {
drivers/s390/scsi/zfcp_ext.h +5 -2
@@ -91,17 +91,21 @@ extern void zfcp_erp_port_access_denied(extern void zfcp_erp_unit_access_denied (struct zfcp_unit *,u8 ,void *);extern void zfcp_erp_adapter_access_changed (struct zfcp_adapter *,u8 ,void *);extern void zfcp_erp_timeout_handler (unsigned long ); +extern void zfcp_erp_port_strategy_open_lookup (struct work_struct *);/* zfcp_fc.c */ extern int zfcp_scan_ports (struct zfcp_adapter *);extern void _zfcp_scan_ports_later (struct work_struct *);extern void zfcp_fc_incoming_els (struct zfcp_fsf_req *); -extern int zfcp_fc_ns_gid_pn_request (struct zfcp_erp_action *); +extern int zfcp_fc_ns_gid_pn (struct zfcp_erp_action *);extern void zfcp_fc_plogi_evaluate (struct zfcp_port *,struct fsf_plogi *);extern void zfcp_test_link (struct zfcp_port *); +extern void zfcp_fc_nameserver_init (struct zfcp_adapter *);/* zfcp_fsf.c */ extern int zfcp_fsf_open_port (struct zfcp_erp_action *); +extern int zfcp_fsf_open_wka_port (struct zfcp_wka_port *); +extern int zfcp_fsf_close_wka_port (struct zfcp_wka_port *);extern int zfcp_fsf_close_port (struct zfcp_erp_action *);extern int zfcp_fsf_close_physical_port (struct zfcp_erp_action *);extern int zfcp_fsf_open_unit (struct zfcp_erp_action *);
@@ -153,7 +157,6 @@ extern struct fc_function_template zfcp_/* zfcp_sysfs.c */ extern struct attribute_group zfcp_sysfs_unit_attrs;extern struct attribute_group zfcp_sysfs_adapter_attrs; -extern struct attribute_group zfcp_sysfs_ns_port_attrs;extern struct attribute_group zfcp_sysfs_port_attrs;extern struct device_attribute *zfcp_sysfs_sdev_attrs[];extern struct device_attribute *zfcp_sysfs_shost_attrs[];
drivers/s390/scsi/zfcp_fc.c +151 -64
323 lines not on this page · raw message
drivers/s390/scsi/zfcp_erp.c +40 -109
232 lines not on this page · raw message
drivers/s390/scsi/zfcp_fsf.c +127 -10
181 lines not on this page · raw message
drivers/s390/scsi/zfcp_dbf.c +7 -7
@@ -519,7 +519,7 @@ static const char *zfcp_rec_dbf_ids[] = [75] = "physical port recovery escalation after failed port " "recovery", [76] = "port recovery escalation after failed unit recovery", - [77] = "recovery opening nameserver port", + [77] = "", [78] = "duplicate request id", [79] = "link down", [80] = "exclusive read-only unit access unsupported",
@@ -829,8 +829,8 @@ void zfcp_rec_dbf_event_action(u8 id2, svoid zfcp_san_dbf_event_ct_request (struct zfcp_fsf_req *fsf_req) {struct zfcp_send_ct *ct = (struct zfcp_send_ct *)fsf_req->data; -struct zfcp_port *port = ct->port; -struct zfcp_adapter *adapter = port->adapter; +struct zfcp_wka_port *wka_port = ct->wka_port; +struct zfcp_adapter *adapter = wka_port->adapter;struct ct_hdr *hdr =sg_virt (ct->req);struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf;struct zfcp_san_dbf_record_ct_request *oct = &r->u.ct_req;
@@ -842,7 +842,7 @@ void zfcp_san_dbf_event_ct_request(struc r->fsf_reqid = (unsigned long )fsf_req; r->fsf_seqno = fsf_req->seq_no; r->s_id =fc_host_port_id (adapter->scsi_host); - r->d_id = port->d_id; + r->d_id = wka_port->d_id; oct->cmd_req_code = hdr->cmd_rsp_code; oct->revision = hdr->revision; oct->gs_type = hdr->gs_type;
@@ -863,8 +863,8 @@ void zfcp_san_dbf_event_ct_request(strucvoid zfcp_san_dbf_event_ct_response (struct zfcp_fsf_req *fsf_req) {struct zfcp_send_ct *ct = (struct zfcp_send_ct *)fsf_req->data; -struct zfcp_port *port = ct->port; -struct zfcp_adapter *adapter = port->adapter; +struct zfcp_wka_port *wka_port = ct->wka_port; +struct zfcp_adapter *adapter = wka_port->adapter;struct ct_hdr *hdr =sg_virt (ct->resp);struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf;struct zfcp_san_dbf_record_ct_response *rct = &r->u.ct_resp;
@@ -875,7 +875,7 @@ void zfcp_san_dbf_event_ct_response(strustrncpy (r->tag,"rctc" ,ZFCP_DBF_TAG_SIZE ); r->fsf_reqid = (unsigned long )fsf_req; r->fsf_seqno = fsf_req->seq_no; - r->s_id = port->d_id; + r->s_id = wka_port->d_id; r->d_id =fc_host_port_id (adapter->scsi_host); rct->cmd_rsp_code = hdr->cmd_rsp_code; rct->revision = hdr->revision;
drivers/s390/scsi/zfcp_sysfs.c +2 -17
@@ -273,22 +273,7 @@ out: } static DEVICE_ATTR(unit_remove, S_IWUSR, NULL, zfcp_sysfs_unit_remove_store); -static struct attribute *zfcp_port_ns_attrs[] = { - &dev_attr_port_failed.attr, - &dev_attr_port_in_recovery.attr, - &dev_attr_port_status.attr, - &dev_attr_port_access_denied.attr, -NULL -}; - -/** -* zfcp_sysfs_ns_port_attrs - sysfs attributes for nameserver -*/ -struct attribute_group zfcp_sysfs_ns_port_attrs = { - .attrs = zfcp_port_ns_attrs, -}; - -static struct attribute *zfcp_port_no_ns_attrs[] = { +static struct attribute *zfcp_port_attrs[] = { &dev_attr_unit_add.attr, &dev_attr_unit_remove.attr, &dev_attr_port_failed.attr,
@@ -302,7 +287,7 @@ static struct attribute *zfcp_port_no_ns* zfcp_sysfs_port_attrs - sysfs attributes for all other ports */ struct attribute_group zfcp_sysfs_port_attrs = { - .attrs = zfcp_port_no_ns_attrs, + .attrs = zfcp_port_attrs, };static struct attribute *zfcp_unit_attrs[] = {
PATCH 5/13 zfcp: remove all typedefs and replace them with standards
In reply to Christof SchmittFrom: Swen Schillig <[email protected]>
Remove typedefs from zfcp, use already existing types instead.
--- drivers/s390/scsi/zfcp_aux.c | 21 +++++++++------- drivers/s390/scsi/zfcp_def.h | 39 +++++++++++------------------- drivers/s390/scsi/zfcp_erp.c | 10 ++++--- drivers/s390/scsi/zfcp_ext.h | 11 +++----- drivers/s390/scsi/zfcp_fc.c | 2 - drivers/s390/scsi/zfcp_fsf.c | 53 +++++++++++++++++++++++++++++------------ drivers/s390/scsi/zfcp_scsi.c | 14 ---------- drivers/s390/scsi/zfcp_sysfs.c | 22 +++++++++-------- 8 files changed, 88 insertions(+), 84 deletions(-)
drivers/s390/scsi/zfcp_aux.c +12 -9
@@ -88,11 +88,13 @@ static int __init zfcp_device_setup(charstrncpy (zfcp_data.init_busid, token,BUS_ID_SIZE ); token =strsep (&str,"," ); -if (!token ||strict_strtoull (token,0 , &zfcp_data.init_wwpn)) +if (!token ||strict_strtoull (token,0 , + (unsigned long long *) &zfcp_data.init_wwpn)) goto err_out; token =strsep (&str,"," ); -if (!token ||strict_strtoull (token,0 , &zfcp_data.init_fcp_lun)) +if (!token ||strict_strtoull (token,0 , + (unsigned long long *) &zfcp_data.init_fcp_lun)) goto err_out;kfree (str);
@@ -231,8 +233,7 @@ module_init(zfcp_module_init);* * Returns: pointer to zfcp_unit or NULL */ -struct zfcp_unit *zfcp_get_unit_by_lun (struct zfcp_port *port, -fcp_lun_t fcp_lun) +struct zfcp_unit *zfcp_get_unit_by_lun (struct zfcp_port *port,u64 fcp_lun) {struct zfcp_unit *unit;
@@ -251,7 +252,7 @@ struct zfcp_unit *zfcp_get_unit_by_lun(s* Returns: pointer to zfcp_port or NULL */ struct zfcp_port *zfcp_get_port_by_wwpn (struct zfcp_adapter *adapter, -wwn_t wwpn) +u64 wwpn) {struct zfcp_port *port;
@@ -276,7 +277,7 @@ static void zfcp_sysfs_unit_release(stru* * Sets up some unit internal structures and creates sysfs entry. */ -struct zfcp_unit *zfcp_unit_enqueue (struct zfcp_port *port,fcp_lun_t fcp_lun) +struct zfcp_unit *zfcp_unit_enqueue (struct zfcp_port *port,u64 fcp_lun) {struct zfcp_unit *unit;
@@ -290,7 +291,8 @@ struct zfcp_unit *zfcp_unit_enqueue(stru unit->port = port; unit->fcp_lun = fcp_lun; -snprintf (unit->sysfs_device.bus_id,BUS_ID_SIZE ,"0x%016llx" , fcp_lun); +snprintf (unit->sysfs_device.bus_id,BUS_ID_SIZE ,"0x%016llx" , + (unsigned long long ) fcp_lun); unit->sysfs_device.parent = &port->sysfs_device; unit->sysfs_device.release = zfcp_sysfs_unit_release;dev_set_drvdata (&unit->sysfs_device, unit);
@@ -620,7 +622,7 @@ static void zfcp_sysfs_port_release(stru* d_id is used to enqueue ports with a well known address like the Directory * Service for nameserver lookup. */ -struct zfcp_port *zfcp_port_enqueue (struct zfcp_adapter *adapter,wwn_t wwpn, +struct zfcp_port *zfcp_port_enqueue (struct zfcp_adapter *adapter,u64 wwpn,u32 status,u32 d_id) {struct zfcp_port *port;
@@ -644,7 +646,8 @@ struct zfcp_port *zfcp_port_enqueue(struatomic_set_mask (status |ZFCP_STATUS_COMMON_REMOVE , &port->status);atomic_set (&port->refcount,0 ); -snprintf (port->sysfs_device.bus_id,BUS_ID_SIZE ,"0x%016llx" , wwpn); +snprintf (port->sysfs_device.bus_id,BUS_ID_SIZE ,"0x%016llx" , + (unsigned long long ) wwpn); port->sysfs_device.parent = &adapter->ccw_device->dev; port->sysfs_device.release = zfcp_sysfs_port_release;
drivers/s390/scsi/zfcp_def.h +15 -24
@@ -78,11 +78,6 @@/*************** FIBRE CHANNEL PROTOCOL SPECIFIC DEFINES ********************/ -typedef unsigned long long wwn_t ; -typedef unsigned long long fcp_lun_t ; -/* data length field may be at variable position in FCP-2 FCP_CMND IU */ -typedef unsigned int fcp_dl_t ; -/* timeout for name-server lookup (in seconds) */ #define ZFCP_NS_GID_PN_TIMEOUT 10
@@ -106,7 +101,7 @@ typedef unsigned int fcp_dl_t;/* FCP(-2) FCP_CMND IU */ struct fcp_cmnd_iu { -fcp_lun_t fcp_lun;/* FCP logical unit number */ +u64 fcp_lun;/* FCP logical unit number */ u8 crn;/* command reference number */ u8 reserved0:5 ;/* reserved */ u8 task_attribute:3 ;/* task attribute */
@@ -181,7 +176,7 @@ struct fcp_rscn_element {struct fcp_logo {u32 command;u32 nport_did; -wwn_t nport_wwpn; +u64 nport_wwpn; } __attribute__((packed));/*
@@ -330,7 +325,7 @@ struct ct_hdr {* a port name is required */ struct ct_iu_gid_pn_req {struct ct_hdr header; -wwn_t wwpn; +u64 wwpn; } __attribute__ ((packed));/* FS_ACC IU and data unit for GID_PN nameserver request */
@@ -339,8 +334,6 @@ struct ct_iu_gid_pn_resp {u32 d_id; } __attribute__ ((packed)); -typedef void (*zfcp_send_ct_handler_t )(unsigned long ); -/** * struct zfcp_send_ct - used to pass parameters to function zfcp_fsf_send_ct * @wka_port: port where the request is sent to
@@ -360,7 +353,7 @@ struct zfcp_send_ct {struct scatterlist *resp;unsigned int req_count;unsigned int resp_count; -zfcp_send_ct_handler_t handler; +void (*handler)(unsigned long );unsigned long handler_data;int timeout;struct completion *completion;
@@ -377,8 +370,6 @@ struct zfcp_gid_pn_data {struct zfcp_port *port; }; -typedef void (*zfcp_send_els_handler_t )(unsigned long ); -/** * struct zfcp_send_els - used to pass parameters to function zfcp_fsf_send_els * @adapter: adapter where request is sent from
@@ -402,7 +393,7 @@ struct zfcp_send_els {struct scatterlist *resp;unsigned int req_count;unsigned int resp_count; -zfcp_send_els_handler_t handler; +void (*handler)(unsigned long );unsigned long handler_data;struct completion *completion;int ls_code;
@@ -468,8 +459,8 @@ struct zfcp_adapter {atomic_t refcount;/* reference count */ wait_queue_head_t remove_wq;/* can be used to wait for refcount drop to zero */ -wwn_t peer_wwnn;/* P2P peer WWNN */ -wwn_t peer_wwpn;/* P2P peer WWPN */ +u64 peer_wwnn;/* P2P peer WWNN */ +u64 peer_wwpn;/* P2P peer WWPN */ u32 peer_d_id;/* P2P peer D_ID */ struct ccw_device *ccw_device;/* S/390 ccw device */ u32 hydra_version;/* Hydra version */
@@ -546,8 +537,8 @@ struct zfcp_port {list */ u32 units;/* # of logical units in list */ atomic_t status;/* status of this remote port */ -wwn_t wwnn;/* WWNN if known */ -wwn_t wwpn;/* WWPN */ +u64 wwnn;/* WWNN if known */ +u64 wwpn;/* WWPN */ u32 d_id;/* D_ID */ u32 handle;/* handle assigned by FSF */ struct zfcp_erp_action erp_action;/* pending error recovery */
@@ -566,7 +557,7 @@ struct zfcp_unit {struct zfcp_port *port;/* remote port of unit */ atomic_t status;/* status of this logical unit */ unsigned int scsi_lun;/* own SCSI LUN */ -fcp_lun_t fcp_lun;/* own FCP_LUN */ +u64 fcp_lun;/* own FCP_LUN */ u32 handle;/* handle assigned by FSF */ struct scsi_device *device;/* scsi device struct pointer */ struct zfcp_erp_action erp_action;/* pending error recovery */
@@ -620,11 +611,11 @@ struct zfcp_data {changes */ atomic_t loglevel;/* current loglevel */ char init_busid[BUS_ID_SIZE ]; -wwn_t init_wwpn; -fcp_lun_t init_fcp_lun; -struct kmem_cache *fsf_req_qtcb_cache; -struct kmem_cache *sr_buffer_cache; -struct kmem_cache *gid_pn_cache; +u64 init_wwpn; +u64 init_fcp_lun; +struct kmem_cache *fsf_req_qtcb_cache; +struct kmem_cache *sr_buffer_cache; +struct kmem_cache *gid_pn_cache; };/* struct used by memory pools for fsf_requests */
drivers/s390/scsi/zfcp_ext.h +4 -7
@@ -12,16 +12,14 @@#include "zfcp_def.h" /* zfcp_aux.c */ -extern struct zfcp_unit *zfcp_get_unit_by_lun (struct zfcp_port *, -fcp_lun_t ); -extern struct zfcp_port *zfcp_get_port_by_wwpn (struct zfcp_adapter *, -wwn_t ); +extern struct zfcp_unit *zfcp_get_unit_by_lun (struct zfcp_port *,u64 ); +extern struct zfcp_port *zfcp_get_port_by_wwpn (struct zfcp_adapter *,u64 );extern int zfcp_adapter_enqueue (struct ccw_device *);extern void zfcp_adapter_dequeue (struct zfcp_adapter *); -extern struct zfcp_port *zfcp_port_enqueue (struct zfcp_adapter *,wwn_t ,u32 , +extern struct zfcp_port *zfcp_port_enqueue (struct zfcp_adapter *,u64 ,u32 ,u32 );extern void zfcp_port_dequeue (struct zfcp_port *); -extern struct zfcp_unit *zfcp_unit_enqueue (struct zfcp_port *,fcp_lun_t ); +extern struct zfcp_unit *zfcp_unit_enqueue (struct zfcp_port *,u64 );extern void zfcp_unit_dequeue (struct zfcp_unit *);extern int zfcp_reqlist_isempty (struct zfcp_adapter *);extern void zfcp_sg_free_table (struct scatterlist *,int );
@@ -150,7 +148,6 @@ extern void zfcp_qdio_close(struct zfcp_extern struct zfcp_data zfcp_data;extern int zfcp_adapter_scsi_register (struct zfcp_adapter *);extern void zfcp_adapter_scsi_unregister (struct zfcp_adapter *); -extern void zfcp_set_fcp_dl (struct fcp_cmnd_iu *,fcp_dl_t );extern char *zfcp_get_fcp_sns_info_ptr (struct fcp_rsp_iu *);extern struct fc_function_template zfcp_transport_functions;
drivers/s390/scsi/zfcp_fc.c +1 -1
@@ -178,7 +178,7 @@ static void zfcp_fc_incoming_rscn(structschedule_work (&fsf_req->adapter->scan_work); } -static void zfcp_fc_incoming_wwpn (struct zfcp_fsf_req *req,wwn_t wwpn) +static void zfcp_fc_incoming_wwpn (struct zfcp_fsf_req *req,u64 wwpn) {struct zfcp_adapter *adapter = req->adapter;struct zfcp_port *port;
drivers/s390/scsi/zfcp_sysfs.c +12 -10
@@ -26,9 +26,9 @@ static ZFCP_DEV_ATTR(_feat, _name, S_IRUZFCP_DEFINE_ATTR (zfcp_adapter, adapter, status,"0x%08x\n" ,atomic_read (&adapter->status));ZFCP_DEFINE_ATTR (zfcp_adapter, adapter, peer_wwnn,"0x%016llx\n" , - adapter->peer_wwnn); + (unsigned long long ) adapter->peer_wwnn);ZFCP_DEFINE_ATTR (zfcp_adapter, adapter, peer_wwpn,"0x%016llx\n" , - adapter->peer_wwpn); + (unsigned long long ) adapter->peer_wwpn);ZFCP_DEFINE_ATTR (zfcp_adapter, adapter, peer_d_id,"0x%06x\n" , adapter->peer_d_id); ZFCP_DEFINE_ATTR(zfcp_adapter, adapter, card_version, "0x%04x\n",
@@ -135,7 +135,7 @@ static ssize_t zfcp_sysfs_port_remove_st {struct zfcp_adapter *adapter =dev_get_drvdata (dev);struct zfcp_port *port; -wwn_t wwpn; +u64 wwpn;int retval =0 ;down (&zfcp_data.config_sema);
@@ -144,7 +144,7 @@ static ssize_t zfcp_sysfs_port_remove_st goto out; } -if (strict_strtoull (buf,0 , &wwpn)) { +if (strict_strtoull (buf,0 , (unsigned long long *) &wwpn)) { retval = -EINVAL ; goto out; }
@@ -200,7 +200,7 @@ static ssize_t zfcp_sysfs_unit_add_store {struct zfcp_port *port =dev_get_drvdata (dev);struct zfcp_unit *unit; -fcp_lun_t fcp_lun; +u64 fcp_lun;int retval = -EINVAL ;down (&zfcp_data.config_sema);
@@ -209,7 +209,7 @@ static ssize_t zfcp_sysfs_unit_add_store goto out; } -if (strict_strtoull (buf,0 , &fcp_lun)) +if (strict_strtoull (buf,0 , (unsigned long long *) &fcp_lun)) goto out; unit =zfcp_unit_enqueue (port, fcp_lun);
@@ -233,7 +233,7 @@ static ssize_t zfcp_sysfs_unit_remove_st {struct zfcp_port *port =dev_get_drvdata (dev);struct zfcp_unit *unit; -fcp_lun_t fcp_lun; +u64 fcp_lun;int retval =0 ;down (&zfcp_data.config_sema);
@@ -242,7 +242,7 @@ static ssize_t zfcp_sysfs_unit_remove_st goto out; } -if (strict_strtoull (buf,0 , &fcp_lun)) { +if (strict_strtoull (buf,0 , (unsigned long long *) &fcp_lun)) { retval = -EINVAL ; goto out; }
@@ -380,8 +380,10 @@ static DEVICE_ATTR(_name, S_IRUGO, zfcp_ZFCP_DEFINE_SCSI_ATTR (hba_id,"%s\n" , unit->port->adapter->ccw_device->dev.bus_id); -ZFCP_DEFINE_SCSI_ATTR (wwpn,"0x%016llx\n" , unit->port->wwpn); -ZFCP_DEFINE_SCSI_ATTR (fcp_lun,"0x%016llx\n" , unit->fcp_lun); +ZFCP_DEFINE_SCSI_ATTR (wwpn,"0x%016llx\n" , + (unsigned long long ) unit->port->wwpn); +ZFCP_DEFINE_SCSI_ATTR (fcp_lun,"0x%016llx\n" , + (unsigned long long ) unit->fcp_lun);struct device_attribute *zfcp_sysfs_sdev_attrs[] = { &dev_attr_fcp_lun,
drivers/s390/scsi/zfcp_erp.c +6 -4
@@ -991,7 +991,8 @@ static int zfcp_erp_strategy_check_unit(dev_err (&unit->port->adapter->ccw_device->dev,"ERP failed for unit 0x%016Lx on " "port 0x%016Lx\n" , - unit->fcp_lun, unit->port->wwpn); + (unsigned long long )unit->fcp_lun, + (unsigned long long )unit->port->wwpn);zfcp_erp_unit_failed (unit,21 ,NULL ); }break ;
@@ -1021,7 +1022,7 @@ static int zfcp_erp_strategy_check_port(if (atomic_read (&port->erp_counter) >ZFCP_MAX_ERPS ) {dev_err (&port->adapter->ccw_device->dev,"ERP failed for remote port 0x%016Lx\n" , - port->wwpn); + (unsigned long long )port->wwpn);zfcp_erp_port_failed (port,22 ,NULL ); }break ;
@@ -1199,7 +1200,8 @@ static void zfcp_erp_schedule_work(strucif (!p) {dev_err (&unit->port->adapter->ccw_device->dev,"Registering unit 0x%016Lx on port 0x%016Lx failed\n" , - unit->fcp_lun, unit->port->wwpn); + (unsigned long long )unit->fcp_lun, + (unsigned long long )unit->port->wwpn);return ; }
@@ -1221,7 +1223,7 @@ static void zfcp_erp_rport_register(struif (!port->rport) {dev_err (&port->adapter->ccw_device->dev,"Registering port 0x%016Lx failed\n" , - port->wwpn); + (unsigned long long )port->wwpn);return ; }
drivers/s390/scsi/zfcp_fsf.c +38 -15
143 lines not on this page · raw message
drivers/s390/scsi/zfcp_scsi.c +0 -14
@@ -21,20 +21,6 @@ char *zfcp_get_fcp_sns_info_ptr(struct freturn fcp_sns_info_ptr; } -void zfcp_set_fcp_dl (struct fcp_cmnd_iu *fcp_cmd,fcp_dl_t fcp_dl) -{ -fcp_dl_t *fcp_dl_ptr; - -/* -* fcp_dl_addr = start address of fcp_cmnd structure + -* size of fixed part + size of dynamically sized add_dcp_cdb field -* SEE FCP-2 documentation -*/ - fcp_dl_ptr = (fcp_dl_t *) ((unsigned char *) &fcp_cmd[1 ] + - (fcp_cmd->add_fcp_cdb_length <<2 )); - *fcp_dl_ptr = fcp_dl; -} -static void zfcp_scsi_slave_destroy (struct scsi_device *sdpnt) {struct zfcp_unit *unit = (struct zfcp_unit *) sdpnt->hostdata;
PATCH 6/13 zfcp: Simplify get_adapter_by_busid
In reply to Christof SchmittFrom: Swen Schillig <[email protected]>
Call the helper function from cio instead looping through all zfcp adapters.
--- drivers/s390/scsi/zfcp_aux.c | 13 ------------- drivers/s390/scsi/zfcp_ccw.c | 17 +++++++++++++++++ drivers/s390/scsi/zfcp_ext.h | 1 + 3 files changed, 18 insertions(+), 13 deletions(-)
drivers/s390/scsi/zfcp_aux.c +0 -13
@@ -106,19 +106,6 @@ static int __init zfcp_device_setup(charreturn 0 ; } -static struct zfcp_adapter *zfcp_get_adapter_by_busid (char *bus_id) -{ -struct zfcp_adapter *adapter; - -list_for_each_entry (adapter, &zfcp_data.adapter_list_head, list) -if ((strncmp (bus_id, adapter->ccw_device->dev.bus_id, -BUS_ID_SIZE ) ==0 ) && - !(atomic_read (&adapter->status) & -ZFCP_STATUS_COMMON_REMOVE )) -return adapter; -return NULL ; -} -static void __init zfcp_init_device_configure (void ) {struct zfcp_adapter *adapter;
drivers/s390/scsi/zfcp_ccw.c +17 -0
@@ -224,3 +224,20 @@ int __init zfcp_ccw_register(void) {return ccw_driver_register (&zfcp_ccw_driver); } + +/** +* zfcp_get_adapter_by_busid - find zfcp_adapter struct +* @busid: bus id string of zfcp adapter to find +*/ +struct zfcp_adapter *zfcp_get_adapter_by_busid (char *busid) +{ +struct ccw_device *ccw_device; +struct zfcp_adapter *adapter =NULL ; + + ccw_device =get_ccwdev_by_busid (&zfcp_ccw_driver, busid); +if (ccw_device) { + adapter =dev_get_drvdata (&ccw_device->dev); +put_device (&ccw_device->dev); + } +return adapter; +}
drivers/s390/scsi/zfcp_ext.h +1 -0
@@ -27,6 +27,7 @@ extern int zfcp_sg_setup_table(struct sc/* zfcp_ccw.c */ extern int zfcp_ccw_register (void ); +extern struct zfcp_adapter *zfcp_get_adapter_by_busid (char *);/* zfcp_cfdc.c */ extern struct miscdevice zfcp_cfdc_misc;
PATCH 7/13 zfcp: Simplify zfcp data structures
In reply to Christof SchmittFrom: Christof Schmitt <[email protected]>
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.
--- drivers/s390/scsi/zfcp_aux.c | 34 --------------- drivers/s390/scsi/zfcp_ccw.c | 10 ++-- drivers/s390/scsi/zfcp_def.h | 26 ++--------- drivers/s390/scsi/zfcp_erp.c | 2 drivers/s390/scsi/zfcp_fc.c | 3 - drivers/s390/scsi/zfcp_fsf.c | 89 ++++++++++++++++++++--------------------- drivers/s390/scsi/zfcp_qdio.c | 12 ++--- drivers/s390/scsi/zfcp_scsi.c | 8 ++- drivers/s390/scsi/zfcp_sysfs.c | 6 +- 9 files changed, 77 insertions(+), 113 deletions(-)
drivers/s390/scsi/zfcp_aux.c +1 -33
@@ -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(stru }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(struwrite_unlock_irq (&zfcp_data.config_lock); - port->units++;zfcp_port_get (port);return unit;
@@ -344,7 +340,6 @@ void zfcp_unit_dequeue(struct zfcp_unitwrite_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(stmempool_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_deviinit_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_devispin_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_devi &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_adcancel_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_adlist_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(strureturn 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(strulist_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_portwait_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);
drivers/s390/scsi/zfcp_def.h +6 -20
@@ -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 */
drivers/s390/scsi/zfcp_erp.c +1 -1
@@ -1186,7 +1186,7 @@ static void zfcp_erp_scsi_scan(struct wostruct 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);
drivers/s390/scsi/zfcp_scsi.c +6 -2
@@ -105,13 +105,17 @@ static struct zfcp_unit *zfcp_unit_looku {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 ;
drivers/s390/scsi/zfcp_ccw.c +6 -4
@@ -47,6 +47,8 @@ static void zfcp_ccw_remove(struct ccw_dstruct 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_dwrite_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);
drivers/s390/scsi/zfcp_fc.c +2 -1
@@ -526,7 +526,8 @@ static void zfcp_validate_port(struct zfatomic_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 ; }
drivers/s390/scsi/zfcp_sysfs.c +4 -2
@@ -137,6 +137,7 @@ static ssize_t zfcp_sysfs_port_remove_ststruct 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_stif (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_ststruct 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_stif (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 ;
drivers/s390/scsi/zfcp_fsf.c +45 -44
326 lines not on this page · raw message
drivers/s390/scsi/zfcp_qdio.c +6 -6
@@ -346,7 +346,7 @@ int zfcp_qdio_send(struct zfcp_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 *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/* 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 } 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 */* 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 ;
PATCH 8/13 zfcp: put threshold data in hba trace
In reply to Christof SchmittFrom: Swen Schillig <[email protected]>
Now that we removed the long messages for the bit error threshold data, put the data in the hba trace. This way, we get a short warning for the threshold event from the hardware and have the data in the trace for further analysis.
--- drivers/s390/scsi/zfcp_dbf.c | 46 +++++++++++++++++++++++++++++++++++++++++++ drivers/s390/scsi/zfcp_dbf.h | 1 drivers/s390/scsi/zfcp_ext.h | 2 + drivers/s390/scsi/zfcp_fsf.c | 1 4 files changed, 50 insertions(+)
drivers/s390/scsi/zfcp_dbf.c +46 -0
@@ -318,6 +318,26 @@ void zfcp_hba_dbf_event_qdio(struct zfcpspin_unlock_irqrestore (&adapter->hba_dbf_lock, flags); } +/** +* zfcp_hba_dbf_event_berr - trace event for bit error threshold +* @adapter: adapter affected by this QDIO related event +* @req: fsf request +*/ +void zfcp_hba_dbf_event_berr (struct zfcp_adapter *adapter, +struct zfcp_fsf_req *req) +{ +struct zfcp_hba_dbf_record *r = &adapter->hba_dbf_buf; +struct fsf_status_read_buffer *sr_buf = req->data; +struct fsf_bit_error_payload *err = &sr_buf->payload.bit_error; +unsigned long flags; + +spin_lock_irqsave (&adapter->hba_dbf_lock, flags); +memset (r,0 ,sizeof (*r)); +strncpy (r->tag,"berr" ,ZFCP_DBF_TAG_SIZE ); +memcpy (&r->u.berr, err,sizeof (struct fsf_bit_error_payload )); +debug_event (adapter->hba_dbf,0 , r,sizeof (*r)); +spin_unlock_irqrestore (&adapter->hba_dbf_lock, flags); +}static void zfcp_hba_dbf_view_response (char **p,struct zfcp_hba_dbf_record_response *r) {
@@ -399,6 +419,30 @@ static void zfcp_hba_dbf_view_qdio(charzfcp_dbf_out (p,"sbal_count" ,"0x%02x" , r->sbal_count); } +static void zfcp_hba_dbf_view_berr (char **p,struct fsf_bit_error_payload *r) +{ +zfcp_dbf_out (p,"link_failures" ,"%d" , r->link_failure_error_count); +zfcp_dbf_out (p,"loss_of_sync_err" ,"%d" , r->loss_of_sync_error_count); +zfcp_dbf_out (p,"loss_of_sig_err" ,"%d" , r->loss_of_signal_error_count); +zfcp_dbf_out (p,"prim_seq_err" ,"%d" , + r->primitive_sequence_error_count); +zfcp_dbf_out (p,"inval_trans_word_err" ,"%d" , + r->invalid_transmission_word_error_count); +zfcp_dbf_out (p,"CRC_errors" ,"%d" , r->crc_error_count); +zfcp_dbf_out (p,"prim_seq_event_to" ,"%d" , + r->primitive_sequence_event_timeout_count); +zfcp_dbf_out (p,"elast_buf_overrun_err" ,"%d" , + r->elastic_buffer_overrun_error_count); +zfcp_dbf_out (p,"adv_rec_buf2buf_cred" ,"%d" , + r->advertised_receive_b2b_credit); +zfcp_dbf_out (p,"curr_rec_buf2buf_cred" ,"%d" , + r->current_receive_b2b_credit); +zfcp_dbf_out (p,"adv_trans_buf2buf_cred" ,"%d" , + r->advertised_transmit_b2b_credit); +zfcp_dbf_out (p,"curr_trans_buf2buf_cred" ,"%d" , + r->current_transmit_b2b_credit); +} +static int zfcp_hba_dbf_view_format (debug_info_t *id,struct debug_view *view,char *out_buf,const char *in_buf) {
@@ -418,6 +462,8 @@ static int zfcp_hba_dbf_view_format(debuzfcp_hba_dbf_view_status (&p, &r->u.status); else if (strncmp(r->tag, "qdio", ZFCP_DBF_TAG_SIZE) == 0) zfcp_hba_dbf_view_qdio(&p, &r->u.qdio); + else if (strncmp(r->tag, "berr", ZFCP_DBF_TAG_SIZE) == 0) + zfcp_hba_dbf_view_berr(&p, &r->u.berr); p +=sprintf (p,"\n" );return p - out_buf;
drivers/s390/scsi/zfcp_dbf.h +1 -0
@@ -151,6 +151,7 @@ struct zfcp_hba_dbf_record {struct zfcp_hba_dbf_record_response response;struct zfcp_hba_dbf_record_status status;struct zfcp_hba_dbf_record_qdio qdio; +struct fsf_bit_error_payload berr; } u; } __attribute__ ((packed));
drivers/s390/scsi/zfcp_ext.h +2 -0
@@ -49,6 +49,8 @@ extern void zfcp_hba_dbf_event_fsf_unsol struct fsf_status_read_buffer *);extern void zfcp_hba_dbf_event_qdio (struct zfcp_adapter *,unsigned int ,int ,int ); +extern void zfcp_hba_dbf_event_berr (struct zfcp_adapter *, +struct zfcp_fsf_req *);extern void zfcp_san_dbf_event_ct_request (struct zfcp_fsf_req *);extern void zfcp_san_dbf_event_ct_response (struct zfcp_fsf_req *);extern void zfcp_san_dbf_event_els_request (struct zfcp_fsf_req *);
drivers/s390/scsi/zfcp_fsf.c +1 -0
@@ -294,6 +294,7 @@ static void zfcp_fsf_status_read_handlerdev_warn (&adapter->ccw_device->dev,"The error threshold for checksum statistics " "has been exceeded\n" ); +zfcp_hba_dbf_event_berr (adapter, req);break ;case FSF_STATUS_READ_LINK_DOWN :zfcp_fsf_status_read_link_down (req);
PATCH 9/13 zfcp: deadlock via shared work queue tasks
In reply to Christof SchmittFrom: Swen Schillig <[email protected]>
Each adapter reopen trigger automatically a scan_port task which is waiting for the ERP to be finished before further processing. Since the initial device setup enqueues adapter, port and LUN which are individual ERP actions, this process would start after everything is done. Unfortunately the port_reopen requires another scheduled work to be finished which is queued after the automatic scan_port -> deadlock !
This fix creates an own work queue for ERP based nameserver requests.
--- drivers/s390/scsi/zfcp_aux.c | 2 ++ drivers/s390/scsi/zfcp_def.h | 1 + drivers/s390/scsi/zfcp_erp.c | 4 ++-- drivers/s390/scsi/zfcp_fsf.c | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-)
drivers/s390/scsi/zfcp_aux.c +2 -0
@@ -168,6 +168,8 @@ static int __init zfcp_module_init(void)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);
drivers/s390/scsi/zfcp_def.h +1 -0
@@ -602,6 +602,7 @@ struct zfcp_data {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 */
drivers/s390/scsi/zfcp_erp.c +2 -2
@@ -869,7 +869,7 @@ static int zfcp_erp_port_strategy_open_cif (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 :
@@ -1209,7 +1209,7 @@ static void zfcp_erp_schedule_work(strucatomic_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)
drivers/s390/scsi/zfcp_fsf.c +1 -1
@@ -329,7 +329,7 @@ static void zfcp_fsf_status_read_handlerzfcp_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)
PATCH 10/13 zfcp: prevent fc_remote_port_delete calls for unregistered rport
In reply to Christof SchmittFrom: Swen Schillig <[email protected]>
In case of an adapter reopen all rports have to be deleted from the environment. This should only happen for already registered rports otherwise fc_remote_port_delete is called with a NULL pointer.
--- drivers/s390/scsi/zfcp_erp.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/s390/scsi/zfcp_erp.c +2 -0
@@ -1236,6 +1236,8 @@ static void zfcp_erp_rports_del(struct z {struct zfcp_port *port;list_for_each_entry (port, &adapter->port_list_head, list) { +if (!port->rport) +continue ;fc_remote_port_delete (port->rport); port->rport =NULL ; }
PATCH 11/13 zfcp: fix erp list usage without using locks
In reply to Christof SchmittFrom: Swen Schillig <[email protected]>
The zfcp_erp_thread was using the nolock version of the dbf function. This resulted in a list access while other tasks could modifying the list. The symptom was an erp thread running at 100% CPU and never returning from the dbf function.
--- drivers/s390/scsi/zfcp_erp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/s390/scsi/zfcp_erp.c +2 -2
@@ -1395,9 +1395,9 @@ static int zfcp_erp_thread(void *data)zfcp_erp_wakeup (adapter); } -zfcp_rec_dbf_event_thread (4 , adapter); +zfcp_rec_dbf_event_thread_lock (4 , adapter);down_interruptible (&adapter->erp_ready_sem); -zfcp_rec_dbf_event_thread (5 , adapter); +zfcp_rec_dbf_event_thread_lock (5 , adapter); }atomic_clear_mask (ZFCP_STATUS_ADAPTER_ERP_THREAD_UP , &adapter->status);
PATCH 12/13 zfcp: wait on SCSI work to be finished before proceeding with init dev
In reply to Christof SchmittFrom: Swen Schillig <[email protected]>
Due to the character of a scheduled work we cannot guarantee the LUN register to be finished before an initial device tries to use it. Therefor we have to wait for PENDING_SCSI_WORK flag to be cleared before proceeding.
--- drivers/s390/scsi/zfcp_aux.c | 5 +++++ drivers/s390/scsi/zfcp_erp.c | 1 + 2 files changed, 6 insertions(+)
drivers/s390/scsi/zfcp_aux.c +5 -0
@@ -129,7 +129,12 @@ static void __init zfcp_init_device_conf goto out_unit;up (&zfcp_data.config_sema);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 )); +down (&zfcp_data.config_sema);zfcp_unit_put (unit); out_unit:
drivers/s390/scsi/zfcp_erp.c +1 -0
@@ -1189,6 +1189,7 @@ static void zfcp_erp_scsi_scan(struct wo 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); +wake_up (&unit->port->adapter->erp_done_wqh);kfree (p); }
PATCH 13/13 zfcp: fix double dbf id usage
In reply to Christof SchmittFrom: Swen Schillig <[email protected]>
Trace ids 107 and 3 are used twice, fix this to have unique ids for the erp triggers.
--- drivers/s390/scsi/zfcp_dbf.c | 2 +- drivers/s390/scsi/zfcp_erp.c | 2 +- drivers/s390/scsi/zfcp_fsf.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
drivers/s390/scsi/zfcp_dbf.c +1 -1
@@ -572,7 +572,7 @@ static const char *zfcp_rec_dbf_ids[] = [81] = "shared read-write unit access unsupported", [82] = "incoming rscn", [83] = "incoming wwpn", - [84] = "", + [84] = "wka port handle not valid close port", [85] = "online", [86] = "offline", [87] = "ccw device gone",
drivers/s390/scsi/zfcp_fsf.c +1 -1
@@ -1641,7 +1641,7 @@ static void zfcp_fsf_close_wka_port_handif (req->qtcb->header.fsf_status ==FSF_PORT_HANDLE_NOT_VALID ) { req->status |=ZFCP_STATUS_FSFREQ_ERROR ; -zfcp_erp_adapter_reopen (wka_port->adapter,0 ,107 , req); +zfcp_erp_adapter_reopen (wka_port->adapter,0 ,84 , req); } wka_port->status =ZFCP_WKA_PORT_OFFLINE ;
drivers/s390/scsi/zfcp_erp.c +1 -1
@@ -1443,7 +1443,7 @@ void zfcp_erp_thread_kill(struct zfcp_ad {atomic_set_mask (ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL , &adapter->status);up (&adapter->erp_ready_sem); -zfcp_rec_dbf_event_thread_lock (2 , adapter); +zfcp_rec_dbf_event_thread_lock (3 , adapter); wait_event(adapter->erp_thread_wqh, !(atomic_read(&adapter->status) &