HomeFreeBSD

Fix arc_adapt() spinning in iterate_supers_type()

Description

Fix arc_adapt() spinning in iterate_supers_type()

The iterate_supers_type() function which was introduced in the
3.0 kernel was supposed to provide a safe way to call an arbitrary
function on all super blocks of a specific type. Unfortunately,
because a list_head was used a bug was introduced which made it
possible for iterate_supers_type() to get stuck spinning on a
super block which was just deactivated.

This can occur because when the list head is removed from the
fs_supers list it is reinitialized to point to itself. If the
iterate_supers_type() function happened to be processing the
removed list_head it will get stuck spinning on that list_head.

The bug was fixed in the 3.3 kernel by converting the list_head
to an hlist_node. However, to resolve the issue for existing
3.0 - 3.2 kernels we detect when a list_head is used. Then to
prevent the spinning from occurring the .next pointer is set to
the fs_supers list_head which ensures the iterate_supers_type()
function will always terminate.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #1045
Closes #861
Closes #790

Details

Provenance
Brian Behlendorf <behlendorf1@llnl.gov>Authored on Jul 15 2013, 8:37 PM
Parents
rGc9ada6d5a00b: Fix read-only pool hang on unmount
Branches
Unknown
Tags
Unknown

Event Timeline

Brian Behlendorf <behlendorf1@llnl.gov> committed rGdba1d705669c: Fix arc_adapt() spinning in iterate_supers_type() (authored by Brian Behlendorf <behlendorf1@llnl.gov>).Jul 17 2013, 4:28 PM