Hi list, as was recently discussed, sleep_on and derivates, which have a little race problem are used 21 times in drivers/usb The attached patch should fix one such place in printer. It even compiles. 20 more to go. People let's kill them all. Regards Oliver
--- drivers/usb/printer.c.alt Wed May 2 10:41:46 2001 +++ drivers/usb/printer.c Wed May 2 10:49:14 2001 @@ -388,6 +388,7 @@ static ssize_t usblp_read(struct file *file, char *buffer, size_t count, loff_t *ppos) { struct usblp *usblp = file->private_data; + DECLARE_WAITQUEUE(wait, current); if (!usblp->bidir) return -EINVAL; @@ -396,12 +397,19 @@ if (file->f_flags & O_NONBLOCK) return -EAGAIN; - + + current->state = TASK_INTERRUPTIBLE; + add_wait_queue(&usblp->wait, &wait); while (usblp->readurb.status == -EINPROGRESS) { - if (signal_pending(current)) + if (signal_pending(current)) { + remove_wait_queue(&usblp->wait, &wait); + current->state = TASK_RUNNING; return -EINTR; - interruptible_sleep_on(&usblp->wait); + } + schedule(); } + remove_wait_queue(&usblp->wait, &wait); + current->state = TASK_RUNNING; } if (!usblp->dev) @@ -668,3 +676,4 @@ MODULE_AUTHOR("Michael Gee, Pavel Machek, Vojtech Pavlik, Randy Dunlap"); MODULE_DESCRIPTION("USB Printer Device Class driver"); +