Konstantin Belousov 07840861b1 The vnode_free_list_mtx is required unconditionally when iterating
over the active list. The mount interlock is not enough to guarantee
the validity of the tailq link pointers. The __mnt_vnode_next_active()
and __mnt_vnode_first_active() active lists iterators helper functions
did not provided the neccessary stability for the list, allowing the
iterators to pick garbage.

This was uncovered after the r243599 made the active list iterators
non-nop.

Since a vnode interlock is before the vnode_free_list_mtx, obtain the
vnode ilock in the non-blocking manner when under vnode_free_list_mtx,
and restart iteration after the yield if the lock attempt failed.

Assert that a vnode found on the list is active, and assert that the
helpers return the vnode with interlock owned.

Reported and tested by:	pho
MFC after:	1 week
2012-12-03 22:15:16 +00:00
..
2012-08-16 13:01:56 +00:00
2012-11-27 10:25:03 +00:00
2012-08-28 19:30:29 +00:00
2011-04-13 11:28:46 +00:00
2012-08-22 20:01:57 +00:00
2012-03-28 20:58:30 +00:00
2012-11-14 10:33:12 +00:00
2012-06-25 05:41:16 +00:00
2012-09-04 23:16:55 +00:00
2012-02-01 14:34:52 +00:00
2012-01-26 16:35:09 +00:00
2012-09-14 21:28:56 +00:00
2012-11-13 12:53:41 +00:00
2012-11-13 12:53:41 +00:00
2012-01-02 12:12:10 +00:00
2012-10-25 09:05:21 +00:00
2012-11-07 07:00:59 +00:00
2012-08-15 22:12:01 +00:00
2012-12-01 08:59:36 +00:00
2012-11-30 22:49:28 +00:00