|
@@ -778,8 +778,12 @@ retry:
|
|
|
ins.offset,
|
|
|
BTRFS_ORDERED_COMPRESSED,
|
|
|
async_extent->compress_type);
|
|
|
- if (ret)
|
|
|
+ if (ret) {
|
|
|
+ btrfs_drop_extent_cache(inode, async_extent->start,
|
|
|
+ async_extent->start +
|
|
|
+ async_extent->ram_size - 1, 0);
|
|
|
goto out_free_reserve;
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* clear dirty, set writeback and unlock the pages.
|
|
@@ -971,14 +975,14 @@ static noinline int cow_file_range(struct inode *inode,
|
|
|
ret = btrfs_add_ordered_extent(inode, start, ins.objectid,
|
|
|
ram_size, cur_alloc_size, 0);
|
|
|
if (ret)
|
|
|
- goto out_reserve;
|
|
|
+ goto out_drop_extent_cache;
|
|
|
|
|
|
if (root->root_key.objectid ==
|
|
|
BTRFS_DATA_RELOC_TREE_OBJECTID) {
|
|
|
ret = btrfs_reloc_clone_csums(inode, start,
|
|
|
cur_alloc_size);
|
|
|
if (ret)
|
|
|
- goto out_reserve;
|
|
|
+ goto out_drop_extent_cache;
|
|
|
}
|
|
|
|
|
|
if (disk_num_bytes < cur_alloc_size)
|
|
@@ -1006,6 +1010,8 @@ static noinline int cow_file_range(struct inode *inode,
|
|
|
out:
|
|
|
return ret;
|
|
|
|
|
|
+out_drop_extent_cache:
|
|
|
+ btrfs_drop_extent_cache(inode, start, start + ram_size - 1, 0);
|
|
|
out_reserve:
|
|
|
btrfs_free_reserved_extent(root, ins.objectid, ins.offset, 1);
|
|
|
out_unlock:
|