This way the pushdown patch for each ioctl routine becomes independent of the others.
--- local_tree.orig/drivers/usb/core/devio.c 2004-07-25 14:34:32.843129288 +0200 +++ local_tree/drivers/usb/core/devio.c 2004-07-25 14:37:18.758596644 +0200 @@ -1180,109 +1180,205 @@ if (!(file->f_mode & FMODE_WRITE)) return -EPERM; - down(&dev->serialize); - if (!connected(dev)) { - up(&dev->serialize); - return -ENODEV; - } switch (cmd) { case USBDEVFS_CONTROL: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: CONTROL\n", __FUNCTION__); ret = proc_control(ps, p); if (ret >= 0) inode->i_mtime = CURRENT_TIME; + up(&dev->serialize); break; case USBDEVFS_BULK: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: BULK\n", __FUNCTION__); ret = proc_bulk(ps, p); if (ret >= 0) inode->i_mtime = CURRENT_TIME; + up(&dev->serialize); break; case USBDEVFS_RESETEP: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: RESETEP\n", __FUNCTION__); ret = proc_resetep(ps, p); if (ret >= 0) inode->i_mtime = CURRENT_TIME; + up(&dev->serialize); break; case USBDEVFS_RESET: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: RESET\n", __FUNCTION__); ret = proc_resetdevice(ps); + up(&dev->serialize); break; case USBDEVFS_CLEAR_HALT: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: CLEAR_HALT\n", __FUNCTION__); ret = proc_clearhalt(ps, p); if (ret >= 0) inode->i_mtime = CURRENT_TIME; + up(&dev->serialize); break; case USBDEVFS_GETDRIVER: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: GETDRIVER\n", __FUNCTION__); ret = proc_getdriver(ps, p); + up(&dev->serialize); break; case USBDEVFS_CONNECTINFO: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: CONNECTINFO\n", __FUNCTION__); ret = proc_connectinfo(ps, p); + up(&dev->serialize); break; case USBDEVFS_SETINTERFACE: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: SETINTERFACE\n", __FUNCTION__); ret = proc_setintf(ps, p); + up(&dev->serialize); break; case USBDEVFS_SETCONFIGURATION: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: SETCONFIGURATION\n", __FUNCTION__); ret = proc_setconfig(ps, p); + up(&dev->serialize); break; case USBDEVFS_SUBMITURB: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: SUBMITURB\n", __FUNCTION__); ret = proc_submiturb(ps, p); if (ret >= 0) inode->i_mtime = CURRENT_TIME; + up(&dev->serialize); break; case USBDEVFS_DISCARDURB: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: DISCARDURB\n", __FUNCTION__); ret = proc_unlinkurb(ps, p); + up(&dev->serialize); break; case USBDEVFS_REAPURB: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: REAPURB\n", __FUNCTION__); ret = proc_reapurb(ps, p); + up(&dev->serialize); break; case USBDEVFS_REAPURBNDELAY: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: REAPURBDELAY\n", __FUNCTION__); ret = proc_reapurbnonblock(ps, p); + up(&dev->serialize); break; case USBDEVFS_DISCSIGNAL: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: DISCSIGNAL\n", __FUNCTION__); ret = proc_disconnectsignal(ps, p); + up(&dev->serialize); break; case USBDEVFS_CLAIMINTERFACE: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: CLAIMINTERFACE\n", __FUNCTION__); ret = proc_claiminterface(ps, p); + up(&dev->serialize); break; case USBDEVFS_RELEASEINTERFACE: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: RELEASEINTERFACE\n", __FUNCTION__); ret = proc_releaseinterface(ps, p); + up(&dev->serialize); break; case USBDEVFS_IOCTL: + down(&dev->serialize); + if (!connected(dev)) { + up(&dev->serialize); + return -ENODEV; + } snoop(&dev->dev, "%s: IOCTL\n", __FUNCTION__); ret = proc_ioctl(ps, p); + up(&dev->serialize); break; } - up(&dev->serialize); if (ret >= 0) inode->i_atime = CURRENT_TIME; return ret; ------------------------------------------------------- This SF.Net email is sponsored by OSTG. Have you noticed the changes on Linux.com, ITManagersJournal and NewsForge in the past few weeks? Now, one more big change to announce. We are now OSTG- Open Source Technology Group. Come see the changes on the new OSTG site. www.ostg.com _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel