|
@@ -2941,6 +2941,7 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)
|
|
|
bool truncated = false;
|
|
|
bool range_locked = false;
|
|
|
bool clear_new_delalloc_bytes = false;
|
|
|
+ bool clear_reserved_extent = true;
|
|
|
|
|
|
if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags) &&
|
|
|
!test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags) &&
|
|
@@ -3044,10 +3045,12 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)
|
|
|
logical_len, logical_len,
|
|
|
compress_type, 0, 0,
|
|
|
BTRFS_FILE_EXTENT_REG);
|
|
|
- if (!ret)
|
|
|
+ if (!ret) {
|
|
|
+ clear_reserved_extent = false;
|
|
|
btrfs_release_delalloc_bytes(fs_info,
|
|
|
ordered_extent->start,
|
|
|
ordered_extent->disk_len);
|
|
|
+ }
|
|
|
}
|
|
|
unpin_extent_cache(&BTRFS_I(inode)->extent_tree,
|
|
|
ordered_extent->file_offset, ordered_extent->len,
|
|
@@ -3108,8 +3111,13 @@ out:
|
|
|
* wrong we need to return the space for this ordered extent
|
|
|
* back to the allocator. We only free the extent in the
|
|
|
* truncated case if we didn't write out the extent at all.
|
|
|
+ *
|
|
|
+ * If we made it past insert_reserved_file_extent before we
|
|
|
+ * errored out then we don't need to do this as the accounting
|
|
|
+ * has already been done.
|
|
|
*/
|
|
|
if ((ret || !logical_len) &&
|
|
|
+ clear_reserved_extent &&
|
|
|
!test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags) &&
|
|
|
!test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags))
|
|
|
btrfs_free_reserved_extent(fs_info,
|