diff options
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libata-core.c | 20 | ||||
-rw-r--r-- | drivers/ata/libata-eh.c | 4 | ||||
-rw-r--r-- | drivers/ata/libata-scsi.c | 10 | ||||
-rw-r--r-- | drivers/ata/libata-sff.c | 9 | ||||
-rw-r--r-- | drivers/ata/libata.h | 1 |
5 files changed, 14 insertions, 30 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index ddf8e4862787..4f78741692dc 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -98,8 +98,6 @@ static unsigned long ata_dev_blacklisted(const struct ata_device *dev); | |||
98 | 98 | ||
99 | unsigned int ata_print_id = 1; | 99 | unsigned int ata_print_id = 1; |
100 | 100 | ||
101 | struct workqueue_struct *ata_aux_wq; | ||
102 | |||
103 | struct ata_force_param { | 101 | struct ata_force_param { |
104 | const char *name; | 102 | const char *name; |
105 | unsigned int cbl; | 103 | unsigned int cbl; |
@@ -5611,6 +5609,7 @@ struct ata_port *ata_port_alloc(struct ata_host *host) | |||
5611 | ap->msg_enable = ATA_MSG_DRV | ATA_MSG_ERR | ATA_MSG_WARN; | 5609 | ap->msg_enable = ATA_MSG_DRV | ATA_MSG_ERR | ATA_MSG_WARN; |
5612 | #endif | 5610 | #endif |
5613 | 5611 | ||
5612 | mutex_init(&ap->scsi_scan_mutex); | ||
5614 | INIT_DELAYED_WORK(&ap->hotplug_task, ata_scsi_hotplug); | 5613 | INIT_DELAYED_WORK(&ap->hotplug_task, ata_scsi_hotplug); |
5615 | INIT_WORK(&ap->scsi_rescan_task, ata_scsi_dev_rescan); | 5614 | INIT_WORK(&ap->scsi_rescan_task, ata_scsi_dev_rescan); |
5616 | INIT_LIST_HEAD(&ap->eh_done_q); | 5615 | INIT_LIST_HEAD(&ap->eh_done_q); |
@@ -6549,29 +6548,20 @@ static int __init ata_init(void) | |||
6549 | 6548 | ||
6550 | ata_parse_force_param(); | 6549 | ata_parse_force_param(); |
6551 | 6550 | ||
6552 | ata_aux_wq = create_singlethread_workqueue("ata_aux"); | ||
6553 | if (!ata_aux_wq) | ||
6554 | goto fail; | ||
6555 | |||
6556 | rc = ata_sff_init(); | 6551 | rc = ata_sff_init(); |
6557 | if (rc) | 6552 | if (rc) { |
6558 | goto fail; | 6553 | kfree(ata_force_tbl); |
6554 | return rc; | ||
6555 | } | ||
6559 | 6556 | ||
6560 | printk(KERN_DEBUG "libata version " DRV_VERSION " loaded.\n"); | 6557 | printk(KERN_DEBUG "libata version " DRV_VERSION " loaded.\n"); |
6561 | return 0; | 6558 | return 0; |
6562 | |||
6563 | fail: | ||
6564 | kfree(ata_force_tbl); | ||
6565 | if (ata_aux_wq) | ||
6566 | destroy_workqueue(ata_aux_wq); | ||
6567 | return rc; | ||
6568 | } | 6559 | } |
6569 | 6560 | ||
6570 | static void __exit ata_exit(void) | 6561 | static void __exit ata_exit(void) |
6571 | { | 6562 | { |
6572 | ata_sff_exit(); | 6563 | ata_sff_exit(); |
6573 | kfree(ata_force_tbl); | 6564 | kfree(ata_force_tbl); |
6574 | destroy_workqueue(ata_aux_wq); | ||
6575 | } | 6565 | } |
6576 | 6566 | ||
6577 | subsys_initcall(ata_init); | 6567 | subsys_initcall(ata_init); |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index f77a67303f8b..4d2af824dd23 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -727,7 +727,7 @@ void ata_scsi_error(struct Scsi_Host *host) | |||
727 | if (ap->pflags & ATA_PFLAG_LOADING) | 727 | if (ap->pflags & ATA_PFLAG_LOADING) |
728 | ap->pflags &= ~ATA_PFLAG_LOADING; | 728 | ap->pflags &= ~ATA_PFLAG_LOADING; |
729 | else if (ap->pflags & ATA_PFLAG_SCSI_HOTPLUG) | 729 | else if (ap->pflags & ATA_PFLAG_SCSI_HOTPLUG) |
730 | queue_delayed_work(ata_aux_wq, &ap->hotplug_task, 0); | 730 | schedule_delayed_work(&ap->hotplug_task, 0); |
731 | 731 | ||
732 | if (ap->pflags & ATA_PFLAG_RECOVERED) | 732 | if (ap->pflags & ATA_PFLAG_RECOVERED) |
733 | ata_port_printk(ap, KERN_INFO, "EH complete\n"); | 733 | ata_port_printk(ap, KERN_INFO, "EH complete\n"); |
@@ -2944,7 +2944,7 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link, | |||
2944 | ehc->i.flags |= ATA_EHI_SETMODE; | 2944 | ehc->i.flags |= ATA_EHI_SETMODE; |
2945 | 2945 | ||
2946 | /* schedule the scsi_rescan_device() here */ | 2946 | /* schedule the scsi_rescan_device() here */ |
2947 | queue_work(ata_aux_wq, &(ap->scsi_rescan_task)); | 2947 | schedule_work(&(ap->scsi_rescan_task)); |
2948 | } else if (dev->class == ATA_DEV_UNKNOWN && | 2948 | } else if (dev->class == ATA_DEV_UNKNOWN && |
2949 | ehc->tries[dev->devno] && | 2949 | ehc->tries[dev->devno] && |
2950 | ata_class_enabled(ehc->classes[dev->devno])) { | 2950 | ata_class_enabled(ehc->classes[dev->devno])) { |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index a54273d2c3c6..d75c9c479d1a 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -3435,7 +3435,7 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync) | |||
3435 | " switching to async\n"); | 3435 | " switching to async\n"); |
3436 | } | 3436 | } |
3437 | 3437 | ||
3438 | queue_delayed_work(ata_aux_wq, &ap->hotplug_task, | 3438 | queue_delayed_work(system_long_wq, &ap->hotplug_task, |
3439 | round_jiffies_relative(HZ)); | 3439 | round_jiffies_relative(HZ)); |
3440 | } | 3440 | } |
3441 | 3441 | ||
@@ -3582,6 +3582,7 @@ void ata_scsi_hotplug(struct work_struct *work) | |||
3582 | } | 3582 | } |
3583 | 3583 | ||
3584 | DPRINTK("ENTER\n"); | 3584 | DPRINTK("ENTER\n"); |
3585 | mutex_lock(&ap->scsi_scan_mutex); | ||
3585 | 3586 | ||
3586 | /* Unplug detached devices. We cannot use link iterator here | 3587 | /* Unplug detached devices. We cannot use link iterator here |
3587 | * because PMP links have to be scanned even if PMP is | 3588 | * because PMP links have to be scanned even if PMP is |
@@ -3595,6 +3596,7 @@ void ata_scsi_hotplug(struct work_struct *work) | |||
3595 | /* scan for new ones */ | 3596 | /* scan for new ones */ |
3596 | ata_scsi_scan_host(ap, 0); | 3597 | ata_scsi_scan_host(ap, 0); |
3597 | 3598 | ||
3599 | mutex_unlock(&ap->scsi_scan_mutex); | ||
3598 | DPRINTK("EXIT\n"); | 3600 | DPRINTK("EXIT\n"); |
3599 | } | 3601 | } |
3600 | 3602 | ||
@@ -3673,9 +3675,7 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel, | |||
3673 | * @work: Pointer to ATA port to perform scsi_rescan_device() | 3675 | * @work: Pointer to ATA port to perform scsi_rescan_device() |
3674 | * | 3676 | * |
3675 | * After ATA pass thru (SAT) commands are executed successfully, | 3677 | * After ATA pass thru (SAT) commands are executed successfully, |
3676 | * libata need to propagate the changes to SCSI layer. This | 3678 | * libata need to propagate the changes to SCSI layer. |
3677 | * function must be executed from ata_aux_wq such that sdev | ||
3678 | * attach/detach don't race with rescan. | ||
3679 | * | 3679 | * |
3680 | * LOCKING: | 3680 | * LOCKING: |
3681 | * Kernel thread context (may sleep). | 3681 | * Kernel thread context (may sleep). |
@@ -3688,6 +3688,7 @@ void ata_scsi_dev_rescan(struct work_struct *work) | |||
3688 | struct ata_device *dev; | 3688 | struct ata_device *dev; |
3689 | unsigned long flags; | 3689 | unsigned long flags; |
3690 | 3690 | ||
3691 | mutex_lock(&ap->scsi_scan_mutex); | ||
3691 | spin_lock_irqsave(ap->lock, flags); | 3692 | spin_lock_irqsave(ap->lock, flags); |
3692 | 3693 | ||
3693 | ata_for_each_link(link, ap, EDGE) { | 3694 | ata_for_each_link(link, ap, EDGE) { |
@@ -3707,6 +3708,7 @@ void ata_scsi_dev_rescan(struct work_struct *work) | |||
3707 | } | 3708 | } |
3708 | 3709 | ||
3709 | spin_unlock_irqrestore(ap->lock, flags); | 3710 | spin_unlock_irqrestore(ap->lock, flags); |
3711 | mutex_unlock(&ap->scsi_scan_mutex); | ||
3710 | } | 3712 | } |
3711 | 3713 | ||
3712 | /** | 3714 | /** |
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c index efa4a18cfb9d..674c1436491f 100644 --- a/drivers/ata/libata-sff.c +++ b/drivers/ata/libata-sff.c | |||
@@ -3318,14 +3318,7 @@ void ata_sff_port_init(struct ata_port *ap) | |||
3318 | 3318 | ||
3319 | int __init ata_sff_init(void) | 3319 | int __init ata_sff_init(void) |
3320 | { | 3320 | { |
3321 | /* | 3321 | ata_sff_wq = alloc_workqueue("ata_sff", WQ_RESCUER, WQ_MAX_ACTIVE); |
3322 | * FIXME: In UP case, there is only one workqueue thread and if you | ||
3323 | * have more than one PIO device, latency is bloody awful, with | ||
3324 | * occasional multi-second "hiccups" as one PIO device waits for | ||
3325 | * another. It's an ugly wart that users DO occasionally complain | ||
3326 | * about; luckily most users have at most one PIO polled device. | ||
3327 | */ | ||
3328 | ata_sff_wq = create_workqueue("ata_sff"); | ||
3329 | if (!ata_sff_wq) | 3322 | if (!ata_sff_wq) |
3330 | return -ENOMEM; | 3323 | return -ENOMEM; |
3331 | 3324 | ||
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index 4b84ed60324a..9ce1ecc63e39 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
@@ -54,7 +54,6 @@ enum { | |||
54 | }; | 54 | }; |
55 | 55 | ||
56 | extern unsigned int ata_print_id; | 56 | extern unsigned int ata_print_id; |
57 | extern struct workqueue_struct *ata_aux_wq; | ||
58 | extern int atapi_passthru16; | 57 | extern int atapi_passthru16; |
59 | extern int libata_fua; | 58 | extern int libata_fua; |
60 | extern int libata_noacpi; | 59 | extern int libata_noacpi; |