From 34efab5135195a739556da628c6d8c2bffe3c6e7 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Thu, 31 Jan 2013 14:58:00 -0500 Subject: [PATCH] --- yaml --- r: 360433 b: refs/heads/master c: 0bec9ef525e33233d7739b71be83bb78746f6e94 h: refs/heads/master i: 360431: 649fa5c4bb278f6b74b50e7b4070c15509859095 v: v3 --- [refs] | 2 +- trunk/fs/btrfs/inode.c | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) 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.