diff options
author | Christof Schmitt <christof.schmitt@de.ibm.com> | 2011-02-22 13:54:42 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2011-02-25 12:02:06 -0500 |
commit | fcf7e6144df60cd5082e5bc52f1ca5d1ca99a2d6 (patch) | |
tree | 0a8b078f47af2ed0e94dfb5cf887723af53a72a2 /drivers/s390/scsi | |
parent | 087897e36982ef8536dc9c8baed159a31517b5e6 (diff) |
[SCSI] zfcp: Allocate GID_PN data through new FC kmem_cache
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.
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: Steffen Maier <maier@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/s390/scsi')
-rw-r--r-- | drivers/s390/scsi/zfcp_aux.c | 10 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 1 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_fc.c | 80 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_fc.h | 25 |
4 files changed, 46 insertions, 70 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index adbc05c44362..6d2beb6ad9ee 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -132,11 +132,6 @@ static int __init zfcp_module_init(void) | |||
132 | if (!zfcp_data.qtcb_cache) | 132 | if (!zfcp_data.qtcb_cache) |
133 | goto out_qtcb_cache; | 133 | goto out_qtcb_cache; |
134 | 134 | ||
135 | zfcp_data.gid_pn_cache = zfcp_cache_hw_align("zfcp_gid", | ||
136 | sizeof(struct zfcp_fc_gid_pn)); | ||
137 | if (!zfcp_data.gid_pn_cache) | ||
138 | goto out_gid_cache; | ||
139 | |||
140 | zfcp_fc_req_cache = zfcp_cache_hw_align("zfcp_fc_req", | 135 | zfcp_fc_req_cache = zfcp_cache_hw_align("zfcp_fc_req", |
141 | sizeof(struct zfcp_fc_req)); | 136 | sizeof(struct zfcp_fc_req)); |
142 | if (!zfcp_fc_req_cache) | 137 | if (!zfcp_fc_req_cache) |
@@ -174,8 +169,6 @@ out_misc: | |||
174 | out_transport: | 169 | out_transport: |
175 | kmem_cache_destroy(zfcp_fc_req_cache); | 170 | kmem_cache_destroy(zfcp_fc_req_cache); |
176 | out_fc_cache: | 171 | out_fc_cache: |
177 | kmem_cache_destroy(zfcp_data.gid_pn_cache); | ||
178 | out_gid_cache: | ||
179 | kmem_cache_destroy(zfcp_data.qtcb_cache); | 172 | kmem_cache_destroy(zfcp_data.qtcb_cache); |
180 | out_qtcb_cache: | 173 | out_qtcb_cache: |
181 | kmem_cache_destroy(zfcp_data.gpn_ft_cache); | 174 | kmem_cache_destroy(zfcp_data.gpn_ft_cache); |
@@ -191,7 +184,6 @@ static void __exit zfcp_module_exit(void) | |||
191 | misc_deregister(&zfcp_cfdc_misc); | 184 | misc_deregister(&zfcp_cfdc_misc); |
192 | fc_release_transport(zfcp_data.scsi_transport_template); | 185 | fc_release_transport(zfcp_data.scsi_transport_template); |
193 | kmem_cache_destroy(zfcp_fc_req_cache); | 186 | kmem_cache_destroy(zfcp_fc_req_cache); |
194 | kmem_cache_destroy(zfcp_data.gid_pn_cache); | ||
195 | kmem_cache_destroy(zfcp_data.qtcb_cache); | 187 | kmem_cache_destroy(zfcp_data.qtcb_cache); |
196 | kmem_cache_destroy(zfcp_data.gpn_ft_cache); | 188 | kmem_cache_destroy(zfcp_data.gpn_ft_cache); |
197 | } | 189 | } |
@@ -263,7 +255,7 @@ static int zfcp_allocate_low_mem_buffers(struct zfcp_adapter *adapter) | |||
263 | return -ENOMEM; | 255 | return -ENOMEM; |
264 | 256 | ||
265 | adapter->pool.gid_pn = | 257 | adapter->pool.gid_pn = |
266 | mempool_create_slab_pool(1, zfcp_data.gid_pn_cache); | 258 | mempool_create_slab_pool(1, zfcp_fc_req_cache); |
267 | if (!adapter->pool.gid_pn) | 259 | if (!adapter->pool.gid_pn) |
268 | return -ENOMEM; | 260 | return -ENOMEM; |
269 | 261 | ||
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 233cbf16259f..dbf59108e1f4 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -319,7 +319,6 @@ struct zfcp_data { | |||
319 | struct scsi_transport_template *scsi_transport_template; | 319 | struct scsi_transport_template *scsi_transport_template; |
320 | struct kmem_cache *gpn_ft_cache; | 320 | struct kmem_cache *gpn_ft_cache; |
321 | struct kmem_cache *qtcb_cache; | 321 | struct kmem_cache *qtcb_cache; |
322 | struct kmem_cache *gid_pn_cache; | ||
323 | }; | 322 | }; |
324 | 323 | ||
325 | #endif /* ZFCP_DEF_H */ | 324 | #endif /* ZFCP_DEF_H */ |
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index e020dec85294..982455603349 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
@@ -262,24 +262,18 @@ void zfcp_fc_incoming_els(struct zfcp_fsf_req *fsf_req) | |||
262 | zfcp_fc_incoming_rscn(fsf_req); | 262 | zfcp_fc_incoming_rscn(fsf_req); |
263 | } | 263 | } |
264 | 264 | ||
265 | static void zfcp_fc_ns_gid_pn_eval(void *data) | 265 | static void zfcp_fc_ns_gid_pn_eval(struct zfcp_fc_req *fc_req) |
266 | { | 266 | { |
267 | struct zfcp_fc_gid_pn *gid_pn = data; | 267 | struct zfcp_fsf_ct_els *ct_els = &fc_req->ct_els; |
268 | struct zfcp_fsf_ct_els *ct = &gid_pn->ct; | 268 | struct zfcp_fc_gid_pn_rsp *gid_pn_rsp = &fc_req->u.gid_pn.rsp; |
269 | struct zfcp_fc_gid_pn_req *gid_pn_req = sg_virt(ct->req); | ||
270 | struct zfcp_fc_gid_pn_resp *gid_pn_resp = sg_virt(ct->resp); | ||
271 | struct zfcp_port *port = gid_pn->port; | ||
272 | 269 | ||
273 | if (ct->status) | 270 | if (ct_els->status) |
274 | return; | 271 | return; |
275 | if (gid_pn_resp->ct_hdr.ct_cmd != FC_FS_ACC) | 272 | if (gid_pn_rsp->ct_hdr.ct_cmd != FC_FS_ACC) |
276 | return; | 273 | return; |
277 | 274 | ||
278 | /* paranoia */ | ||
279 | if (gid_pn_req->gid_pn.fn_wwpn != port->wwpn) | ||
280 | return; | ||
281 | /* looks like a valid d_id */ | 275 | /* looks like a valid d_id */ |
282 | port->d_id = ntoh24(gid_pn_resp->gid_pn.fp_fid); | 276 | ct_els->port->d_id = ntoh24(gid_pn_rsp->gid_pn.fp_fid); |
283 | } | 277 | } |
284 | 278 | ||
285 | static void zfcp_fc_complete(void *data) | 279 | static void zfcp_fc_complete(void *data) |
@@ -287,69 +281,73 @@ static void zfcp_fc_complete(void *data) | |||
287 | complete(data); | 281 | complete(data); |
288 | } | 282 | } |
289 | 283 | ||
284 | static void zfcp_fc_ct_ns_init(struct fc_ct_hdr *ct_hdr, u16 cmd, u16 mr_size) | ||
285 | { | ||
286 | ct_hdr->ct_rev = FC_CT_REV; | ||
287 | ct_hdr->ct_fs_type = FC_FST_DIR; | ||
288 | ct_hdr->ct_fs_subtype = FC_NS_SUBTYPE; | ||
289 | ct_hdr->ct_cmd = cmd; | ||
290 | ct_hdr->ct_mr_size = mr_size / 4; | ||
291 | } | ||
292 | |||
290 | static int zfcp_fc_ns_gid_pn_request(struct zfcp_port *port, | 293 | static int zfcp_fc_ns_gid_pn_request(struct zfcp_port *port, |
291 | struct zfcp_fc_gid_pn *gid_pn) | 294 | struct zfcp_fc_req *fc_req) |
292 | { | 295 | { |
293 | struct zfcp_adapter *adapter = port->adapter; | 296 | struct zfcp_adapter *adapter = port->adapter; |
294 | DECLARE_COMPLETION_ONSTACK(completion); | 297 | DECLARE_COMPLETION_ONSTACK(completion); |
298 | struct zfcp_fc_gid_pn_req *gid_pn_req = &fc_req->u.gid_pn.req; | ||
299 | struct zfcp_fc_gid_pn_rsp *gid_pn_rsp = &fc_req->u.gid_pn.rsp; | ||
295 | int ret; | 300 | int ret; |
296 | 301 | ||
297 | /* setup parameters for send generic command */ | 302 | /* setup parameters for send generic command */ |
298 | gid_pn->port = port; | 303 | fc_req->ct_els.port = port; |
299 | gid_pn->ct.handler = zfcp_fc_complete; | 304 | fc_req->ct_els.handler = zfcp_fc_complete; |
300 | gid_pn->ct.handler_data = &completion; | 305 | fc_req->ct_els.handler_data = &completion; |
301 | gid_pn->ct.req = &gid_pn->sg_req; | 306 | fc_req->ct_els.req = &fc_req->sg_req; |
302 | gid_pn->ct.resp = &gid_pn->sg_resp; | 307 | fc_req->ct_els.resp = &fc_req->sg_rsp; |
303 | sg_init_one(&gid_pn->sg_req, &gid_pn->gid_pn_req, | 308 | sg_init_one(&fc_req->sg_req, gid_pn_req, sizeof(*gid_pn_req)); |
304 | sizeof(struct zfcp_fc_gid_pn_req)); | 309 | sg_init_one(&fc_req->sg_rsp, gid_pn_rsp, sizeof(*gid_pn_rsp)); |
305 | sg_init_one(&gid_pn->sg_resp, &gid_pn->gid_pn_resp, | 310 | |
306 | sizeof(struct zfcp_fc_gid_pn_resp)); | 311 | zfcp_fc_ct_ns_init(&gid_pn_req->ct_hdr, |
307 | 312 | FC_NS_GID_PN, ZFCP_FC_CT_SIZE_PAGE); | |
308 | /* setup nameserver request */ | 313 | gid_pn_req->gid_pn.fn_wwpn = port->wwpn; |
309 | gid_pn->gid_pn_req.ct_hdr.ct_rev = FC_CT_REV; | 314 | |
310 | gid_pn->gid_pn_req.ct_hdr.ct_fs_type = FC_FST_DIR; | 315 | ret = zfcp_fsf_send_ct(&adapter->gs->ds, &fc_req->ct_els, |
311 | gid_pn->gid_pn_req.ct_hdr.ct_fs_subtype = FC_NS_SUBTYPE; | ||
312 | gid_pn->gid_pn_req.ct_hdr.ct_options = 0; | ||
313 | gid_pn->gid_pn_req.ct_hdr.ct_cmd = FC_NS_GID_PN; | ||
314 | gid_pn->gid_pn_req.ct_hdr.ct_mr_size = ZFCP_FC_CT_SIZE_PAGE / 4; | ||
315 | gid_pn->gid_pn_req.gid_pn.fn_wwpn = port->wwpn; | ||
316 | |||
317 | ret = zfcp_fsf_send_ct(&adapter->gs->ds, &gid_pn->ct, | ||
318 | adapter->pool.gid_pn_req, | 316 | adapter->pool.gid_pn_req, |
319 | ZFCP_FC_CTELS_TMO); | 317 | ZFCP_FC_CTELS_TMO); |
320 | if (!ret) { | 318 | if (!ret) { |
321 | wait_for_completion(&completion); | 319 | wait_for_completion(&completion); |
322 | zfcp_fc_ns_gid_pn_eval(gid_pn); | 320 | zfcp_fc_ns_gid_pn_eval(fc_req); |
323 | } | 321 | } |
324 | return ret; | 322 | return ret; |
325 | } | 323 | } |
326 | 324 | ||
327 | /** | 325 | /** |
328 | * zfcp_fc_ns_gid_pn_request - initiate GID_PN nameserver request | 326 | * zfcp_fc_ns_gid_pn - initiate GID_PN nameserver request |
329 | * @port: port where GID_PN request is needed | 327 | * @port: port where GID_PN request is needed |
330 | * return: -ENOMEM on error, 0 otherwise | 328 | * return: -ENOMEM on error, 0 otherwise |
331 | */ | 329 | */ |
332 | static int zfcp_fc_ns_gid_pn(struct zfcp_port *port) | 330 | static int zfcp_fc_ns_gid_pn(struct zfcp_port *port) |
333 | { | 331 | { |
334 | int ret; | 332 | int ret; |
335 | struct zfcp_fc_gid_pn *gid_pn; | 333 | struct zfcp_fc_req *fc_req; |
336 | struct zfcp_adapter *adapter = port->adapter; | 334 | struct zfcp_adapter *adapter = port->adapter; |
337 | 335 | ||
338 | gid_pn = mempool_alloc(adapter->pool.gid_pn, GFP_ATOMIC); | 336 | fc_req = mempool_alloc(adapter->pool.gid_pn, GFP_ATOMIC); |
339 | if (!gid_pn) | 337 | if (!fc_req) |
340 | return -ENOMEM; | 338 | return -ENOMEM; |
341 | 339 | ||
342 | memset(gid_pn, 0, sizeof(*gid_pn)); | 340 | memset(fc_req, 0, sizeof(*fc_req)); |
343 | 341 | ||
344 | ret = zfcp_fc_wka_port_get(&adapter->gs->ds); | 342 | ret = zfcp_fc_wka_port_get(&adapter->gs->ds); |
345 | if (ret) | 343 | if (ret) |
346 | goto out; | 344 | goto out; |
347 | 345 | ||
348 | ret = zfcp_fc_ns_gid_pn_request(port, gid_pn); | 346 | ret = zfcp_fc_ns_gid_pn_request(port, fc_req); |
349 | 347 | ||
350 | zfcp_fc_wka_port_put(&adapter->gs->ds); | 348 | zfcp_fc_wka_port_put(&adapter->gs->ds); |
351 | out: | 349 | out: |
352 | mempool_free(gid_pn, adapter->pool.gid_pn); | 350 | mempool_free(fc_req, adapter->pool.gid_pn); |
353 | return ret; | 351 | return ret; |
354 | } | 352 | } |
355 | 353 | ||
diff --git a/drivers/s390/scsi/zfcp_fc.h b/drivers/s390/scsi/zfcp_fc.h index 4351b4e81b3c..200fe2501332 100644 --- a/drivers/s390/scsi/zfcp_fc.h +++ b/drivers/s390/scsi/zfcp_fc.h | |||
@@ -64,33 +64,16 @@ struct zfcp_fc_gid_pn_req { | |||
64 | } __packed; | 64 | } __packed; |
65 | 65 | ||
66 | /** | 66 | /** |
67 | * struct zfcp_fc_gid_pn_resp - container for ct header plus gid_pn response | 67 | * struct zfcp_fc_gid_pn_rsp - container for ct header plus gid_pn response |
68 | * @ct_hdr: FC GS common transport header | 68 | * @ct_hdr: FC GS common transport header |
69 | * @gid_pn: GID_PN response | 69 | * @gid_pn: GID_PN response |
70 | */ | 70 | */ |
71 | struct zfcp_fc_gid_pn_resp { | 71 | struct zfcp_fc_gid_pn_rsp { |
72 | struct fc_ct_hdr ct_hdr; | 72 | struct fc_ct_hdr ct_hdr; |
73 | struct fc_gid_pn_resp gid_pn; | 73 | struct fc_gid_pn_resp gid_pn; |
74 | } __packed; | 74 | } __packed; |
75 | 75 | ||
76 | /** | 76 | /** |
77 | * struct zfcp_fc_gid_pn - everything required in zfcp for gid_pn request | ||
78 | * @ct: data passed to zfcp_fsf for issuing fsf request | ||
79 | * @sg_req: scatterlist entry for request data | ||
80 | * @sg_resp: scatterlist entry for response data | ||
81 | * @gid_pn_req: GID_PN request data | ||
82 | * @gid_pn_resp: GID_PN response data | ||
83 | */ | ||
84 | struct zfcp_fc_gid_pn { | ||
85 | struct zfcp_fsf_ct_els ct; | ||
86 | struct scatterlist sg_req; | ||
87 | struct scatterlist sg_resp; | ||
88 | struct zfcp_fc_gid_pn_req gid_pn_req; | ||
89 | struct zfcp_fc_gid_pn_resp gid_pn_resp; | ||
90 | struct zfcp_port *port; | ||
91 | }; | ||
92 | |||
93 | /** | ||
94 | * struct zfcp_fc_gpn_ft - container for ct header plus gpn_ft request | 77 | * struct zfcp_fc_gpn_ft - container for ct header plus gpn_ft request |
95 | * @ct_hdr: FC GS common transport header | 78 | * @ct_hdr: FC GS common transport header |
96 | * @gpn_ft: GPN_FT request | 79 | * @gpn_ft: GPN_FT request |
@@ -138,6 +121,10 @@ struct zfcp_fc_req { | |||
138 | struct fc_els_adisc req; | 121 | struct fc_els_adisc req; |
139 | struct fc_els_adisc rsp; | 122 | struct fc_els_adisc rsp; |
140 | } adisc; | 123 | } adisc; |
124 | struct { | ||
125 | struct zfcp_fc_gid_pn_req req; | ||
126 | struct zfcp_fc_gid_pn_rsp rsp; | ||
127 | } gid_pn; | ||
141 | } u; | 128 | } u; |
142 | }; | 129 | }; |
143 | 130 | ||