diff options
| -rw-r--r-- | fs/btrfs/inode.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 3d020d6d9ace..7313571e1860 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -778,8 +778,12 @@ retry: | |||
| 778 | ins.offset, | 778 | ins.offset, |
| 779 | BTRFS_ORDERED_COMPRESSED, | 779 | BTRFS_ORDERED_COMPRESSED, |
| 780 | async_extent->compress_type); | 780 | async_extent->compress_type); |
| 781 | if (ret) | 781 | if (ret) { |
| 782 | btrfs_drop_extent_cache(inode, async_extent->start, | ||
| 783 | async_extent->start + | ||
| 784 | async_extent->ram_size - 1, 0); | ||
| 782 | goto out_free_reserve; | 785 | goto out_free_reserve; |
| 786 | } | ||
| 783 | 787 | ||
| 784 | /* | 788 | /* |
| 785 | * clear dirty, set writeback and unlock the pages. | 789 | * clear dirty, set writeback and unlock the pages. |
| @@ -971,14 +975,14 @@ static noinline int cow_file_range(struct inode *inode, | |||
| 971 | ret = btrfs_add_ordered_extent(inode, start, ins.objectid, | 975 | ret = btrfs_add_ordered_extent(inode, start, ins.objectid, |
| 972 | ram_size, cur_alloc_size, 0); | 976 | ram_size, cur_alloc_size, 0); |
| 973 | if (ret) | 977 | if (ret) |
| 974 | goto out_reserve; | 978 | goto out_drop_extent_cache; |
| 975 | 979 | ||
| 976 | if (root->root_key.objectid == | 980 | if (root->root_key.objectid == |
| 977 | BTRFS_DATA_RELOC_TREE_OBJECTID) { | 981 | BTRFS_DATA_RELOC_TREE_OBJECTID) { |
| 978 | ret = btrfs_reloc_clone_csums(inode, start, | 982 | ret = btrfs_reloc_clone_csums(inode, start, |
| 979 | cur_alloc_size); | 983 | cur_alloc_size); |
| 980 | if (ret) | 984 | if (ret) |
| 981 | goto out_reserve; | 985 | goto out_drop_extent_cache; |
| 982 | } | 986 | } |
| 983 | 987 | ||
| 984 | if (disk_num_bytes < cur_alloc_size) | 988 | if (disk_num_bytes < cur_alloc_size) |
| @@ -1006,6 +1010,8 @@ static noinline int cow_file_range(struct inode *inode, | |||
| 1006 | out: | 1010 | out: |
| 1007 | return ret; | 1011 | return ret; |
| 1008 | 1012 | ||
| 1013 | out_drop_extent_cache: | ||
| 1014 | btrfs_drop_extent_cache(inode, start, start + ram_size - 1, 0); | ||
| 1009 | out_reserve: | 1015 | out_reserve: |
| 1010 | btrfs_free_reserved_extent(root, ins.objectid, ins.offset, 1); | 1016 | btrfs_free_reserved_extent(root, ins.objectid, ins.offset, 1); |
| 1011 | out_unlock: | 1017 | out_unlock: |
