diff -urNp linux-2310/drivers/usb/inode.c linux-2330/drivers/usb/inode.c --- linux-2310/drivers/usb/inode.c +++ linux-2330/drivers/usb/inode.c @@ -102,6 +102,27 @@ static void new_dev_inode(struct usb_dev printk(KERN_ERR "usbdevfs: cannot create inode for bus %u device %u\n", busnum, devnum); return; } + if (inode->u.usbdev_i.slist.next != NULL) { + /* + * We are on the list already. This is not supposed to happen. + * The suspicion is that anaconda races khubd (we always get + * here at khubd context from usbdevfs_add_device, with dev + * pointer set correctly, even though khubd kmalloc's it). + */ + if (inode->u.usbdev_i.p.dev != NULL && + inode->u.usbdev_i.p.dev != dev) { + printk(KERN_WARNING + "usbdevfs: confused by inode %d(0x%x)\n", + (int) inode->i_ino, (int) inode->i_ino); + } + if (inode->i_fop != &usbdevfs_device_file_operations) { + printk(KERN_WARNING + "usbdevfs: lost fops in inode %d(0x%x)\n", + (int) inode->i_ino, (int) inode->i_ino); + inode->i_fop = &usbdevfs_device_file_operations; + } + return; + } inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; inode->i_uid = sb->u.usbdevfs_sb.devuid; inode->i_gid = sb->u.usbdevfs_sb.devgid; @@ -158,9 +179,7 @@ static void free_inode(struct inode *ino inode->i_uid = inode->i_gid = 0; inode->i_size = 0; list_del(&inode->u.usbdev_i.slist); - INIT_LIST_HEAD(&inode->u.usbdev_i.slist); list_del(&inode->u.usbdev_i.dlist); - INIT_LIST_HEAD(&inode->u.usbdev_i.dlist); iput(inode); } @@ -512,8 +531,6 @@ static void usbdevfs_read_inode(struct i inode->i_ctime = inode->i_mtime = inode->i_atime = CURRENT_TIME; inode->i_mode = S_IFREG; inode->i_gid = inode->i_uid = 0; - INIT_LIST_HEAD(&inode->u.usbdev_i.dlist); - INIT_LIST_HEAD(&inode->u.usbdev_i.slist); inode->u.usbdev_i.p.dev = NULL; inode->u.usbdev_i.p.bus = NULL; switch (ITYPE(inode->i_ino)) {