diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c index d87a8ab51..a03062986 100644 --- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c @@ -1579,8 +1579,6 @@ static void destroy_ep_files (struct dev_data *dev) /* break link to dcache */ simple_remove_by_name(dev->sb->s_root, ep->name, NULL); - put_ep (ep); - spin_lock_irq (&dev->lock); } spin_unlock_irq (&dev->lock); @@ -1996,6 +1994,7 @@ static int gadgetfs_create_file (struct super_block *sb, char const *name, dentry = simple_start_creating(sb->s_root, name); if (IS_ERR(dentry)) { + inode->i_private = NULL; iput(inode); return PTR_ERR(dentry); } @@ -2006,9 +2005,18 @@ static int gadgetfs_create_file (struct super_block *sb, char const *name, return 0; } +static void gadgetfs_evict_inode(struct inode *inode) +{ + truncate_inode_pages_final(&inode->i_data); + clear_inode(inode); + if (inode->i_private && inode->i_fop == &ep_io_operations) + put_ep(inode->i_private); +} + static const struct super_operations gadget_fs_operations = { .statfs = simple_statfs, .drop_inode = inode_just_drop, + .evict_inode = gadgetfs_evict_inode, }; static int