|
From: Akinobu M. <mi...@mi...> - 2005-05-13 09:49:37
|
On Friday 06 May 2005 14:08, Akinobu Mita wrote:
> This may be rough implemantation. But these devices are working
> as diskdump devices.
>
> - I-O DATA HDPX-U
> - BUFFALO ClipDrive (Ours Technology, Inc. OTI-6803 Flash Disk)
>
I've tested on several machines.
There are some machines that my patch doesn't work.
I have to lean about USB :(
BTW, my previos patch has a problem.
usb_dump_wait_for_completion() always enables IRQs.
--- 2.6.9-diskdump-1.0-usb-storage.orig/drivers/usb/core/hcd.c 2005-05-13 19:06:27.230340536 +0900
+++ 2.6.9-diskdump-1.0-usb-storage/drivers/usb/core/hcd.c 2005-05-13 19:09:37.547407944 +0900
@@ -1635,8 +1635,10 @@ EXPORT_SYMBOL (usb_hcd_poll);
void usb_dump_wait_for_completion(struct completion *x, struct urb *urb)
{
+ unsigned long flags;
+
might_sleep();
- spin_lock_irq(&x->wait.lock);
+ spin_lock_irqsave(&x->wait.lock, flags);
if (!x->done) {
DECLARE_WAITQUEUE(wait, current);
@@ -1644,7 +1646,7 @@ void usb_dump_wait_for_completion(struct
__add_wait_queue_tail(&x->wait, &wait);
do {
__set_current_state(TASK_UNINTERRUPTIBLE);
- spin_unlock_irq(&x->wait.lock);
+ spin_unlock_irqrestore(&x->wait.lock, flags);
if (crashdump_mode()) {
struct usb_hcd *hcd = urb->dev->bus->hcpriv;
@@ -1653,12 +1655,12 @@ void usb_dump_wait_for_completion(struct
diskdump_update();
} else
schedule();
- spin_lock_irq(&x->wait.lock);
+ spin_lock_irqsave(&x->wait.lock, flags);
} while (!x->done);
__remove_wait_queue(&x->wait, &wait);
}
x->done--;
- spin_unlock_irq(&x->wait.lock);
+ spin_unlock_irqrestore(&x->wait.lock, flags);
}
EXPORT_SYMBOL (usb_dump_wait_for_completion);
|