diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r-- | fs/btrfs/disk-io.c | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 1bf9f897065d..30965120772b 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
@@ -2384,6 +2384,8 @@ int open_ctree(struct super_block *sb, | |||
2384 | init_waitqueue_head(&fs_info->transaction_blocked_wait); | 2384 | init_waitqueue_head(&fs_info->transaction_blocked_wait); |
2385 | init_waitqueue_head(&fs_info->async_submit_wait); | 2385 | init_waitqueue_head(&fs_info->async_submit_wait); |
2386 | 2386 | ||
2387 | INIT_LIST_HEAD(&fs_info->pinned_chunks); | ||
2388 | |||
2387 | ret = btrfs_alloc_stripe_hash_table(fs_info); | 2389 | ret = btrfs_alloc_stripe_hash_table(fs_info); |
2388 | if (ret) { | 2390 | if (ret) { |
2389 | err = ret; | 2391 | err = ret; |
@@ -2830,9 +2832,11 @@ retry_root_backup: | |||
2830 | btrfs_set_opt(fs_info->mount_opt, SSD); | 2832 | btrfs_set_opt(fs_info->mount_opt, SSD); |
2831 | } | 2833 | } |
2832 | 2834 | ||
2833 | /* Set the real inode map cache flag */ | 2835 | /* |
2834 | if (btrfs_test_opt(tree_root, CHANGE_INODE_CACHE)) | 2836 | * Mount does not set all options immediatelly, we can do it now and do |
2835 | btrfs_set_opt(tree_root->fs_info->mount_opt, INODE_MAP_CACHE); | 2837 | * not have to wait for transaction commit |
2838 | */ | ||
2839 | btrfs_apply_pending_changes(fs_info); | ||
2836 | 2840 | ||
2837 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY | 2841 | #ifdef CONFIG_BTRFS_FS_CHECK_INTEGRITY |
2838 | if (btrfs_test_opt(tree_root, CHECK_INTEGRITY)) { | 2842 | if (btrfs_test_opt(tree_root, CHECK_INTEGRITY)) { |
@@ -3713,6 +3717,17 @@ void close_ctree(struct btrfs_root *root) | |||
3713 | 3717 | ||
3714 | btrfs_free_block_rsv(root, root->orphan_block_rsv); | 3718 | btrfs_free_block_rsv(root, root->orphan_block_rsv); |
3715 | root->orphan_block_rsv = NULL; | 3719 | root->orphan_block_rsv = NULL; |
3720 | |||
3721 | lock_chunks(root); | ||
3722 | while (!list_empty(&fs_info->pinned_chunks)) { | ||
3723 | struct extent_map *em; | ||
3724 | |||
3725 | em = list_first_entry(&fs_info->pinned_chunks, | ||
3726 | struct extent_map, list); | ||
3727 | list_del_init(&em->list); | ||
3728 | free_extent_map(em); | ||
3729 | } | ||
3730 | unlock_chunks(root); | ||
3716 | } | 3731 | } |
3717 | 3732 | ||
3718 | int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid, | 3733 | int btrfs_buffer_uptodate(struct extent_buffer *buf, u64 parent_transid, |
@@ -3839,12 +3854,12 @@ static int btrfs_check_super_valid(struct btrfs_fs_info *fs_info, | |||
3839 | */ | 3854 | */ |
3840 | if (!IS_ALIGNED(btrfs_super_root(sb), 4096)) | 3855 | if (!IS_ALIGNED(btrfs_super_root(sb), 4096)) |
3841 | printk(KERN_WARNING "BTRFS: tree_root block unaligned: %llu\n", | 3856 | printk(KERN_WARNING "BTRFS: tree_root block unaligned: %llu\n", |
3842 | sb->root); | 3857 | btrfs_super_root(sb)); |
3843 | if (!IS_ALIGNED(btrfs_super_chunk_root(sb), 4096)) | 3858 | if (!IS_ALIGNED(btrfs_super_chunk_root(sb), 4096)) |
3844 | printk(KERN_WARNING "BTRFS: tree_root block unaligned: %llu\n", | 3859 | printk(KERN_WARNING "BTRFS: chunk_root block unaligned: %llu\n", |
3845 | sb->chunk_root); | 3860 | btrfs_super_chunk_root(sb)); |
3846 | if (!IS_ALIGNED(btrfs_super_log_root(sb), 4096)) | 3861 | if (!IS_ALIGNED(btrfs_super_log_root(sb), 4096)) |
3847 | printk(KERN_WARNING "BTRFS: tree_root block unaligned: %llu\n", | 3862 | printk(KERN_WARNING "BTRFS: log_root block unaligned: %llu\n", |
3848 | btrfs_super_log_root(sb)); | 3863 | btrfs_super_log_root(sb)); |
3849 | 3864 | ||
3850 | if (memcmp(fs_info->fsid, sb->dev_item.fsid, BTRFS_UUID_SIZE) != 0) { | 3865 | if (memcmp(fs_info->fsid, sb->dev_item.fsid, BTRFS_UUID_SIZE) != 0) { |
@@ -4129,6 +4144,25 @@ again: | |||
4129 | return 0; | 4144 | return 0; |
4130 | } | 4145 | } |
4131 | 4146 | ||
4147 | static void btrfs_free_pending_ordered(struct btrfs_transaction *cur_trans, | ||
4148 | struct btrfs_fs_info *fs_info) | ||
4149 | { | ||
4150 | struct btrfs_ordered_extent *ordered; | ||
4151 | |||
4152 | spin_lock(&fs_info->trans_lock); | ||
4153 | while (!list_empty(&cur_trans->pending_ordered)) { | ||
4154 | ordered = list_first_entry(&cur_trans->pending_ordered, | ||
4155 | struct btrfs_ordered_extent, | ||
4156 | trans_list); | ||
4157 | list_del_init(&ordered->trans_list); | ||
4158 | spin_unlock(&fs_info->trans_lock); | ||
4159 | |||
4160 | btrfs_put_ordered_extent(ordered); | ||
4161 | spin_lock(&fs_info->trans_lock); | ||
4162 | } | ||
4163 | spin_unlock(&fs_info->trans_lock); | ||
4164 | } | ||
4165 | |||
4132 | void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans, | 4166 | void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans, |
4133 | struct btrfs_root *root) | 4167 | struct btrfs_root *root) |
4134 | { | 4168 | { |
@@ -4140,6 +4174,7 @@ void btrfs_cleanup_one_transaction(struct btrfs_transaction *cur_trans, | |||
4140 | cur_trans->state = TRANS_STATE_UNBLOCKED; | 4174 | cur_trans->state = TRANS_STATE_UNBLOCKED; |
4141 | wake_up(&root->fs_info->transaction_wait); | 4175 | wake_up(&root->fs_info->transaction_wait); |
4142 | 4176 | ||
4177 | btrfs_free_pending_ordered(cur_trans, root->fs_info); | ||
4143 | btrfs_destroy_delayed_inodes(root); | 4178 | btrfs_destroy_delayed_inodes(root); |
4144 | btrfs_assert_delayed_root_empty(root); | 4179 | btrfs_assert_delayed_root_empty(root); |
4145 | 4180 | ||