diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/inode.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 82c7c66f8523..2b48d2d51d50 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -2022,11 +2022,23 @@ out: | |||
2022 | if (trans) | 2022 | if (trans) |
2023 | btrfs_end_transaction(trans, root); | 2023 | btrfs_end_transaction(trans, root); |
2024 | 2024 | ||
2025 | if (ret) | 2025 | if (ret) { |
2026 | clear_extent_uptodate(io_tree, ordered_extent->file_offset, | 2026 | clear_extent_uptodate(io_tree, ordered_extent->file_offset, |
2027 | ordered_extent->file_offset + | 2027 | ordered_extent->file_offset + |
2028 | ordered_extent->len - 1, NULL, GFP_NOFS); | 2028 | ordered_extent->len - 1, NULL, GFP_NOFS); |
2029 | 2029 | ||
2030 | /* | ||
2031 | * If the ordered extent had an IOERR or something else went | ||
2032 | * wrong we need to return the space for this ordered extent | ||
2033 | * back to the allocator. | ||
2034 | */ | ||
2035 | if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags) && | ||
2036 | !test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) | ||
2037 | btrfs_free_reserved_extent(root, ordered_extent->start, | ||
2038 | ordered_extent->disk_len); | ||
2039 | } | ||
2040 | |||
2041 | |||
2030 | /* | 2042 | /* |
2031 | * This needs to be done to make sure anybody waiting knows we are done | 2043 | * This needs to be done to make sure anybody waiting knows we are done |
2032 | * updating everything for this ordered extent. | 2044 | * updating everything for this ordered extent. |