spin_unlock_irqrestore(ap->lock, flags);
 
        DPRINTK("flush #1\n");
-       flush_workqueue(ata_wq);
+       flush_work(ata_wq, &ap->port_task.work); /* akpm: seems unneeded */
 
        /*
         * At this point, if a task is running, it's guaranteed to see
                if (ata_msg_ctl(ap))
                        ata_port_printk(ap, KERN_DEBUG, "%s: flush #2\n",
                                        __FUNCTION__);
-               flush_workqueue(ata_wq);
+               flush_work(ata_wq, &ap->port_task.work);
        }
 
        spin_lock_irqsave(ap->lock, flags);
        /* Flush hotplug task.  The sequence is similar to
         * ata_port_flush_task().
         */
-       flush_workqueue(ata_aux_wq);
+       flush_work(ata_aux_wq, &ap->hotplug_task.work); /* akpm: why? */
        cancel_delayed_work(&ap->hotplug_task);
-       flush_workqueue(ata_aux_wq);
+       flush_work(ata_aux_wq, &ap->hotplug_task.work);
 
  skip_eh:
        /* remove the associated SCSI host */