aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorJosef Bacik <josef@redhat.com>2009-07-27 13:57:01 -0400
committerChris Mason <chris.mason@oracle.com>2009-07-27 13:57:01 -0400
commit68b38550ddbea13d296184bf69edff387618b1d3 (patch)
treec0c3901b77f273ac08c39c641586884f41a90b84 /fs/btrfs/disk-io.c
parent631c07c8d12bcc6ce4a0fbfbd64ea843d78e2b10 (diff)
Btrfs: change how we unpin extents
We are racy with async block caching and unpinning extents. This patch makes things much less complicated by only unpinning the extent if the block group is cached. We check the block_group->cached var under the block_group->lock spin lock. If it is set to BTRFS_CACHE_FINISHED then we update the pinned counters, and unpin the extent and add the free space back. If it is not set to this, we start the caching of the block group so the next time we unpin extents we can unpin the extent. This keeps us from racing with the async caching threads, lets us kill the fs wide async thread counter, and keeps us from having to set DELALLOC bits for every extent we hit if there are caching kthreads going. One thing that needed to be changed was btrfs_free_super_mirror_extents. Now instead of just looking for LOCKED extents, we also look for DIRTY extents, since we could have left some extents pinned in the previous transaction that will never get freed now that we are unmounting, which would cause us to leak memory. So btrfs_free_super_mirror_extents has been changed to btrfs_free_pinned_extents, and it will clear the extents locked for the super mirror, and any remaining pinned extents that may be present. Thank you, Signed-off-by: Josef Bacik <jbacik@redhat.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index ec2c915f7f4a..c658397c7473 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -1567,7 +1567,6 @@ struct btrfs_root *open_ctree(struct super_block *sb,
1567 atomic_set(&fs_info->async_delalloc_pages, 0); 1567 atomic_set(&fs_info->async_delalloc_pages, 0);
1568 atomic_set(&fs_info->async_submit_draining, 0); 1568 atomic_set(&fs_info->async_submit_draining, 0);
1569 atomic_set(&fs_info->nr_async_bios, 0); 1569 atomic_set(&fs_info->nr_async_bios, 0);
1570 atomic_set(&fs_info->async_caching_threads, 0);
1571 fs_info->sb = sb; 1570 fs_info->sb = sb;
1572 fs_info->max_extent = (u64)-1; 1571 fs_info->max_extent = (u64)-1;
1573 fs_info->max_inline = 8192 * 1024; 1572 fs_info->max_inline = 8192 * 1024;
@@ -2339,7 +2338,7 @@ int close_ctree(struct btrfs_root *root)
2339 free_extent_buffer(root->fs_info->csum_root->commit_root); 2338 free_extent_buffer(root->fs_info->csum_root->commit_root);
2340 2339
2341 btrfs_free_block_groups(root->fs_info); 2340 btrfs_free_block_groups(root->fs_info);
2342 btrfs_free_super_mirror_extents(root->fs_info); 2341 btrfs_free_pinned_extents(root->fs_info);
2343 2342
2344 del_fs_roots(fs_info); 2343 del_fs_roots(fs_info);
2345 2344