Btrfs: exclude super blocks when we read in block groups
authorJosef Bacik <josef@redhat.com>
Wed, 2 Feb 2011 15:53:47 +0000 (15:53 +0000)
committerChris Mason <chris.mason@oracle.com>
Sun, 6 Feb 2011 12:17:44 +0000 (07:17 -0500)
commit3c14874acc71180553fb5aba528e3cf57c5b958b
tree6fe93b4c4d0048cbabf6b7887f33020fd89f46b1
parent13dbc08987f25d9dba488a34b44b43e3844b027c
Btrfs: exclude super blocks when we read in block groups

This has been resulting in a BUT_ON(ret) after btrfs_reserve_extent in
btrfs_cow_file_range.  The reason is we don't actually calculate the bytes_super
for a block group until we go to cache it, which means that the space_info can
hand out reservations for space that it doesn't actually have, and we can run
out of data space.  This is also a problem if you are using space caching since
we don't ever calculate bytes_super for the block groups.  So instead everytime
we read a block group call exclude_super_stripes, which calculates the
bytes_super for the block group so it can be left out of the space_info.  Then
whenever caching completes we just call free_excluded_extents so that the super
excluded extents are freed up.  Also if we are unmounting and we hit any block
groups that haven't been cached we still need to call free_excluded_extents to
make sure things are cleaned up properly.  Thanks,

Reported-by: Arne Jansen <sensille@gmx.net>
Signed-off-by: Josef Bacik <josef@redhat.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent-tree.c