Btrfs: Fix locking around adding new space_info
authorChris Mason <chris.mason@oracle.com>
Tue, 10 Mar 2009 16:39:20 +0000 (12:39 -0400)
committerChris Mason <chris.mason@oracle.com>
Tue, 10 Mar 2009 16:39:20 +0000 (12:39 -0400)
commit4184ea7f908d95f329febc3665cf66da8568b467
treeef16aabf4604c9c1aba23e222ff7fb4510052ebb
parentb9447ef80bd301b932ac4d85c9622e929de5fd62
Btrfs: Fix locking around adding new space_info

Storage allocated to different raid levels in btrfs is tracked by
a btrfs_space_info structure, and all of the current space_infos are
collected into a list_head.

Most filesystems have 3 or 4 of these structs total, and the list is
only changed when new raid levels are added or at unmount time.

This commit adds rcu locking on the list head, and properly frees
things at unmount time.  It also clears the space_info->full flag
whenever new space is added to the FS.

The locking for the space info list goes like this:

reads: protected by rcu_read_lock()
writes: protected by the chunk_mutex

At unmount time we don't need special locking because all the readers
are gone.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.h
fs/btrfs/extent-tree.c
fs/btrfs/volumes.c