diff options
Diffstat (limited to 'drivers/s390/scsi/zfcp_aux.c')
| -rw-r--r-- | drivers/s390/scsi/zfcp_aux.c | 90 |
1 files changed, 28 insertions, 62 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index 9d0c941b7d33..66d6c01fcf3e 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
| @@ -3,7 +3,7 @@ | |||
| 3 | * | 3 | * |
| 4 | * Module interface and handling of zfcp data structures. | 4 | * Module interface and handling of zfcp data structures. |
| 5 | * | 5 | * |
| 6 | * Copyright IBM Corporation 2002, 2009 | 6 | * Copyright IBM Corporation 2002, 2010 |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | /* | 9 | /* |
| @@ -32,6 +32,7 @@ | |||
| 32 | #include <linux/seq_file.h> | 32 | #include <linux/seq_file.h> |
| 33 | #include "zfcp_ext.h" | 33 | #include "zfcp_ext.h" |
| 34 | #include "zfcp_fc.h" | 34 | #include "zfcp_fc.h" |
| 35 | #include "zfcp_reqlist.h" | ||
| 35 | 36 | ||
| 36 | #define ZFCP_BUS_ID_SIZE 20 | 37 | #define ZFCP_BUS_ID_SIZE 20 |
| 37 | 38 | ||
| @@ -49,36 +50,6 @@ static struct kmem_cache *zfcp_cache_hw_align(const char *name, | |||
| 49 | return kmem_cache_create(name, size, roundup_pow_of_two(size), 0, NULL); | 50 | return kmem_cache_create(name, size, roundup_pow_of_two(size), 0, NULL); |
| 50 | } | 51 | } |
| 51 | 52 | ||
| 52 | static int zfcp_reqlist_alloc(struct zfcp_adapter *adapter) | ||
| 53 | { | ||
| 54 | int idx; | ||
| 55 | |||
| 56 | adapter->req_list = kcalloc(REQUEST_LIST_SIZE, sizeof(struct list_head), | ||
| 57 | GFP_KERNEL); | ||
| 58 | if (!adapter->req_list) | ||
| 59 | return -ENOMEM; | ||
| 60 | |||
| 61 | for (idx = 0; idx < REQUEST_LIST_SIZE; idx++) | ||
| 62 | INIT_LIST_HEAD(&adapter->req_list[idx]); | ||
| 63 | return 0; | ||
| 64 | } | ||
| 65 | |||
| 66 | /** | ||
| 67 | * zfcp_reqlist_isempty - is the request list empty | ||
| 68 | * @adapter: pointer to struct zfcp_adapter | ||
| 69 | * | ||
| 70 | * Returns: true if list is empty, false otherwise | ||
| 71 | */ | ||
| 72 | int zfcp_reqlist_isempty(struct zfcp_adapter *adapter) | ||
| 73 | { | ||
| 74 | unsigned int idx; | ||
| 75 | |||
| 76 | for (idx = 0; idx < REQUEST_LIST_SIZE; idx++) | ||
| 77 | if (!list_empty(&adapter->req_list[idx])) | ||
| 78 | return 0; | ||
| 79 | return 1; | ||
| 80 | } | ||
| 81 | |||
| 82 | static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun) | 53 | static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun) |
| 83 | { | 54 | { |
| 84 | struct ccw_device *cdev; | 55 | struct ccw_device *cdev; |
| @@ -110,7 +81,7 @@ static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun) | |||
| 110 | flush_work(&unit->scsi_work); | 81 | flush_work(&unit->scsi_work); |
| 111 | 82 | ||
| 112 | out_unit: | 83 | out_unit: |
| 113 | put_device(&port->sysfs_device); | 84 | put_device(&port->dev); |
| 114 | out_port: | 85 | out_port: |
| 115 | zfcp_ccw_adapter_put(adapter); | 86 | zfcp_ccw_adapter_put(adapter); |
| 116 | out_ccw_device: | 87 | out_ccw_device: |
| @@ -255,7 +226,7 @@ struct zfcp_unit *zfcp_get_unit_by_lun(struct zfcp_port *port, u64 fcp_lun) | |||
| 255 | read_lock_irqsave(&port->unit_list_lock, flags); | 226 | read_lock_irqsave(&port->unit_list_lock, flags); |
| 256 | list_for_each_entry(unit, &port->unit_list, list) | 227 | list_for_each_entry(unit, &port->unit_list, list) |
| 257 | if (unit->fcp_lun == fcp_lun) { | 228 | if (unit->fcp_lun == fcp_lun) { |
| 258 | if (!get_device(&unit->sysfs_device)) | 229 | if (!get_device(&unit->dev)) |
| 259 | unit = NULL; | 230 | unit = NULL; |
| 260 | read_unlock_irqrestore(&port->unit_list_lock, flags); | 231 | read_unlock_irqrestore(&port->unit_list_lock, flags); |
| 261 | return unit; | 232 | return unit; |
| @@ -280,7 +251,7 @@ struct zfcp_port *zfcp_get_port_by_wwpn(struct zfcp_adapter *adapter, | |||
| 280 | read_lock_irqsave(&adapter->port_list_lock, flags); | 251 | read_lock_irqsave(&adapter->port_list_lock, flags); |
| 281 | list_for_each_entry(port, &adapter->port_list, list) | 252 | list_for_each_entry(port, &adapter->port_list, list) |
| 282 | if (port->wwpn == wwpn) { | 253 | if (port->wwpn == wwpn) { |
| 283 | if (!get_device(&port->sysfs_device)) | 254 | if (!get_device(&port->dev)) |
| 284 | port = NULL; | 255 | port = NULL; |
| 285 | read_unlock_irqrestore(&adapter->port_list_lock, flags); | 256 | read_unlock_irqrestore(&adapter->port_list_lock, flags); |
| 286 | return port; | 257 | return port; |
| @@ -298,10 +269,9 @@ struct zfcp_port *zfcp_get_port_by_wwpn(struct zfcp_adapter *adapter, | |||
| 298 | */ | 269 | */ |
| 299 | static void zfcp_unit_release(struct device *dev) | 270 | static void zfcp_unit_release(struct device *dev) |
| 300 | { | 271 | { |
| 301 | struct zfcp_unit *unit = container_of(dev, struct zfcp_unit, | 272 | struct zfcp_unit *unit = container_of(dev, struct zfcp_unit, dev); |
| 302 | sysfs_device); | ||
| 303 | 273 | ||
| 304 | put_device(&unit->port->sysfs_device); | 274 | put_device(&unit->port->dev); |
| 305 | kfree(unit); | 275 | kfree(unit); |
| 306 | } | 276 | } |
| 307 | 277 | ||
| @@ -318,11 +288,11 @@ struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun) | |||
| 318 | struct zfcp_unit *unit; | 288 | struct zfcp_unit *unit; |
| 319 | int retval = -ENOMEM; | 289 | int retval = -ENOMEM; |
| 320 | 290 | ||
| 321 | get_device(&port->sysfs_device); | 291 | get_device(&port->dev); |
| 322 | 292 | ||
| 323 | unit = zfcp_get_unit_by_lun(port, fcp_lun); | 293 | unit = zfcp_get_unit_by_lun(port, fcp_lun); |
| 324 | if (unit) { | 294 | if (unit) { |
| 325 | put_device(&unit->sysfs_device); | 295 | put_device(&unit->dev); |
| 326 | retval = -EEXIST; | 296 | retval = -EEXIST; |
| 327 | goto err_out; | 297 | goto err_out; |
| 328 | } | 298 | } |
| @@ -333,10 +303,10 @@ struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun) | |||
| 333 | 303 | ||
| 334 | unit->port = port; | 304 | unit->port = port; |
| 335 | unit->fcp_lun = fcp_lun; | 305 | unit->fcp_lun = fcp_lun; |
| 336 | unit->sysfs_device.parent = &port->sysfs_device; | 306 | unit->dev.parent = &port->dev; |
| 337 | unit->sysfs_device.release = zfcp_unit_release; | 307 | unit->dev.release = zfcp_unit_release; |
| 338 | 308 | ||
| 339 | if (dev_set_name(&unit->sysfs_device, "0x%016llx", | 309 | if (dev_set_name(&unit->dev, "0x%016llx", |
| 340 | (unsigned long long) fcp_lun)) { | 310 | (unsigned long long) fcp_lun)) { |
| 341 | kfree(unit); | 311 | kfree(unit); |
| 342 | goto err_out; | 312 | goto err_out; |
| @@ -353,13 +323,12 @@ struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun) | |||
| 353 | unit->latencies.cmd.channel.min = 0xFFFFFFFF; | 323 | unit->latencies.cmd.channel.min = 0xFFFFFFFF; |
| 354 | unit->latencies.cmd.fabric.min = 0xFFFFFFFF; | 324 | unit->latencies.cmd.fabric.min = 0xFFFFFFFF; |
| 355 | 325 | ||
| 356 | if (device_register(&unit->sysfs_device)) { | 326 | if (device_register(&unit->dev)) { |
| 357 | put_device(&unit->sysfs_device); | 327 | put_device(&unit->dev); |
| 358 | goto err_out; | 328 | goto err_out; |
| 359 | } | 329 | } |
| 360 | 330 | ||
| 361 | if (sysfs_create_group(&unit->sysfs_device.kobj, | 331 | if (sysfs_create_group(&unit->dev.kobj, &zfcp_sysfs_unit_attrs)) |
| 362 | &zfcp_sysfs_unit_attrs)) | ||
| 363 | goto err_out_put; | 332 | goto err_out_put; |
| 364 | 333 | ||
| 365 | write_lock_irq(&port->unit_list_lock); | 334 | write_lock_irq(&port->unit_list_lock); |
| @@ -371,9 +340,9 @@ struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun) | |||
| 371 | return unit; | 340 | return unit; |
| 372 | 341 | ||
| 373 | err_out_put: | 342 | err_out_put: |
| 374 | device_unregister(&unit->sysfs_device); | 343 | device_unregister(&unit->dev); |
| 375 | err_out: | 344 | err_out: |
| 376 | put_device(&port->sysfs_device); | 345 | put_device(&port->dev); |
| 377 | return ERR_PTR(retval); | 346 | return ERR_PTR(retval); |
| 378 | } | 347 | } |
| 379 | 348 | ||
| @@ -539,7 +508,8 @@ struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *ccw_device) | |||
| 539 | if (zfcp_allocate_low_mem_buffers(adapter)) | 508 | if (zfcp_allocate_low_mem_buffers(adapter)) |
| 540 | goto failed; | 509 | goto failed; |
| 541 | 510 | ||
| 542 | if (zfcp_reqlist_alloc(adapter)) | 511 | adapter->req_list = zfcp_reqlist_alloc(); |
| 512 | if (!adapter->req_list) | ||
| 543 | goto failed; | 513 | goto failed; |
| 544 | 514 | ||
| 545 | if (zfcp_dbf_adapter_register(adapter)) | 515 | if (zfcp_dbf_adapter_register(adapter)) |
| @@ -560,8 +530,6 @@ struct zfcp_adapter *zfcp_adapter_enqueue(struct ccw_device *ccw_device) | |||
| 560 | INIT_LIST_HEAD(&adapter->erp_ready_head); | 530 | INIT_LIST_HEAD(&adapter->erp_ready_head); |
| 561 | INIT_LIST_HEAD(&adapter->erp_running_head); | 531 | INIT_LIST_HEAD(&adapter->erp_running_head); |
| 562 | 532 | ||
| 563 | spin_lock_init(&adapter->req_list_lock); | ||
| 564 | |||
| 565 | rwlock_init(&adapter->erp_lock); | 533 | rwlock_init(&adapter->erp_lock); |
| 566 | rwlock_init(&adapter->abort_lock); | 534 | rwlock_init(&adapter->abort_lock); |
| 567 | 535 | ||
| @@ -640,8 +608,7 @@ void zfcp_device_unregister(struct device *dev, | |||
| 640 | 608 | ||
| 641 | static void zfcp_port_release(struct device *dev) | 609 | static void zfcp_port_release(struct device *dev) |
| 642 | { | 610 | { |
| 643 | struct zfcp_port *port = container_of(dev, struct zfcp_port, | 611 | struct zfcp_port *port = container_of(dev, struct zfcp_port, dev); |
| 644 | sysfs_device); | ||
| 645 | 612 | ||
| 646 | zfcp_ccw_adapter_put(port->adapter); | 613 | zfcp_ccw_adapter_put(port->adapter); |
| 647 | kfree(port); | 614 | kfree(port); |
| @@ -669,7 +636,7 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn, | |||
| 669 | 636 | ||
| 670 | port = zfcp_get_port_by_wwpn(adapter, wwpn); | 637 | port = zfcp_get_port_by_wwpn(adapter, wwpn); |
| 671 | if (port) { | 638 | if (port) { |
| 672 | put_device(&port->sysfs_device); | 639 | put_device(&port->dev); |
| 673 | retval = -EEXIST; | 640 | retval = -EEXIST; |
| 674 | goto err_out; | 641 | goto err_out; |
| 675 | } | 642 | } |
| @@ -689,22 +656,21 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn, | |||
| 689 | port->d_id = d_id; | 656 | port->d_id = d_id; |
| 690 | port->wwpn = wwpn; | 657 | port->wwpn = wwpn; |
| 691 | port->rport_task = RPORT_NONE; | 658 | port->rport_task = RPORT_NONE; |
| 692 | port->sysfs_device.parent = &adapter->ccw_device->dev; | 659 | port->dev.parent = &adapter->ccw_device->dev; |
| 693 | port->sysfs_device.release = zfcp_port_release; | 660 | port->dev.release = zfcp_port_release; |
| 694 | 661 | ||
| 695 | if (dev_set_name(&port->sysfs_device, "0x%016llx", | 662 | if (dev_set_name(&port->dev, "0x%016llx", (unsigned long long)wwpn)) { |
| 696 | (unsigned long long)wwpn)) { | ||
| 697 | kfree(port); | 663 | kfree(port); |
| 698 | goto err_out; | 664 | goto err_out; |
| 699 | } | 665 | } |
| 700 | retval = -EINVAL; | 666 | retval = -EINVAL; |
| 701 | 667 | ||
| 702 | if (device_register(&port->sysfs_device)) { | 668 | if (device_register(&port->dev)) { |
| 703 | put_device(&port->sysfs_device); | 669 | put_device(&port->dev); |
| 704 | goto err_out; | 670 | goto err_out; |
| 705 | } | 671 | } |
| 706 | 672 | ||
| 707 | if (sysfs_create_group(&port->sysfs_device.kobj, | 673 | if (sysfs_create_group(&port->dev.kobj, |
| 708 | &zfcp_sysfs_port_attrs)) | 674 | &zfcp_sysfs_port_attrs)) |
| 709 | goto err_out_put; | 675 | goto err_out_put; |
| 710 | 676 | ||
| @@ -717,7 +683,7 @@ struct zfcp_port *zfcp_port_enqueue(struct zfcp_adapter *adapter, u64 wwpn, | |||
| 717 | return port; | 683 | return port; |
| 718 | 684 | ||
| 719 | err_out_put: | 685 | err_out_put: |
| 720 | device_unregister(&port->sysfs_device); | 686 | device_unregister(&port->dev); |
| 721 | err_out: | 687 | err_out: |
| 722 | zfcp_ccw_adapter_put(adapter); | 688 | zfcp_ccw_adapter_put(adapter); |
| 723 | return ERR_PTR(retval); | 689 | return ERR_PTR(retval); |
