• D
    radix-tree: clear all tags in radix_tree_node_rcu_free · b6dd0865
    Dave Chinner 提交于
    Commit f446daae ("mm: implement
    writeback livelock avoidance using page tagging") introduced a new
    radix tree tag, increasing the number of tags in each node from 2 to
    3. It did not, however, fix up the code in
    radix_tree_node_rcu_free() that cleans up after radix_tree_shrink()
    and hence could leave stray tags set in the new tag array.
    
    The result is that the livelock avoidance code added in the the
    above commit would hit stale tags when doing tag based lookups,
    resulting in livelocks when trying to traverse the tree.
    
    Fix this problem in radix_tree_node_rcu_free() so it doesn't happen
    again in the future by using a loop to walk all the tags up to
    RADIX_TREE_MAX_TAGS to clear the stray tags radix_tree_shrink()
    leaves behind.
    Signed-off-by: NDave Chinner <dchinner@redhat.com>
    Acked-by: NNick Piggin <npiggin@kernel.dk>
    Acked-by: NJan Kara <jack@suse.cz>
    b6dd0865
radix-tree.c 34.6 KB