diff options
Diffstat (limited to 'fs/btrfs/file.c')
-rw-r--r-- | fs/btrfs/file.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index 9404121fd5f7..fea31a4a6e36 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c | |||
@@ -2033,6 +2033,14 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
2033 | */ | 2033 | */ |
2034 | clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC, | 2034 | clear_bit(BTRFS_INODE_NEEDS_FULL_SYNC, |
2035 | &BTRFS_I(inode)->runtime_flags); | 2035 | &BTRFS_I(inode)->runtime_flags); |
2036 | /* | ||
2037 | * An ordered extent might have started before and completed | ||
2038 | * already with io errors, in which case the inode was not | ||
2039 | * updated and we end up here. So check the inode's mapping | ||
2040 | * flags for any errors that might have happened while doing | ||
2041 | * writeback of file data. | ||
2042 | */ | ||
2043 | ret = btrfs_inode_check_errors(inode); | ||
2036 | inode_unlock(inode); | 2044 | inode_unlock(inode); |
2037 | goto out; | 2045 | goto out; |
2038 | } | 2046 | } |
@@ -2062,7 +2070,7 @@ int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | |||
2062 | } | 2070 | } |
2063 | trans->sync = true; | 2071 | trans->sync = true; |
2064 | 2072 | ||
2065 | btrfs_init_log_ctx(&ctx); | 2073 | btrfs_init_log_ctx(&ctx, inode); |
2066 | 2074 | ||
2067 | ret = btrfs_log_dentry_safe(trans, root, dentry, start, end, &ctx); | 2075 | ret = btrfs_log_dentry_safe(trans, root, dentry, start, end, &ctx); |
2068 | if (ret < 0) { | 2076 | if (ret < 0) { |
@@ -2667,6 +2675,7 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2667 | 2675 | ||
2668 | alloc_start = round_down(offset, blocksize); | 2676 | alloc_start = round_down(offset, blocksize); |
2669 | alloc_end = round_up(offset + len, blocksize); | 2677 | alloc_end = round_up(offset + len, blocksize); |
2678 | cur_offset = alloc_start; | ||
2670 | 2679 | ||
2671 | /* Make sure we aren't being give some crap mode */ | 2680 | /* Make sure we aren't being give some crap mode */ |
2672 | if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) | 2681 | if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE)) |
@@ -2759,7 +2768,6 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2759 | 2768 | ||
2760 | /* First, check if we exceed the qgroup limit */ | 2769 | /* First, check if we exceed the qgroup limit */ |
2761 | INIT_LIST_HEAD(&reserve_list); | 2770 | INIT_LIST_HEAD(&reserve_list); |
2762 | cur_offset = alloc_start; | ||
2763 | while (1) { | 2771 | while (1) { |
2764 | em = btrfs_get_extent(inode, NULL, 0, cur_offset, | 2772 | em = btrfs_get_extent(inode, NULL, 0, cur_offset, |
2765 | alloc_end - cur_offset, 0); | 2773 | alloc_end - cur_offset, 0); |
@@ -2786,6 +2794,14 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2786 | last_byte - cur_offset); | 2794 | last_byte - cur_offset); |
2787 | if (ret < 0) | 2795 | if (ret < 0) |
2788 | break; | 2796 | break; |
2797 | } else { | ||
2798 | /* | ||
2799 | * Do not need to reserve unwritten extent for this | ||
2800 | * range, free reserved data space first, otherwise | ||
2801 | * it'll result in false ENOSPC error. | ||
2802 | */ | ||
2803 | btrfs_free_reserved_data_space(inode, cur_offset, | ||
2804 | last_byte - cur_offset); | ||
2789 | } | 2805 | } |
2790 | free_extent_map(em); | 2806 | free_extent_map(em); |
2791 | cur_offset = last_byte; | 2807 | cur_offset = last_byte; |
@@ -2803,6 +2819,9 @@ static long btrfs_fallocate(struct file *file, int mode, | |||
2803 | range->start, | 2819 | range->start, |
2804 | range->len, 1 << inode->i_blkbits, | 2820 | range->len, 1 << inode->i_blkbits, |
2805 | offset + len, &alloc_hint); | 2821 | offset + len, &alloc_hint); |
2822 | else | ||
2823 | btrfs_free_reserved_data_space(inode, range->start, | ||
2824 | range->len); | ||
2806 | list_del(&range->list); | 2825 | list_del(&range->list); |
2807 | kfree(range); | 2826 | kfree(range); |
2808 | } | 2827 | } |
@@ -2837,18 +2856,11 @@ out_unlock: | |||
2837 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, | 2856 | unlock_extent_cached(&BTRFS_I(inode)->io_tree, alloc_start, locked_end, |
2838 | &cached_state, GFP_KERNEL); | 2857 | &cached_state, GFP_KERNEL); |
2839 | out: | 2858 | out: |
2840 | /* | ||
2841 | * As we waited the extent range, the data_rsv_map must be empty | ||
2842 | * in the range, as written data range will be released from it. | ||
2843 | * And for prealloacted extent, it will also be released when | ||
2844 | * its metadata is written. | ||
2845 | * So this is completely used as cleanup. | ||
2846 | */ | ||
2847 | btrfs_qgroup_free_data(inode, alloc_start, alloc_end - alloc_start); | ||
2848 | inode_unlock(inode); | 2859 | inode_unlock(inode); |
2849 | /* Let go of our reservation. */ | 2860 | /* Let go of our reservation. */ |
2850 | btrfs_free_reserved_data_space(inode, alloc_start, | 2861 | if (ret != 0) |
2851 | alloc_end - alloc_start); | 2862 | btrfs_free_reserved_data_space(inode, alloc_start, |
2863 | alloc_end - cur_offset); | ||
2852 | return ret; | 2864 | return ret; |
2853 | } | 2865 | } |
2854 | 2866 | ||