diff --git a/[refs] b/[refs] index 8f6768be2212..4a9d186f0110 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 779880ef35b60ac82eed1dcaec6db5b34a170df8 +refs/heads/master: 0bec9ef525e33233d7739b71be83bb78746f6e94 diff --git a/trunk/fs/btrfs/inode.c b/trunk/fs/btrfs/inode.c index 82c7c66f8523..2b48d2d51d50 100644 --- a/trunk/fs/btrfs/inode.c +++ b/trunk/fs/btrfs/inode.c @@ -2022,11 +2022,23 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent) if (trans) btrfs_end_transaction(trans, root); - if (ret) + if (ret) { clear_extent_uptodate(io_tree, ordered_extent->file_offset, ordered_extent->file_offset + ordered_extent->len - 1, NULL, GFP_NOFS); + /* + * If the ordered extent had an IOERR or something else went + * wrong we need to return the space for this ordered extent + * back to the allocator. + */ + if (!test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags) && + !test_bit(BTRFS_ORDERED_PREALLOC, &ordered_extent->flags)) + btrfs_free_reserved_extent(root, ordered_extent->start, + ordered_extent->disk_len); + } + + /* * This needs to be done to make sure anybody waiting knows we are done * updating everything for this ordered extent.