diff options
| -rw-r--r-- | drivers/scsi/hosts.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 24271a871b8c..6325115e5b3d 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c | |||
| @@ -429,6 +429,15 @@ void scsi_unregister(struct Scsi_Host *shost) | |||
| 429 | } | 429 | } |
| 430 | EXPORT_SYMBOL(scsi_unregister); | 430 | EXPORT_SYMBOL(scsi_unregister); |
| 431 | 431 | ||
| 432 | static int __scsi_host_match(struct class_device *cdev, void *data) | ||
| 433 | { | ||
| 434 | struct Scsi_Host *p; | ||
| 435 | unsigned short *hostnum = (unsigned short *)data; | ||
| 436 | |||
| 437 | p = class_to_shost(cdev); | ||
| 438 | return p->host_no == *hostnum; | ||
| 439 | } | ||
| 440 | |||
| 432 | /** | 441 | /** |
| 433 | * scsi_host_lookup - get a reference to a Scsi_Host by host no | 442 | * scsi_host_lookup - get a reference to a Scsi_Host by host no |
| 434 | * | 443 | * |
| @@ -439,19 +448,12 @@ EXPORT_SYMBOL(scsi_unregister); | |||
| 439 | **/ | 448 | **/ |
| 440 | struct Scsi_Host *scsi_host_lookup(unsigned short hostnum) | 449 | struct Scsi_Host *scsi_host_lookup(unsigned short hostnum) |
| 441 | { | 450 | { |
| 442 | struct class *class = &shost_class; | ||
| 443 | struct class_device *cdev; | 451 | struct class_device *cdev; |
| 444 | struct Scsi_Host *shost = ERR_PTR(-ENXIO), *p; | 452 | struct Scsi_Host *shost = ERR_PTR(-ENXIO); |
| 445 | 453 | ||
| 446 | down(&class->sem); | 454 | cdev = class_find_child(&shost_class, &hostnum, __scsi_host_match); |
| 447 | list_for_each_entry(cdev, &class->children, node) { | 455 | if (cdev) |
| 448 | p = class_to_shost(cdev); | 456 | shost = scsi_host_get(class_to_shost(cdev)); |
| 449 | if (p->host_no == hostnum) { | ||
| 450 | shost = scsi_host_get(p); | ||
| 451 | break; | ||
| 452 | } | ||
| 453 | } | ||
| 454 | up(&class->sem); | ||
| 455 | 457 | ||
| 456 | return shost; | 458 | return shost; |
| 457 | } | 459 | } |
