From 2c609cb6163e75d38fbf967444ac356b7d132f99 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Sat, 27 Jun 2009 21:07:34 -0400 Subject: [PATCH] --- yaml --- r: 154807 b: refs/heads/master c: a970b0a16cc416a509d5ae8b1d70978664e6f4fe h: refs/heads/master i: 154805: 9766d1f403159e8a07709b87e886c696dfd8862d 154803: 5b9d818d776b4b40e7b6018d4aab86eb5e5f0569 154799: e7d7092499c048dac039692bd85bcc1a9680b19e v: v3 --- [refs] | 2 +- trunk/fs/btrfs/inode.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 6f0909339e0c..5e79ec5198bf 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c8a894d77de4a1e0a544577fd4eabc9aacd453a8 +refs/heads/master: a970b0a16cc416a509d5ae8b1d70978664e6f4fe diff --git a/trunk/fs/btrfs/inode.c b/trunk/fs/btrfs/inode.c index 5b68330f8585..1eacc78f6614 100644 --- a/trunk/fs/btrfs/inode.c +++ b/trunk/fs/btrfs/inode.c @@ -5103,6 +5103,7 @@ static long btrfs_fallocate(struct inode *inode, int mode, u64 mask = BTRFS_I(inode)->root->sectorsize - 1; struct extent_map *em; struct btrfs_trans_handle *trans; + struct btrfs_root *root; int ret; alloc_start = offset & ~mask; @@ -5121,6 +5122,13 @@ static long btrfs_fallocate(struct inode *inode, int mode, goto out; } + root = BTRFS_I(inode)->root; + + ret = btrfs_check_data_free_space(root, inode, + alloc_end - alloc_start); + if (ret) + goto out; + locked_end = alloc_end - 1; while (1) { struct btrfs_ordered_extent *ordered; @@ -5128,7 +5136,7 @@ static long btrfs_fallocate(struct inode *inode, int mode, trans = btrfs_start_transaction(BTRFS_I(inode)->root, 1); if (!trans) { ret = -EIO; - goto out; + goto out_free; } /* the extent lock is ordered inside the running @@ -5189,6 +5197,8 @@ static long btrfs_fallocate(struct inode *inode, int mode, GFP_NOFS); btrfs_end_transaction(trans, BTRFS_I(inode)->root); +out_free: + btrfs_free_reserved_data_space(root, inode, alloc_end - alloc_start); out: mutex_unlock(&inode->i_mutex); return ret;