diff options
| -rw-r--r-- | drivers/s390/scsi/zfcp_aux.c | 8 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 1 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_fc.c | 11 |
3 files changed, 17 insertions, 3 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index 58bb17732f56..9d0c941b7d33 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
| @@ -179,6 +179,11 @@ static int __init zfcp_module_init(void) | |||
| 179 | if (!zfcp_data.gid_pn_cache) | 179 | if (!zfcp_data.gid_pn_cache) |
| 180 | goto out_gid_cache; | 180 | goto out_gid_cache; |
| 181 | 181 | ||
| 182 | zfcp_data.adisc_cache = zfcp_cache_hw_align("zfcp_adisc", | ||
| 183 | sizeof(struct zfcp_fc_els_adisc)); | ||
| 184 | if (!zfcp_data.adisc_cache) | ||
| 185 | goto out_adisc_cache; | ||
| 186 | |||
| 182 | zfcp_data.scsi_transport_template = | 187 | zfcp_data.scsi_transport_template = |
| 183 | fc_attach_transport(&zfcp_transport_functions); | 188 | fc_attach_transport(&zfcp_transport_functions); |
| 184 | if (!zfcp_data.scsi_transport_template) | 189 | if (!zfcp_data.scsi_transport_template) |
| @@ -206,6 +211,8 @@ out_ccw_register: | |||
| 206 | out_misc: | 211 | out_misc: |
| 207 | fc_release_transport(zfcp_data.scsi_transport_template); | 212 | fc_release_transport(zfcp_data.scsi_transport_template); |
| 208 | out_transport: | 213 | out_transport: |
| 214 | kmem_cache_destroy(zfcp_data.adisc_cache); | ||
| 215 | out_adisc_cache: | ||
| 209 | kmem_cache_destroy(zfcp_data.gid_pn_cache); | 216 | kmem_cache_destroy(zfcp_data.gid_pn_cache); |
| 210 | out_gid_cache: | 217 | out_gid_cache: |
| 211 | kmem_cache_destroy(zfcp_data.sr_buffer_cache); | 218 | kmem_cache_destroy(zfcp_data.sr_buffer_cache); |
| @@ -224,6 +231,7 @@ static void __exit zfcp_module_exit(void) | |||
| 224 | ccw_driver_unregister(&zfcp_ccw_driver); | 231 | ccw_driver_unregister(&zfcp_ccw_driver); |
| 225 | misc_deregister(&zfcp_cfdc_misc); | 232 | misc_deregister(&zfcp_cfdc_misc); |
| 226 | fc_release_transport(zfcp_data.scsi_transport_template); | 233 | fc_release_transport(zfcp_data.scsi_transport_template); |
| 234 | kmem_cache_destroy(zfcp_data.adisc_cache); | ||
| 227 | kmem_cache_destroy(zfcp_data.gid_pn_cache); | 235 | kmem_cache_destroy(zfcp_data.gid_pn_cache); |
| 228 | kmem_cache_destroy(zfcp_data.sr_buffer_cache); | 236 | kmem_cache_destroy(zfcp_data.sr_buffer_cache); |
| 229 | kmem_cache_destroy(zfcp_data.qtcb_cache); | 237 | kmem_cache_destroy(zfcp_data.qtcb_cache); |
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 21b29804a7a6..469d57f105db 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
| @@ -347,6 +347,7 @@ struct zfcp_data { | |||
| 347 | struct kmem_cache *qtcb_cache; | 347 | struct kmem_cache *qtcb_cache; |
| 348 | struct kmem_cache *sr_buffer_cache; | 348 | struct kmem_cache *sr_buffer_cache; |
| 349 | struct kmem_cache *gid_pn_cache; | 349 | struct kmem_cache *gid_pn_cache; |
| 350 | struct kmem_cache *adisc_cache; | ||
| 350 | }; | 351 | }; |
| 351 | 352 | ||
| 352 | /********************** ZFCP SPECIFIC DEFINES ********************************/ | 353 | /********************** ZFCP SPECIFIC DEFINES ********************************/ |
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index 6d5ccc053e3a..ac5e3b7a3576 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
| @@ -389,15 +389,16 @@ static void zfcp_fc_adisc_handler(void *data) | |||
| 389 | out: | 389 | out: |
| 390 | atomic_clear_mask(ZFCP_STATUS_PORT_LINK_TEST, &port->status); | 390 | atomic_clear_mask(ZFCP_STATUS_PORT_LINK_TEST, &port->status); |
| 391 | put_device(&port->sysfs_device); | 391 | put_device(&port->sysfs_device); |
| 392 | kfree(adisc); | 392 | kmem_cache_free(zfcp_data.adisc_cache, adisc); |
| 393 | } | 393 | } |
| 394 | 394 | ||
| 395 | static int zfcp_fc_adisc(struct zfcp_port *port) | 395 | static int zfcp_fc_adisc(struct zfcp_port *port) |
| 396 | { | 396 | { |
| 397 | struct zfcp_fc_els_adisc *adisc; | 397 | struct zfcp_fc_els_adisc *adisc; |
| 398 | struct zfcp_adapter *adapter = port->adapter; | 398 | struct zfcp_adapter *adapter = port->adapter; |
| 399 | int ret; | ||
| 399 | 400 | ||
| 400 | adisc = kzalloc(sizeof(struct zfcp_fc_els_adisc), GFP_ATOMIC); | 401 | adisc = kmem_cache_alloc(zfcp_data.adisc_cache, GFP_ATOMIC); |
| 401 | if (!adisc) | 402 | if (!adisc) |
| 402 | return -ENOMEM; | 403 | return -ENOMEM; |
| 403 | 404 | ||
| @@ -420,7 +421,11 @@ static int zfcp_fc_adisc(struct zfcp_port *port) | |||
| 420 | hton24(adisc->adisc_req.adisc_port_id, | 421 | hton24(adisc->adisc_req.adisc_port_id, |
| 421 | fc_host_port_id(adapter->scsi_host)); | 422 | fc_host_port_id(adapter->scsi_host)); |
| 422 | 423 | ||
| 423 | return zfcp_fsf_send_els(adapter, port->d_id, &adisc->els); | 424 | ret = zfcp_fsf_send_els(adapter, port->d_id, &adisc->els); |
| 425 | if (ret) | ||
| 426 | kmem_cache_free(zfcp_data.adisc_cache, adisc); | ||
| 427 | |||
| 428 | return ret; | ||
| 424 | } | 429 | } |
| 425 | 430 | ||
| 426 | void zfcp_fc_link_test_work(struct work_struct *work) | 431 | void zfcp_fc_link_test_work(struct work_struct *work) |
