diff options
Diffstat (limited to 'drivers/scsi/scsi_scan.c')
-rw-r--r-- | drivers/scsi/scsi_scan.c | 42 |
1 files changed, 18 insertions, 24 deletions
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 752fb5da3de4..f9ecc3dea7df 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
@@ -387,19 +387,12 @@ static struct scsi_target *scsi_alloc_target(struct device *parent, | |||
387 | return found_target; | 387 | return found_target; |
388 | } | 388 | } |
389 | 389 | ||
390 | struct work_queue_wrapper { | 390 | static void scsi_target_reap_usercontext(void *data) |
391 | struct work_struct work; | 391 | { |
392 | struct scsi_target *starget; | 392 | struct scsi_target *starget = data; |
393 | }; | ||
394 | |||
395 | static void scsi_target_reap_work(void *data) { | ||
396 | struct work_queue_wrapper *wqw = (struct work_queue_wrapper *)data; | ||
397 | struct scsi_target *starget = wqw->starget; | ||
398 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); | 393 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); |
399 | unsigned long flags; | 394 | unsigned long flags; |
400 | 395 | ||
401 | kfree(wqw); | ||
402 | |||
403 | spin_lock_irqsave(shost->host_lock, flags); | 396 | spin_lock_irqsave(shost->host_lock, flags); |
404 | 397 | ||
405 | if (--starget->reap_ref == 0 && list_empty(&starget->devices)) { | 398 | if (--starget->reap_ref == 0 && list_empty(&starget->devices)) { |
@@ -428,18 +421,7 @@ static void scsi_target_reap_work(void *data) { | |||
428 | */ | 421 | */ |
429 | void scsi_target_reap(struct scsi_target *starget) | 422 | void scsi_target_reap(struct scsi_target *starget) |
430 | { | 423 | { |
431 | struct work_queue_wrapper *wqw = | 424 | scsi_execute_in_process_context(scsi_target_reap_usercontext, starget); |
432 | kzalloc(sizeof(struct work_queue_wrapper), GFP_ATOMIC); | ||
433 | |||
434 | if (!wqw) { | ||
435 | starget_printk(KERN_ERR, starget, | ||
436 | "Failed to allocate memory in scsi_reap_target()\n"); | ||
437 | return; | ||
438 | } | ||
439 | |||
440 | INIT_WORK(&wqw->work, scsi_target_reap_work, wqw); | ||
441 | wqw->starget = starget; | ||
442 | schedule_work(&wqw->work); | ||
443 | } | 425 | } |
444 | 426 | ||
445 | /** | 427 | /** |
@@ -770,8 +752,20 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags) | |||
770 | 752 | ||
771 | transport_configure_device(&sdev->sdev_gendev); | 753 | transport_configure_device(&sdev->sdev_gendev); |
772 | 754 | ||
773 | if (sdev->host->hostt->slave_configure) | 755 | if (sdev->host->hostt->slave_configure) { |
774 | sdev->host->hostt->slave_configure(sdev); | 756 | int ret = sdev->host->hostt->slave_configure(sdev); |
757 | if (ret) { | ||
758 | /* | ||
759 | * if LLDD reports slave not present, don't clutter | ||
760 | * console with alloc failure messages | ||
761 | */ | ||
762 | if (ret != -ENXIO) { | ||
763 | sdev_printk(KERN_ERR, sdev, | ||
764 | "failed to configure device\n"); | ||
765 | } | ||
766 | return SCSI_SCAN_NO_RESPONSE; | ||
767 | } | ||
768 | } | ||
775 | 769 | ||
776 | /* | 770 | /* |
777 | * Ok, the device is now all set up, we can | 771 | * Ok, the device is now all set up, we can |