diff options
author | Tejun Heo <tj@kernel.org> | 2013-12-19 13:51:15 -0500 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2013-12-19 13:51:15 -0500 |
commit | 23f5e334cbd93f8fcaf5a293faad715b511dfa45 (patch) | |
tree | 5d9e5d41a94fbd5696ce4466d03da737b86b2f77 /drivers/ata | |
parent | d2357f240135370d00acfe1f805a383a8ef1f2ef (diff) | |
parent | 85fbd722ad0f5d64d1ad15888cd1eb2188bfb557 (diff) |
Merge branch 'for-3.13-fixes' into for-next
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libata-scsi.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index db6dfcfa3e2e..176f62950e3d 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -3871,6 +3871,27 @@ void ata_scsi_hotplug(struct work_struct *work) return; } + /* + * XXX - UGLY HACK + * + * The block layer suspend/resume path is fundamentally broken due + * to freezable kthreads and workqueue and may deadlock if a block + * device gets removed while resume is in progress. I don't know + * what the solution is short of removing freezable kthreads and + * workqueues altogether. + * + * The following is an ugly hack to avoid kicking off device + * removal while freezer is active. This is a joke but does avoid + * this particular deadlock scenario. + * + * https://bugzilla.kernel.org/show_bug.cgi?id=62801 + * http://marc.info/?l=linux-kernel&m=138695698516487 + */ +#ifdef CONFIG_FREEZER + while (pm_freezing) + msleep(10); +#endif + DPRINTK("ENTER\n"); mutex_lock(&ap->scsi_scan_mutex); |