zfcp patches for 2.6.39 merge window
Subsystems (4)
cover zfcp patches for 2.6.39 merge window
James,
here is a series of zfcp updates for the 2.6.39 merge window. The patches apply on top of the current scsi-misc tree.
Steffen
Linux on System z Development
IBM Deutschland Research & Development GmbH Vorsitzender des Aufsichtsrats: Martin Jetter
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294
PATCH 1/11 zfcp: Remove redundant unlikely()
From: Tobias Klauser <[email protected]>
IS_ERR() already implies unlikely(), so it can be omitted here.
---
drivers/s390/scsi/zfcp_fsf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/s390/scsi/zfcp_fsf.c +2 -2
@@ -1552,7 +1552,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fSBAL_FLAGS0_TYPE_READ , qdio->adapter->pool.erp_req); -if (unlikely (IS_ERR (req))) { +if (IS_ERR (req)) { retval =PTR_ERR (req); goto out; }
@@ -1605,7 +1605,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_SBAL_FLAGS0_TYPE_READ , qdio->adapter->pool.erp_req); -if (unlikely (IS_ERR (req))) { +if (IS_ERR (req)) { retval =PTR_ERR (req); goto out; }
PATCH 2/11 zfcp: Remove unused flag ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT
In reply to Steffen MaierFrom: Christof Schmitt <[email protected]>
Remove the now unused flag ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT.
---
drivers/s390/scsi/zfcp_def.h | 1 - drivers/s390/scsi/zfcp_fsf.c | 1 - 2 files changed, 2 deletions(-)
drivers/s390/scsi/zfcp_def.h +0 -1
@@ -89,7 +89,6 @@ struct zfcp_reqlist;#define ZFCP_STATUS_LUN_READONLY 0x00000008/* FSF request status (this does not have a common part) */ -#define ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT 0x00000002#define ZFCP_STATUS_FSFREQ_ERROR 0x00000008#define ZFCP_STATUS_FSFREQ_CLEANUP 0x00000010#define ZFCP_STATUS_FSFREQ_ABORTSUCCEEDED 0x00000040
drivers/s390/scsi/zfcp_fsf.c +0 -1
@@ -2284,7 +2284,6 @@ struct zfcp_fsf_req *zfcp_fsf_fcp_task_m goto out; } - req->status |=ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT ; req->data = scmnd; req->handler = zfcp_fsf_fcp_task_mgmt_handler; req->qtcb->header.lun_handle = zfcp_sdev->lun_handle;
PATCH 3/11 zfcp: Replace kmem_cache for "status read" data
In reply to Steffen MaierFrom: Christof Schmitt <[email protected]>
zfcp requires a mempool for the status read data blocks to resubmit the "status read" requests at any time. Each status read data block has the size of a page (4096 bytes) and needs to be placed in one page.
Instead of having a kmem_cache for allocating page sized chunks, use mempool_create_page_pool to create a mempool returning pages and remove the zfcp kmem_cache.
---
drivers/s390/scsi/zfcp_aux.c | 20 ++++++-------------- drivers/s390/scsi/zfcp_def.h | 3 +-- drivers/s390/scsi/zfcp_erp.c | 2 +- drivers/s390/scsi/zfcp_fsf.c | 12 +++++++----- 4 files changed, 15 insertions(+), 22 deletions(-)
drivers/s390/scsi/zfcp_aux.c +6 -14
@@ -132,11 +132,6 @@ static int __init zfcp_module_init(void)if (!zfcp_data.qtcb_cache) goto out_qtcb_cache; - zfcp_data.sr_buffer_cache =zfcp_cache_hw_align ("zfcp_sr" , -sizeof (struct fsf_status_read_buffer )); -if (!zfcp_data.sr_buffer_cache) - goto out_sr_cache; - zfcp_data.gid_pn_cache =zfcp_cache_hw_align ("zfcp_gid" ,sizeof (struct zfcp_fc_gid_pn ));if (!zfcp_data.gid_pn_cache)
@@ -181,8 +176,6 @@ out_transport: out_adisc_cache:kmem_cache_destroy (zfcp_data.gid_pn_cache); out_gid_cache: -kmem_cache_destroy (zfcp_data.sr_buffer_cache); -out_sr_cache:kmem_cache_destroy (zfcp_data.qtcb_cache); out_qtcb_cache:kmem_cache_destroy (zfcp_data.gpn_ft_cache);
@@ -199,7 +192,6 @@ static void __exit zfcp_module_exit(voidfc_release_transport (zfcp_data.scsi_transport_template);kmem_cache_destroy (zfcp_data.adisc_cache);kmem_cache_destroy (zfcp_data.gid_pn_cache); -kmem_cache_destroy (zfcp_data.sr_buffer_cache);kmem_cache_destroy (zfcp_data.qtcb_cache);kmem_cache_destroy (zfcp_data.gpn_ft_cache); }
@@ -264,10 +256,10 @@ static int zfcp_allocate_low_mem_buffersif (!adapter->pool.qtcb_pool)return -ENOMEM ; - adapter->pool.status_read_data = -mempool_create_slab_pool (FSF_STATUS_READS_RECOM , - zfcp_data.sr_buffer_cache); -if (!adapter->pool.status_read_data) +BUILD_BUG_ON (sizeof (struct fsf_status_read_buffer ) >PAGE_SIZE ); + adapter->pool.sr_data = +mempool_create_page_pool (FSF_STATUS_READS_RECOM ,0 ); +if (!adapter->pool.sr_data)return -ENOMEM ; adapter->pool.gid_pn =
@@ -290,8 +282,8 @@ static void zfcp_free_low_mem_buffers(stmempool_destroy (adapter->pool.qtcb_pool);if (adapter->pool.status_read_req)mempool_destroy (adapter->pool.status_read_req); -if (adapter->pool.status_read_data) -mempool_destroy (adapter->pool.status_read_data); +if (adapter->pool.sr_data) +mempool_destroy (adapter->pool.sr_data);if (adapter->pool.gid_pn)mempool_destroy (adapter->pool.gid_pn); }
drivers/s390/scsi/zfcp_def.h +1 -2
@@ -107,7 +107,7 @@ struct zfcp_adapter_mempool {mempool_t *scsi_req;mempool_t *scsi_abort;mempool_t *status_read_req; -mempool_t *status_read_data; +mempool_t *sr_data;mempool_t *gid_pn;mempool_t *qtcb_pool; };
@@ -319,7 +319,6 @@ struct zfcp_data {struct scsi_transport_template *scsi_transport_template;struct kmem_cache *gpn_ft_cache;struct kmem_cache *qtcb_cache; -struct kmem_cache *sr_buffer_cache;struct kmem_cache *gid_pn_cache;struct kmem_cache *adisc_cache; };
drivers/s390/scsi/zfcp_erp.c +1 -1
@@ -732,7 +732,7 @@ static int zfcp_erp_adapter_strategy_opeif (zfcp_erp_adapter_strategy_open_fsf_xport (act) ==ZFCP_ERP_FAILED )return ZFCP_ERP_FAILED ; -if (mempool_resize (act->adapter->pool.status_read_data, +if (mempool_resize (act->adapter->pool.sr_data, act->adapter->stat_read_buf_num,GFP_KERNEL ))return ZFCP_ERP_FAILED ;
drivers/s390/scsi/zfcp_fsf.c +7 -5
@@ -212,7 +212,7 @@ static void zfcp_fsf_status_read_handlerif (req->status &ZFCP_STATUS_FSFREQ_DISMISSED ) {zfcp_dbf_hba_fsf_uss ("fssrh_1" , req); -mempool_free (sr_buf, adapter->pool.status_read_data); +mempool_free (virt_to_page (sr_buf), adapter->pool.sr_data);zfcp_fsf_req_free (req);return ; }
@@ -265,7 +265,7 @@ static void zfcp_fsf_status_read_handlerbreak ; } -mempool_free (sr_buf, adapter->pool.status_read_data); +mempool_free (virt_to_page (sr_buf), adapter->pool.sr_data);zfcp_fsf_req_free (req);atomic_inc (&adapter->stat_miss);
@@ -723,6 +723,7 @@ int zfcp_fsf_status_read(struct zfcp_qdistruct zfcp_adapter *adapter = qdio->adapter;struct zfcp_fsf_req *req;struct fsf_status_read_buffer *sr_buf; +struct page *page;int retval = -EIO ;spin_lock_irq (&qdio->req_q_lock);
@@ -736,11 +737,12 @@ int zfcp_fsf_status_read(struct zfcp_qdi goto out; } - sr_buf =mempool_alloc (adapter->pool.status_read_data,GFP_ATOMIC ); -if (!sr_buf) { + page =mempool_alloc (adapter->pool.sr_data,GFP_ATOMIC ); +if (!page) { retval = -ENOMEM ; goto failed_buf; } + sr_buf =page_address (page);memset (sr_buf,0 ,sizeof (*sr_buf)); req->data = sr_buf;
@@ -755,7 +757,7 @@ int zfcp_fsf_status_read(struct zfcp_qdi failed_req_send: req->data =NULL ; -mempool_free (sr_buf, adapter->pool.status_read_data); +mempool_free (virt_to_page (sr_buf), adapter->pool.sr_data); failed_buf:zfcp_dbf_hba_fsf_uss ("fssr__1" , req);zfcp_fsf_req_free (req);
PATCH 4/11 zfcp: Introduce new kmem_cache for FC request and response data
In reply to Steffen MaierFrom: Christof Schmitt <[email protected]>
A data buffer that is passed to the hardware must not cross a page boundary. zfcp uses a series of kmem_caches to align the data to not cross a page boundary. Introduce a new kmem_cache for the FC requests sent from the zfcp driver and use it for the ELS ADISC data. The goal is to migrate to the FC kmem_cache in later patches and remove the request specific kmem_caches.
---
drivers/s390/scsi/zfcp_aux.c | 14 ++++++------- drivers/s390/scsi/zfcp_def.h | 1 drivers/s390/scsi/zfcp_ext.h | 1 drivers/s390/scsi/zfcp_fc.c | 46 ++++++++++++++++++++++--------------------- drivers/s390/scsi/zfcp_fc.h | 27 ++++++++++++++----------- 5 files changed, 47 insertions(+), 42 deletions(-)
drivers/s390/scsi/zfcp_aux.c +7 -7
@@ -137,10 +137,10 @@ static int __init zfcp_module_init(void)if (!zfcp_data.gid_pn_cache) goto out_gid_cache; - zfcp_data.adisc_cache =zfcp_cache_hw_align ("zfcp_adisc" , -sizeof (struct zfcp_fc_els_adisc )); -if (!zfcp_data.adisc_cache) - goto out_adisc_cache; + zfcp_fc_req_cache =zfcp_cache_hw_align ("zfcp_fc_req" , +sizeof (struct zfcp_fc_req )); +if (!zfcp_fc_req_cache) + goto out_fc_cache; zfcp_data.scsi_transport_template =fc_attach_transport (&zfcp_transport_functions);
@@ -172,8 +172,8 @@ out_ccw_register: out_misc:fc_release_transport (zfcp_data.scsi_transport_template); out_transport: -kmem_cache_destroy (zfcp_data.adisc_cache); -out_adisc_cache: +kmem_cache_destroy (zfcp_fc_req_cache); +out_fc_cache:kmem_cache_destroy (zfcp_data.gid_pn_cache); out_gid_cache:kmem_cache_destroy (zfcp_data.qtcb_cache);
@@ -190,7 +190,7 @@ static void __exit zfcp_module_exit(voidccw_driver_unregister (&zfcp_ccw_driver);misc_deregister (&zfcp_cfdc_misc);fc_release_transport (zfcp_data.scsi_transport_template); -kmem_cache_destroy (zfcp_data.adisc_cache); +kmem_cache_destroy (zfcp_fc_req_cache);kmem_cache_destroy (zfcp_data.gid_pn_cache);kmem_cache_destroy (zfcp_data.qtcb_cache);kmem_cache_destroy (zfcp_data.gpn_ft_cache);
drivers/s390/scsi/zfcp_def.h +0 -1
@@ -320,7 +320,6 @@ struct zfcp_data {struct kmem_cache *gpn_ft_cache;struct kmem_cache *qtcb_cache; struct kmem_cache *gid_pn_cache; - struct kmem_cache *adisc_cache; };#endif /* ZFCP_DEF_H */
drivers/s390/scsi/zfcp_ext.h +1 -0
@@ -80,6 +80,7 @@ extern void zfcp_erp_notify(struct zfcp_extern void zfcp_erp_timeout_handler (unsigned long );/* zfcp_fc.c */ +extern struct kmem_cache *zfcp_fc_req_cache;extern void zfcp_fc_enqueue_event (struct zfcp_adapter *,enum fc_host_event_code event_code,u32 );extern void zfcp_fc_post_event (struct work_struct *);
drivers/s390/scsi/zfcp_fc.c +24 -22
83 lines not on this page · raw message
drivers/s390/scsi/zfcp_fc.h +15 -12
@@ -123,19 +123,22 @@ struct zfcp_fc_gpn_ft { };/** -* struct zfcp_fc_els_adisc - everything required in zfcp for issuing ELS ADISC -* @els: data required for issuing els fsf command -* @req: scatterlist entry for ELS ADISC request -* @resp: scatterlist entry for ELS ADISC response -* @adisc_req: ELS ADISC request data -* @adisc_resp: ELS ADISC response data +* struct zfcp_fc_req - Container for FC ELS and CT requests sent from zfcp +* @ct_els: data required for issuing fsf command +* @sg_req: scatterlist entry for request data +* @sg_rsp: scatterlist entry for response data +* @u: request specific data */ -struct zfcp_fc_els_adisc { -struct zfcp_fsf_ct_els els; -struct scatterlist req; -struct scatterlist resp; -struct fc_els_adisc adisc_req; -struct fc_els_adisc adisc_resp; +struct zfcp_fc_req { +struct zfcp_fsf_ct_els ct_els; +struct scatterlist sg_req; +struct scatterlist sg_rsp; +union { +struct { +struct fc_els_adisc req; +struct fc_els_adisc rsp; + } adisc; + } u; };/**
PATCH 5/11 zfcp: Allocate GID_PN data through new FC kmem_cache
In reply to Steffen MaierFrom: Christof Schmitt <[email protected]>
Allocate the data for the GID_PN request through the new FC kmem_cache. While updating the GID_PN code, also introduce a helper function for initializing the CT header for FC nameserver requests. Remove the "paranoia" check as well, the GID_PN request data does not suddenly change.
---
drivers/s390/scsi/zfcp_aux.c | 10 ----- drivers/s390/scsi/zfcp_def.h | 1 drivers/s390/scsi/zfcp_fc.c | 78 ++++++++++++++++++++----------------------- drivers/s390/scsi/zfcp_fc.h | 25 +++---------- 4 files changed, 45 insertions(+), 69 deletions(-)
drivers/s390/scsi/zfcp_aux.c +1 -9
@@ -132,11 +132,6 @@ static int __init zfcp_module_init(void)if (!zfcp_data.qtcb_cache) goto out_qtcb_cache; - zfcp_data.gid_pn_cache =zfcp_cache_hw_align ("zfcp_gid" , -sizeof (struct zfcp_fc_gid_pn )); -if (!zfcp_data.gid_pn_cache) - goto out_gid_cache; - zfcp_fc_req_cache =zfcp_cache_hw_align ("zfcp_fc_req" ,sizeof (struct zfcp_fc_req ));if (!zfcp_fc_req_cache)
@@ -174,8 +169,6 @@ out_misc: out_transport:kmem_cache_destroy (zfcp_fc_req_cache); out_fc_cache: -kmem_cache_destroy (zfcp_data.gid_pn_cache); -out_gid_cache:kmem_cache_destroy (zfcp_data.qtcb_cache); out_qtcb_cache:kmem_cache_destroy (zfcp_data.gpn_ft_cache);
@@ -191,7 +184,6 @@ static void __exit zfcp_module_exit(voidmisc_deregister (&zfcp_cfdc_misc);fc_release_transport (zfcp_data.scsi_transport_template);kmem_cache_destroy (zfcp_fc_req_cache); -kmem_cache_destroy (zfcp_data.gid_pn_cache);kmem_cache_destroy (zfcp_data.qtcb_cache);kmem_cache_destroy (zfcp_data.gpn_ft_cache); }
@@ -263,7 +255,7 @@ static int zfcp_allocate_low_mem_buffersreturn -ENOMEM ; adapter->pool.gid_pn = -mempool_create_slab_pool (1 , zfcp_data.gid_pn_cache); +mempool_create_slab_pool (1 , zfcp_fc_req_cache);if (!adapter->pool.gid_pn)return -ENOMEM ;
drivers/s390/scsi/zfcp_def.h +0 -1
@@ -319,7 +319,6 @@ struct zfcp_data {struct scsi_transport_template *scsi_transport_template;struct kmem_cache *gpn_ft_cache; struct kmem_cache *qtcb_cache; - struct kmem_cache *gid_pn_cache; };#endif /* ZFCP_DEF_H */
drivers/s390/scsi/zfcp_fc.c +38 -40
131 lines not on this page · raw message
drivers/s390/scsi/zfcp_fc.h +6 -19
@@ -64,33 +64,16 @@ struct zfcp_fc_gid_pn_req { } __packed;/** -* struct zfcp_fc_gid_pn_resp - container for ct header plus gid_pn response +* struct zfcp_fc_gid_pn_rsp - container for ct header plus gid_pn response * @ct_hdr: FC GS common transport header * @gid_pn: GID_PN response */ -struct zfcp_fc_gid_pn_resp { +struct zfcp_fc_gid_pn_rsp {struct fc_ct_hdr ct_hdr;struct fc_gid_pn_resp gid_pn; } __packed;/** -* struct zfcp_fc_gid_pn - everything required in zfcp for gid_pn request -* @ct: data passed to zfcp_fsf for issuing fsf request -* @sg_req: scatterlist entry for request data -* @sg_resp: scatterlist entry for response data -* @gid_pn_req: GID_PN request data -* @gid_pn_resp: GID_PN response data -*/ -struct zfcp_fc_gid_pn { -struct zfcp_fsf_ct_els ct; -struct scatterlist sg_req; -struct scatterlist sg_resp; -struct zfcp_fc_gid_pn_req gid_pn_req; -struct zfcp_fc_gid_pn_resp gid_pn_resp; -struct zfcp_port *port; -}; - -/** * struct zfcp_fc_gpn_ft - container for ct header plus gpn_ft request * @ct_hdr: FC GS common transport header * @gpn_ft: GPN_FT request
@@ -138,6 +121,10 @@ struct zfcp_fc_req {struct fc_els_adisc req;struct fc_els_adisc rsp; } adisc; +struct { +struct zfcp_fc_gid_pn_req req; +struct zfcp_fc_gid_pn_rsp rsp; + } gid_pn; } u; };
PATCH 6/11 zfcp: Use common FC kmem_cache for GPN_FT request
In reply to Steffen MaierFrom: Christof Schmitt <[email protected]>
Switch the allocation of the GPN_FT request data to the FC kmem_cache and remove the zfcp_gpn kmem_cache.
---
drivers/s390/scsi/zfcp_aux.c | 8 --- drivers/s390/scsi/zfcp_def.h | 1 drivers/s390/scsi/zfcp_fc.c | 87 +++++++++++++++---------------------------- drivers/s390/scsi/zfcp_fc.h | 26 +----------- 4 files changed, 35 insertions(+), 87 deletions(-)
drivers/s390/scsi/zfcp_aux.c +0 -8
@@ -122,11 +122,6 @@ static int __init zfcp_module_init(void) {int retval = -ENOMEM ; - zfcp_data.gpn_ft_cache =zfcp_cache_hw_align ("zfcp_gpn" , -sizeof (struct zfcp_fc_gpn_ft_req )); -if (!zfcp_data.gpn_ft_cache) - goto out; - zfcp_data.qtcb_cache =zfcp_cache_hw_align ("zfcp_qtcb" ,sizeof (struct fsf_qtcb ));if (!zfcp_data.qtcb_cache)
@@ -171,8 +166,6 @@ out_transport: out_fc_cache:kmem_cache_destroy (zfcp_data.qtcb_cache); out_qtcb_cache: -kmem_cache_destroy (zfcp_data.gpn_ft_cache); -out:return retval; }
@@ -185,7 +178,6 @@ static void __exit zfcp_module_exit(voidfc_release_transport (zfcp_data.scsi_transport_template);kmem_cache_destroy (zfcp_fc_req_cache);kmem_cache_destroy (zfcp_data.qtcb_cache); -kmem_cache_destroy (zfcp_data.gpn_ft_cache); }module_exit (zfcp_module_exit);
drivers/s390/scsi/zfcp_def.h +0 -1
@@ -317,7 +317,6 @@ struct zfcp_fsf_req {struct zfcp_data {struct scsi_host_template scsi_host_template;struct scsi_transport_template *scsi_transport_template; -struct kmem_cache *gpn_ft_cache;struct kmem_cache *qtcb_cache; };
drivers/s390/scsi/zfcp_fc.c +31 -56
145 lines not on this page · raw message
drivers/s390/scsi/zfcp_fc.h +4 -22
@@ -84,28 +84,6 @@ struct zfcp_fc_gpn_ft_req { } __packed;/** -* struct zfcp_fc_gpn_ft_resp - container for ct header plus gpn_ft response -* @ct_hdr: FC GS common transport header -* @gpn_ft: Array of gpn_ft response data to fill one memory page -*/ -struct zfcp_fc_gpn_ft_resp { -struct fc_ct_hdr ct_hdr; -struct fc_gpn_ft_resp gpn_ft[ZFCP_FC_GPN_FT_ENT_PAGE ]; -} __packed; - -/** -* struct zfcp_fc_gpn_ft - zfcp data for gpn_ft request -* @ct: data passed to zfcp_fsf for issuing fsf request -* @sg_req: scatter list entry for gpn_ft request -* @sg_resp: scatter list entries for gpn_ft responses (per memory page) -*/ -struct zfcp_fc_gpn_ft { -struct zfcp_fsf_ct_els ct; -struct scatterlist sg_req; -struct scatterlist sg_resp[ZFCP_FC_GPN_FT_NUM_BUFS ]; -}; - -/** * struct zfcp_fc_req - Container for FC ELS and CT requests sent from zfcp * @ct_els: data required for issuing fsf command * @sg_req: scatterlist entry for request data
@@ -125,6 +103,10 @@ struct zfcp_fc_req {struct zfcp_fc_gid_pn_req req;struct zfcp_fc_gid_pn_rsp rsp; } gid_pn; +struct { +struct scatterlist sg_rsp2[ZFCP_FC_GPN_FT_NUM_BUFS -1 ]; +struct zfcp_fc_gpn_ft_req req; + } gpn_ft; } u; };
PATCH 7/11 zfcp: Move qtcb kmem_cache to zfcp_fsf.c
In reply to Steffen MaierFrom: Christof Schmitt <[email protected]>
Move the kmem_cache for allocating the qtcb to zfcp_fsf.c and rename it accordingly.
---
drivers/s390/scsi/zfcp_aux.c | 12 ++++++------ drivers/s390/scsi/zfcp_def.h | 1 - drivers/s390/scsi/zfcp_ext.h | 1 + drivers/s390/scsi/zfcp_fsf.c | 6 ++++-- 4 files changed, 11 insertions(+), 9 deletions(-)
drivers/s390/scsi/zfcp_aux.c +6 -6
@@ -122,9 +122,9 @@ static int __init zfcp_module_init(void) {int retval = -ENOMEM ; - zfcp_data.qtcb_cache =zfcp_cache_hw_align ("zfcp_qtcb" , -sizeof (struct fsf_qtcb )); -if (!zfcp_data.qtcb_cache) + zfcp_fsf_qtcb_cache =zfcp_cache_hw_align ("zfcp_fsf_qtcb" , +sizeof (struct fsf_qtcb )); +if (!zfcp_fsf_qtcb_cache) goto out_qtcb_cache; zfcp_fc_req_cache = zfcp_cache_hw_align("zfcp_fc_req",
@@ -164,7 +164,7 @@ out_misc: out_transport:kmem_cache_destroy (zfcp_fc_req_cache); out_fc_cache: -kmem_cache_destroy (zfcp_data.qtcb_cache); +kmem_cache_destroy (zfcp_fsf_qtcb_cache); out_qtcb_cache:return retval; }
@@ -177,7 +177,7 @@ static void __exit zfcp_module_exit(voidmisc_deregister (&zfcp_cfdc_misc);fc_release_transport (zfcp_data.scsi_transport_template);kmem_cache_destroy (zfcp_fc_req_cache); -kmem_cache_destroy (zfcp_data.qtcb_cache); +kmem_cache_destroy (zfcp_fsf_qtcb_cache); }module_exit (zfcp_module_exit);
@@ -236,7 +236,7 @@ static int zfcp_allocate_low_mem_buffersreturn -ENOMEM ; adapter->pool.qtcb_pool = -mempool_create_slab_pool (4 , zfcp_data.qtcb_cache); +mempool_create_slab_pool (4 , zfcp_fsf_qtcb_cache);if (!adapter->pool.qtcb_pool)return -ENOMEM ;
drivers/s390/scsi/zfcp_def.h +0 -1
@@ -317,7 +317,6 @@ struct zfcp_fsf_req {struct zfcp_data {struct scsi_host_template scsi_host_template;struct scsi_transport_template *scsi_transport_template; -struct kmem_cache *qtcb_cache; };#endif /* ZFCP_DEF_H */
drivers/s390/scsi/zfcp_ext.h +1 -0
@@ -98,6 +98,7 @@ extern int zfcp_fc_exec_bsg_job(struct fextern int zfcp_fc_timeout_bsg_job (struct fc_bsg_job *);/* zfcp_fsf.c */ +extern struct kmem_cache *zfcp_fsf_qtcb_cache;extern int zfcp_fsf_open_port (struct zfcp_erp_action *);extern int zfcp_fsf_open_wka_port (struct zfcp_fc_wka_port *);extern int zfcp_fsf_close_wka_port (struct zfcp_fc_wka_port *);
drivers/s390/scsi/zfcp_fsf.c +4 -2
@@ -18,6 +18,8 @@#include "zfcp_qdio.h" #include "zfcp_reqlist.h" +struct kmem_cache *zfcp_fsf_qtcb_cache; +static void zfcp_fsf_request_timeout_handler (unsigned long data) {struct zfcp_adapter *adapter = (struct zfcp_adapter *) data;
@@ -83,7 +85,7 @@ void zfcp_fsf_req_free(struct zfcp_fsf_r }if (likely (req->qtcb)) -kmem_cache_free (zfcp_data.qtcb_cache, req->qtcb); +kmem_cache_free (zfcp_fsf_qtcb_cache, req->qtcb);kfree (req); }
@@ -628,7 +630,7 @@ static struct fsf_qtcb *zfcp_qtcb_alloc(if (likely (pool)) qtcb =mempool_alloc (pool,GFP_ATOMIC );else - qtcb =kmem_cache_alloc (zfcp_data.qtcb_cache,GFP_ATOMIC ); + qtcb =kmem_cache_alloc (zfcp_fsf_qtcb_cache,GFP_ATOMIC );if (unlikely (!qtcb))return NULL ;
PATCH 8/11 zfcp: Merge FCP task management setup with regular FCP command setup
In reply to Steffen MaierFrom: Christof Schmitt <[email protected]>
For task management commands, only LUN and flags are required. The regular FCP setup already sets the LUN in the fcp_cmnd. All is required for merging the function is setting up the TM flags.
---
drivers/s390/scsi/zfcp_fc.h | 22 ++++++++-------------- drivers/s390/scsi/zfcp_fsf.c | 4 ++-- 2 files changed, 10 insertions(+), 16 deletions(-)
drivers/s390/scsi/zfcp_fc.h +8 -14
@@ -164,14 +164,21 @@ struct zfcp_fc_wka_ports {* zfcp_fc_scsi_to_fcp - setup FCP command with data from scsi_cmnd * @fcp: fcp_cmnd to setup * @scsi: scsi_cmnd where to get LUN, task attributes/flags and CDB +* @tm: task management flags to setup task management command */ static inline -void zfcp_fc_scsi_to_fcp (struct fcp_cmnd *fcp,struct scsi_cmnd *scsi) +void zfcp_fc_scsi_to_fcp (struct fcp_cmnd *fcp,struct scsi_cmnd *scsi, +u8 tm_flags) {char tag[2 ];int_to_scsilun (scsi->device->lun, (struct scsi_lun *) &fcp->fc_lun); +if (unlikely (tm_flags)) { + fcp->fc_tm_flags = tm_flags; +return ; + } +if (scsi_populate_tag_msg (scsi, tag)) {switch (tag[0 ]) {case MSG_ORDERED_TAG :
@@ -198,19 +205,6 @@ void zfcp_fc_scsi_to_fcp(struct fcp_cmnd }/** -* zfcp_fc_fcp_tm - setup FCP command as task management command -* @fcp: fcp_cmnd to setup -* @dev: scsi_device where to send the task management command -* @tm: task management flags to setup tm command -*/ -static inline -void zfcp_fc_fcp_tm (struct fcp_cmnd *fcp,struct scsi_device *dev,u8 tm_flags) -{ -int_to_scsilun (dev->lun, (struct scsi_lun *) &fcp->fc_lun); - fcp->fc_tm_flags |= tm_flags; -} - -/** * zfcp_fc_evap_fcp_rsp - evaluate FCP RSP IU and update scsi_cmnd accordingly * @fcp_rsp: FCP RSP IU to evaluate * @scsi: SCSI command where to update status and sense buffer
drivers/s390/scsi/zfcp_fsf.c +2 -2
@@ -2210,7 +2210,7 @@ int zfcp_fsf_fcp_cmnd(struct scsi_cmnd *zfcp_fsf_set_data_dir (scsi_cmnd, &io->data_direction); fcp_cmnd = (struct fcp_cmnd *) &req->qtcb->bottom.io.fcp_cmnd; -zfcp_fc_scsi_to_fcp (fcp_cmnd, scsi_cmnd); +zfcp_fc_scsi_to_fcp (fcp_cmnd, scsi_cmnd,0 );if (scsi_prot_sg_count (scsi_cmnd)) { zfcp_qdio_set_data_div(qdio, &req->qdio_req,
@@ -2299,7 +2299,7 @@ struct zfcp_fsf_req *zfcp_fsf_fcp_task_mzfcp_qdio_set_sbale_last (qdio, &req->qdio_req); fcp_cmnd = (struct fcp_cmnd *) &req->qtcb->bottom.io.fcp_cmnd; -zfcp_fc_fcp_tm (fcp_cmnd, scmnd->device, tm_flags); +zfcp_fc_scsi_to_fcp (fcp_cmnd, scmnd, tm_flags);zfcp_fsf_start_timer (req,ZFCP_SCSI_ER_TIMEOUT );if (!zfcp_fsf_req_send (req))
PATCH 9/11 zfcp: Move SCSI host and transport templates out of struct zfcp_data
In reply to Steffen MaierFrom: Christof Schmitt <[email protected]>
The SCSI host and transport templates are the only members left in the global zfcp_data struct. Move them out of zfcp_data and remove the now unused zfcp_data struct. Also update the names of the register and unregister functions to use the zfcp_scsi prefix.
---
drivers/s390/scsi/zfcp_aux.c | 14 ++++---- drivers/s390/scsi/zfcp_def.h | 6 --- drivers/s390/scsi/zfcp_ext.h | 6 +-- drivers/s390/scsi/zfcp_scsi.c | 70 ++++++++++++++++++++++-------------------- 4 files changed, 48 insertions(+), 48 deletions(-)
drivers/s390/scsi/zfcp_aux.c +7 -7
@@ -132,11 +132,11 @@ static int __init zfcp_module_init(void)if (!zfcp_fc_req_cache) goto out_fc_cache; - zfcp_data.scsi_transport_template = + zfcp_scsi_transport_template =fc_attach_transport (&zfcp_transport_functions); -if (!zfcp_data.scsi_transport_template) +if (!zfcp_scsi_transport_template) goto out_transport; -scsi_transport_reserve_device (zfcp_data.scsi_transport_template, +scsi_transport_reserve_device (zfcp_scsi_transport_template,sizeof (struct zfcp_scsi_dev ));
@@ -160,7 +160,7 @@ static int __init zfcp_module_init(void) out_ccw_register:misc_deregister (&zfcp_cfdc_misc); out_misc: -fc_release_transport (zfcp_data.scsi_transport_template); +fc_release_transport (zfcp_scsi_transport_template); out_transport:kmem_cache_destroy (zfcp_fc_req_cache); out_fc_cache:
@@ -175,7 +175,7 @@ static void __exit zfcp_module_exit(void {ccw_driver_unregister (&zfcp_ccw_driver);misc_deregister (&zfcp_cfdc_misc); -fc_release_transport (zfcp_data.scsi_transport_template); +fc_release_transport (zfcp_scsi_transport_template);kmem_cache_destroy (zfcp_fc_req_cache);kmem_cache_destroy (zfcp_fsf_qtcb_cache); }
@@ -413,7 +413,7 @@ struct zfcp_adapter *zfcp_adapter_enqueu adapter->dma_parms.max_segment_size =ZFCP_QDIO_SBALE_LEN ; adapter->ccw_device->dev.dma_parms = &adapter->dma_parms; -if (!zfcp_adapter_scsi_register (adapter)) +if (!zfcp_scsi_adapter_register (adapter))return adapter; failed:
@@ -430,7 +430,7 @@ void zfcp_adapter_unregister(struct zfcpzfcp_destroy_adapter_work_queue (adapter);zfcp_fc_wka_ports_force_offline (adapter->gs); -zfcp_adapter_scsi_unregister (adapter); +zfcp_scsi_adapter_unregister (adapter);sysfs_remove_group (&cdev->dev.kobj, &zfcp_sysfs_adapter_attrs);zfcp_erp_thread_kill (adapter);
drivers/s390/scsi/zfcp_def.h +0 -6
@@ -313,10 +313,4 @@ struct zfcp_fsf_req { void (*handler)(struct zfcp_fsf_req *); }; -/* driver data */ -struct zfcp_data { -struct scsi_host_template scsi_host_template; -struct scsi_transport_template *scsi_transport_template; -}; -#endif /* ZFCP_DEF_H */
drivers/s390/scsi/zfcp_ext.h +3 -3
@@ -141,9 +141,9 @@ extern struct zfcp_fsf_req *zfcp_fsf_get struct qdio_buffer *);/* zfcp_scsi.c */ -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 struct scsi_transport_template *zfcp_scsi_transport_template; +extern int zfcp_scsi_adapter_register (struct zfcp_adapter *); +extern void zfcp_scsi_adapter_unregister (struct zfcp_adapter *);extern struct fc_function_template zfcp_transport_functions;extern void zfcp_scsi_rport_work (struct work_struct *);extern void zfcp_scsi_schedule_rport_register (struct zfcp_port *);
drivers/s390/scsi/zfcp_scsi.c +38 -32
103 lines not on this page · raw message
PATCH 10/11 fc: Add GSPN_ID request to header file
In reply to Steffen MaierFrom: Christof Schmitt <[email protected]>
Add request code and corresponding structs for "Get Symbolic Port Name" (GSPN_ID) request.
---
include/scsi/fc/fc_ns.h | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
include/scsi/fc/fc_ns.h +10 -1
@@ -41,6 +41,7 @@ enum fc_ns_req {FC_NS_GI_A =0x0101 ,/* get identifiers - scope */ FC_NS_GPN_ID =0x0112 ,/* get port name by ID */ FC_NS_GNN_ID =0x0113 ,/* get node name by ID */ +FC_NS_GSPN_ID =0x0118 ,/* get symbolic port name */ FC_NS_GID_PN =0x0121 ,/* get ID for port name */ FC_NS_GID_NN =0x0131 ,/* get IDs for node name */ FC_NS_GID_FT = 0x0171, /* get IDs by FC4 type */
@@ -144,7 +145,7 @@ struct fc_ns_gid_pn { };/* -* GID_PN response +* GID_PN response or GSPN_ID request */ struct fc_gid_pn_resp {__u8 fp_resvd;
@@ -152,6 +153,14 @@ struct fc_gid_pn_resp { };/* +* GSPN_ID response +*/ +struct fc_gspn_resp { +__u8 fp_name_len; +char fp_name[]; +}; + +/* * RFT_ID request - register FC-4 types for ID. */ struct fc_ns_rft_id {
PATCH 11/11 zfcp: Add information to symbolic port name when running in NPIV mode
In reply to Steffen MaierFrom: Christof Schmitt <[email protected]>
Query the FC symbolic port name for reporting in the fc_host sysfs and enable the symbolic_name attribute in the fc_host sysfs. When running in NPIV mode, extend the symbolic port name with the devno and the hostname. This allows better identification of Linux systems for SAN and storage administrators.
---
drivers/s390/scsi/zfcp_aux.c | 2 drivers/s390/scsi/zfcp_def.h | 1 drivers/s390/scsi/zfcp_erp.c | 2 drivers/s390/scsi/zfcp_ext.h | 1 drivers/s390/scsi/zfcp_fc.c | 120 ++++++++++++++++++++++++++++++++++++++++++ drivers/s390/scsi/zfcp_fc.h | 42 ++++++++++++++ drivers/s390/scsi/zfcp_scsi.c | 1 7 files changed, 169 insertions(+)
drivers/s390/scsi/zfcp_aux.c +2 -0
@@ -362,6 +362,7 @@ struct zfcp_adapter *zfcp_adapter_enqueuINIT_WORK (&adapter->stat_work, _zfcp_status_read_scheduler);INIT_WORK (&adapter->scan_work, zfcp_fc_scan_ports); +INIT_WORK (&adapter->ns_up_work, zfcp_fc_sym_name_update);if (zfcp_qdio_setup (adapter)) goto failed;
@@ -427,6 +428,7 @@ void zfcp_adapter_unregister(struct zfcpcancel_work_sync (&adapter->scan_work);cancel_work_sync (&adapter->stat_work); +cancel_work_sync (&adapter->ns_up_work);zfcp_destroy_adapter_work_queue (adapter);zfcp_fc_wka_ports_force_offline (adapter->gs);
drivers/s390/scsi/zfcp_def.h +1 -0
@@ -189,6 +189,7 @@ struct zfcp_adapter {struct fsf_qtcb_bottom_port *stats_reset_data;unsigned long stats_reset;struct work_struct scan_work; +struct work_struct ns_up_work;struct service_level service_level;struct workqueue_struct *work_queue;struct device_dma_parameters dma_parms;
drivers/s390/scsi/zfcp_erp.c +2 -0
@@ -1231,8 +1231,10 @@ static void zfcp_erp_action_cleanup(struif (result ==ZFCP_ERP_SUCCEEDED ) {register_service_level (&adapter->service_level);queue_work (adapter->work_queue, &adapter->scan_work); +queue_work (adapter->work_queue, &adapter->ns_up_work); }else unregister_service_level (&adapter->service_level); +kref_put (&adapter->ref, zfcp_adapter_release);break ; }
drivers/s390/scsi/zfcp_ext.h +1 -0
@@ -96,6 +96,7 @@ extern int zfcp_fc_gs_setup(struct zfcp_extern void zfcp_fc_gs_destroy (struct zfcp_adapter *);extern int zfcp_fc_exec_bsg_job (struct fc_bsg_job *);extern int zfcp_fc_timeout_bsg_job (struct fc_bsg_job *); +extern void zfcp_fc_sym_name_update (struct work_struct *);/* zfcp_fsf.c */ extern struct kmem_cache *zfcp_fsf_qtcb_cache;
drivers/s390/scsi/zfcp_fc.c +120 -0
132 lines not on this page · raw message
drivers/s390/scsi/zfcp_fc.h +42 -0
54 lines not on this page · raw message
drivers/s390/scsi/zfcp_scsi.c +1 -0
@@ -720,6 +720,7 @@ struct fc_function_template zfcp_transpo/* no functions registered for following dynamic attributes but directly set by LLDD */ .show_host_port_type = 1, + .show_host_symbolic_name = 1, .show_host_speed = 1, .show_host_port_id = 1, .dd_bsg_size = sizeof(struct zfcp_fsf_ct_els),