Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 206237
b: refs/heads/master
c: ad72cf9
h: refs/heads/master
i:
  206235: d299faf
v: v3
  • Loading branch information
Tejun Heo committed Jul 2, 2010
1 parent 80e8c37 commit 898a040
Show file tree
Hide file tree
Showing 7 changed files with 16 additions and 31 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d313dd85ad846bc768d58e9ceb28588f917f4c9a
refs/heads/master: ad72cf9885c536e3adae03f8337557ac9dd1e4bb
20 changes: 5 additions & 15 deletions trunk/drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,6 @@ static unsigned long ata_dev_blacklisted(const struct ata_device *dev);

unsigned int ata_print_id = 1;

struct workqueue_struct *ata_aux_wq;

struct ata_force_param {
const char *name;
unsigned int cbl;
Expand Down Expand Up @@ -5611,6 +5609,7 @@ struct ata_port *ata_port_alloc(struct ata_host *host)
ap->msg_enable = ATA_MSG_DRV | ATA_MSG_ERR | ATA_MSG_WARN;
#endif

mutex_init(&ap->scsi_scan_mutex);
INIT_DELAYED_WORK(&ap->hotplug_task, ata_scsi_hotplug);
INIT_WORK(&ap->scsi_rescan_task, ata_scsi_dev_rescan);
INIT_LIST_HEAD(&ap->eh_done_q);
Expand Down Expand Up @@ -6549,29 +6548,20 @@ static int __init ata_init(void)

ata_parse_force_param();

ata_aux_wq = create_singlethread_workqueue("ata_aux");
if (!ata_aux_wq)
goto fail;

rc = ata_sff_init();
if (rc)
goto fail;
if (rc) {
kfree(ata_force_tbl);
return rc;
}

printk(KERN_DEBUG "libata version " DRV_VERSION " loaded.\n");
return 0;

fail:
kfree(ata_force_tbl);
if (ata_aux_wq)
destroy_workqueue(ata_aux_wq);
return rc;
}

static void __exit ata_exit(void)
{
ata_sff_exit();
kfree(ata_force_tbl);
destroy_workqueue(ata_aux_wq);
}

subsys_initcall(ata_init);
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/ata/libata-eh.c
Original file line number Diff line number Diff line change
Expand Up @@ -727,7 +727,7 @@ void ata_scsi_error(struct Scsi_Host *host)
if (ap->pflags & ATA_PFLAG_LOADING)
ap->pflags &= ~ATA_PFLAG_LOADING;
else if (ap->pflags & ATA_PFLAG_SCSI_HOTPLUG)
queue_delayed_work(ata_aux_wq, &ap->hotplug_task, 0);
schedule_delayed_work(&ap->hotplug_task, 0);

if (ap->pflags & ATA_PFLAG_RECOVERED)
ata_port_printk(ap, KERN_INFO, "EH complete\n");
Expand Down Expand Up @@ -2944,7 +2944,7 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,
ehc->i.flags |= ATA_EHI_SETMODE;

/* schedule the scsi_rescan_device() here */
queue_work(ata_aux_wq, &(ap->scsi_rescan_task));
schedule_work(&(ap->scsi_rescan_task));
} else if (dev->class == ATA_DEV_UNKNOWN &&
ehc->tries[dev->devno] &&
ata_class_enabled(ehc->classes[dev->devno])) {
Expand Down
10 changes: 6 additions & 4 deletions trunk/drivers/ata/libata-scsi.c
Original file line number Diff line number Diff line change
Expand Up @@ -3435,7 +3435,7 @@ void ata_scsi_scan_host(struct ata_port *ap, int sync)
" switching to async\n");
}

queue_delayed_work(ata_aux_wq, &ap->hotplug_task,
queue_delayed_work(system_long_wq, &ap->hotplug_task,
round_jiffies_relative(HZ));
}

Expand Down Expand Up @@ -3582,6 +3582,7 @@ void ata_scsi_hotplug(struct work_struct *work)
}

DPRINTK("ENTER\n");
mutex_lock(&ap->scsi_scan_mutex);

/* Unplug detached devices. We cannot use link iterator here
* because PMP links have to be scanned even if PMP is
Expand All @@ -3595,6 +3596,7 @@ void ata_scsi_hotplug(struct work_struct *work)
/* scan for new ones */
ata_scsi_scan_host(ap, 0);

mutex_unlock(&ap->scsi_scan_mutex);
DPRINTK("EXIT\n");
}

Expand Down Expand Up @@ -3673,9 +3675,7 @@ static int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
* @work: Pointer to ATA port to perform scsi_rescan_device()
*
* After ATA pass thru (SAT) commands are executed successfully,
* libata need to propagate the changes to SCSI layer. This
* function must be executed from ata_aux_wq such that sdev
* attach/detach don't race with rescan.
* libata need to propagate the changes to SCSI layer.
*
* LOCKING:
* Kernel thread context (may sleep).
Expand All @@ -3688,6 +3688,7 @@ void ata_scsi_dev_rescan(struct work_struct *work)
struct ata_device *dev;
unsigned long flags;

mutex_lock(&ap->scsi_scan_mutex);
spin_lock_irqsave(ap->lock, flags);

ata_for_each_link(link, ap, EDGE) {
Expand All @@ -3707,6 +3708,7 @@ void ata_scsi_dev_rescan(struct work_struct *work)
}

spin_unlock_irqrestore(ap->lock, flags);
mutex_unlock(&ap->scsi_scan_mutex);
}

/**
Expand Down
9 changes: 1 addition & 8 deletions trunk/drivers/ata/libata-sff.c
Original file line number Diff line number Diff line change
Expand Up @@ -3318,14 +3318,7 @@ void ata_sff_port_init(struct ata_port *ap)

int __init ata_sff_init(void)
{
/*
* FIXME: In UP case, there is only one workqueue thread and if you
* have more than one PIO device, latency is bloody awful, with
* occasional multi-second "hiccups" as one PIO device waits for
* another. It's an ugly wart that users DO occasionally complain
* about; luckily most users have at most one PIO polled device.
*/
ata_sff_wq = create_workqueue("ata_sff");
ata_sff_wq = alloc_workqueue("ata_sff", WQ_RESCUER, WQ_MAX_ACTIVE);
if (!ata_sff_wq)
return -ENOMEM;

Expand Down
1 change: 0 additions & 1 deletion trunk/drivers/ata/libata.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ enum {
};

extern unsigned int ata_print_id;
extern struct workqueue_struct *ata_aux_wq;
extern int atapi_passthru16;
extern int libata_fua;
extern int libata_noacpi;
Expand Down
1 change: 1 addition & 0 deletions trunk/include/linux/libata.h
Original file line number Diff line number Diff line change
Expand Up @@ -751,6 +751,7 @@ struct ata_port {
struct ata_host *host;
struct device *dev;

struct mutex scsi_scan_mutex;
struct delayed_work hotplug_task;
struct work_struct scsi_rescan_task;

Expand Down

0 comments on commit 898a040

Please sign in to comment.