ChangeSet 1.1500.8.8, 2004/01/29 16:29:48-08:00, david-b@pacbell.net [PATCH] USB: fix Bug 1821: sleeping function called > Data point: "visor.c" always passes GFP_ATOMIC there. Here's a patch that makes cdc-acm use GFP_ATOMIC too, and report consequent allocation failures. Compiles but otherwise untested. drivers/usb/class/cdc-acm.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) diff -Nru a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c --- a/drivers/usb/class/cdc-acm.c Mon Feb 9 14:41:40 2004 +++ b/drivers/usb/class/cdc-acm.c Mon Feb 9 14:41:40 2004 @@ -399,6 +399,7 @@ static int acm_tty_write(struct tty_struct *tty, int from_user, const unsigned char *buf, int count) { struct acm *acm = tty->driver_data; + int stat; if (!ACM_READY(acm)) return -EINVAL; @@ -418,8 +419,12 @@ acm->writeurb->transfer_buffer_length = count; acm->writeurb->dev = acm->dev; - if (usb_submit_urb(acm->writeurb, GFP_KERNEL)) + /* GFP_KERNEL probably works if from_user */ + stat = usb_submit_urb(acm->writeurb, GFP_ATOMIC); + if (stat < 0) { dbg("usb_submit_urb(write bulk) failed"); + return stat; + } return count; }