Skip to content

Commit

Permalink
gadgetfs: list_for_each_safe() misuse
Browse files Browse the repository at this point in the history
really weirdly spelled "while the list is non-empty, pick its
first element, remove it from the list and free it" kind of loop...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed Mar 21, 2012
1 parent 342827d commit 104bb37
Showing 1 changed file with 3 additions and 6 deletions.
9 changes: 3 additions & 6 deletions drivers/usb/gadget/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1569,20 +1569,18 @@ gadgetfs_setup (struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)

static void destroy_ep_files (struct dev_data *dev)
{
struct list_head *entry, *tmp;

DBG (dev, "%s %d\n", __func__, dev->state);

/* dev->state must prevent interference */
restart:
spin_lock_irq (&dev->lock);
list_for_each_safe (entry, tmp, &dev->epfiles) {
while (!list_empty(&dev->epfiles)) {
struct ep_data *ep;
struct inode *parent;
struct dentry *dentry;

/* break link to FS */
ep = list_entry (entry, struct ep_data, epfiles);
ep = list_first_entry (&dev->epfiles, struct ep_data, epfiles);
list_del_init (&ep->epfiles);
dentry = ep->dentry;
ep->dentry = NULL;
Expand All @@ -1605,8 +1603,7 @@ static void destroy_ep_files (struct dev_data *dev)
dput (dentry);
mutex_unlock (&parent->i_mutex);

/* fds may still be open */
goto restart;
spin_lock_irq (&dev->lock);
}
spin_unlock_irq (&dev->lock);
}
Expand Down

0 comments on commit 104bb37

Please sign in to comment.