aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r--fs/btrfs/extent-tree.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index f95e55083bdb..0abf70c984e9 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -2717,6 +2717,13 @@ again:
2717 goto again; 2717 goto again;
2718 } 2718 }
2719 2719
2720 /* We've already setup this transaction, go ahead and exit */
2721 if (block_group->cache_generation == trans->transid &&
2722 i_size_read(inode)) {
2723 dcs = BTRFS_DC_SETUP;
2724 goto out_put;
2725 }
2726
2720 /* 2727 /*
2721 * We want to set the generation to 0, that way if anything goes wrong 2728 * We want to set the generation to 0, that way if anything goes wrong
2722 * from here on out we know not to trust this cache when we load up next 2729 * from here on out we know not to trust this cache when we load up next
@@ -2756,19 +2763,16 @@ again:
2756 num_pages *= 16; 2763 num_pages *= 16;
2757 num_pages *= PAGE_CACHE_SIZE; 2764 num_pages *= PAGE_CACHE_SIZE;
2758 2765
2759 ret = btrfs_delalloc_reserve_space(inode, num_pages); 2766 ret = btrfs_check_data_free_space(inode, num_pages);
2760 if (ret) 2767 if (ret)
2761 goto out_put; 2768 goto out_put;
2762 2769
2763 ret = btrfs_prealloc_file_range_trans(inode, trans, 0, 0, num_pages, 2770 ret = btrfs_prealloc_file_range_trans(inode, trans, 0, 0, num_pages,
2764 num_pages, num_pages, 2771 num_pages, num_pages,
2765 &alloc_hint); 2772 &alloc_hint);
2766 if (!ret) { 2773 if (!ret)
2767 dcs = BTRFS_DC_SETUP; 2774 dcs = BTRFS_DC_SETUP;
2768 btrfs_free_reserved_data_space(inode, num_pages); 2775 btrfs_free_reserved_data_space(inode, num_pages);
2769 } else {
2770 btrfs_delalloc_release_space(inode, num_pages);
2771 }
2772 2776
2773out_put: 2777out_put:
2774 iput(inode); 2778 iput(inode);
@@ -2776,6 +2780,8 @@ out_free:
2776 btrfs_release_path(path); 2780 btrfs_release_path(path);
2777out: 2781out:
2778 spin_lock(&block_group->lock); 2782 spin_lock(&block_group->lock);
2783 if (!ret)
2784 block_group->cache_generation = trans->transid;
2779 block_group->disk_cache_state = dcs; 2785 block_group->disk_cache_state = dcs;
2780 spin_unlock(&block_group->lock); 2786 spin_unlock(&block_group->lock);
2781 2787