Ming Lei 5b6e9bcdeb usbnet: fix skb traversing races during unlink(v2)
Commit 4231d47e6fe69f061f96c98c30eaf9fb4c14b96d(net/usbnet: avoid
recursive locking in usbnet_stop()) fixes the recursive locking
problem by releasing the skb queue lock before unlink, but may
cause skb traversing races:
	- after URB is unlinked and the queue lock is released,
	the refered skb and skb->next may be moved to done queue,
	even be released
	- in skb_queue_walk_safe, the next skb is still obtained
	by next pointer of the last skb
	- so maybe trigger oops or other problems

This patch extends the usage of entry->state to describe 'start_unlink'
state, so always holding the queue(rx/tx) lock to change the state if
the referd skb is in rx or tx queue because we need to know if the
refered urb has been started unlinking in unlink_urbs.

The other part of this patch is based on Huajun's patch:
always traverse from head of the tx/rx queue to get skb which is
to be unlinked but not been started unlinking.

Signed-off-by: Huajun Li <huajun.li.lee@gmail.com>
Signed-off-by: Ming Lei <tom.leiming@gmail.com>
Cc: Oliver Neukum <oneukum@suse.de>
Cc: stable@kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
2012-05-15 13:41:42 -04:00
..
2012-04-23 14:23:32 +03:00
2012-03-30 17:31:56 -07:00
2012-04-04 10:09:30 -07:00
2012-04-27 11:03:38 -06:00
2011-07-22 08:25:37 -07:00
2011-11-02 16:07:03 -07:00
2011-07-20 20:47:43 -04:00
2011-10-26 15:43:25 -04:00
2012-03-20 21:29:46 -04:00
2011-08-03 11:30:42 -04:00
2011-07-31 22:05:09 +02:00
2011-07-26 16:49:47 -07:00
2012-03-21 17:55:01 -07:00
2012-03-16 20:35:02 +00:00
2012-03-16 20:35:02 +00:00
2012-02-28 16:02:54 +01:00
2012-01-03 22:54:57 -05:00
2011-10-29 21:20:22 +02:00
2012-03-29 15:38:31 +10:30
2012-03-23 16:58:38 -07:00
2011-07-06 14:44:42 -07:00
2011-07-25 20:57:16 -07:00
2011-12-13 09:26:45 +00:00
2012-03-20 21:29:37 -04:00
2011-07-05 23:42:17 -07:00
2012-03-20 21:29:53 -04:00
2012-02-20 19:46:36 +11:00
2011-05-23 10:47:06 -05:00
2012-01-04 08:56:31 -06:00
2011-05-29 13:03:09 +01:00
2011-10-31 20:19:04 +00:00
2012-04-10 15:30:16 -07:00
2011-05-24 10:21:29 +02:00
2011-11-26 14:59:39 -05:00
2012-04-30 15:30:18 -07:00
2011-12-11 18:25:16 -05:00
2012-01-12 20:13:04 -08:00
2011-09-14 15:24:51 -04:00
2012-04-05 15:30:34 -07:00
2012-04-12 12:57:08 +02:00
2012-02-28 17:10:21 +00:00
2012-04-27 10:46:45 +08:00
2012-03-28 14:08:46 -07:00
2011-07-01 15:34:45 -07:00
2011-06-28 10:48:34 +02:00
2012-03-26 21:47:19 +02:00
2012-03-26 21:47:19 +02:00
2012-03-26 21:47:19 +02:00
2012-03-26 21:47:19 +02:00
2012-03-26 21:47:19 +02:00
2012-03-26 21:47:19 +02:00
2011-07-01 10:37:15 +02:00
2012-03-28 15:58:21 -07:00
2012-03-27 22:45:26 -04:00
2011-07-21 13:47:54 -07:00
2012-01-03 22:55:17 -05:00
2012-01-09 13:52:09 +01:00
2012-03-08 10:50:35 -08:00
2012-03-21 17:54:57 -07:00
2012-03-23 08:53:47 -07:00
2012-03-08 10:50:35 -08:00
2012-01-17 15:40:51 -08:00
2011-12-27 11:26:41 +02:00
2011-09-16 19:20:20 -04:00
2012-03-15 21:41:34 +01:00
2012-03-03 15:04:45 -05:00
2012-04-21 01:58:20 -04:00
2011-07-26 16:49:47 -07:00
2011-07-26 16:49:47 -07:00
2011-11-14 00:47:54 -05:00
2012-03-05 15:26:47 -05:00
2012-03-21 17:54:58 -07:00
2012-03-21 17:55:01 -07:00
2012-01-06 12:10:26 -08:00
2011-05-26 17:12:37 -07:00
2012-03-16 21:49:24 +01:00
2011-12-13 09:26:45 +00:00
2011-11-02 16:07:02 -07:00
2012-03-20 11:16:20 -07:00
2012-03-20 21:29:38 -04:00
2012-01-03 22:55:07 -05:00
2012-03-28 18:30:03 +01:00
2012-03-28 15:58:21 -07:00
2011-06-07 10:02:35 +02:00
2012-03-08 11:38:50 -08:00
2012-03-12 22:19:13 +01:00
2012-01-09 09:33:57 +09:00
2011-07-30 08:44:19 -10:00
2012-05-01 09:40:19 -04:00
2012-03-06 11:01:33 +02:00
2012-03-19 16:53:08 -04:00
2011-07-26 16:49:47 -07:00
2011-12-13 09:26:45 +00:00
2011-07-25 20:57:11 -07:00
2011-10-31 17:30:47 -07:00
2011-08-16 00:16:49 -07:00
2012-01-03 22:54:56 -05:00
2012-03-22 19:43:43 -07:00
2012-03-28 18:30:03 +01:00
2012-04-10 22:39:17 -06:00
2011-06-07 09:05:42 -07:00
2011-11-02 16:07:02 -07:00
2012-04-11 09:36:00 +01:00
2012-03-27 16:30:09 -07:00
2012-03-31 08:09:50 +05:30
2011-07-26 16:49:47 -07:00
2012-03-08 10:50:35 -08:00
2012-03-28 18:30:03 +01:00
2011-09-14 15:24:51 -04:00