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); |