aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent-tree.c
diff options
context:
space:
mode:
authorArne Jansen <sensille@gmx.net>2011-09-14 09:44:05 -0400
committerJan Schmidt <list.btrfs@jan-o-sch.net>2012-07-12 04:54:39 -0400
commitc556723794b3487a79de1ecd6354975b1389f5ff (patch)
tree99b363645203df002ab421bbd7be3b56dbd1e6ef /fs/btrfs/extent-tree.c
parent546adb0d817c34dc2be3a7cb5bba8771f837a562 (diff)
Btrfs: hooks to reserve qgroup space
Like block reserves, reserve a small piece of space on each transaction start and for delalloc. These are the hooks that can actually return EDQUOT to the user. The amount of space reserved is tracked in the transaction handle. Signed-off-by: Arne Jansen <sensille@gmx.net>
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r--fs/btrfs/extent-tree.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index c08337a83ace..2ce16f97730a 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -4565,6 +4565,13 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes)
4565 csum_bytes = BTRFS_I(inode)->csum_bytes; 4565 csum_bytes = BTRFS_I(inode)->csum_bytes;
4566 spin_unlock(&BTRFS_I(inode)->lock); 4566 spin_unlock(&BTRFS_I(inode)->lock);
4567 4567
4568 if (root->fs_info->quota_enabled) {
4569 ret = btrfs_qgroup_reserve(root, num_bytes +
4570 nr_extents * root->leafsize);
4571 if (ret)
4572 return ret;
4573 }
4574
4568 ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush); 4575 ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush);
4569 if (ret) { 4576 if (ret) {
4570 u64 to_free = 0; 4577 u64 to_free = 0;
@@ -4643,6 +4650,11 @@ void btrfs_delalloc_release_metadata(struct inode *inode, u64 num_bytes)
4643 4650
4644 trace_btrfs_space_reservation(root->fs_info, "delalloc", 4651 trace_btrfs_space_reservation(root->fs_info, "delalloc",
4645 btrfs_ino(inode), to_free, 0); 4652 btrfs_ino(inode), to_free, 0);
4653 if (root->fs_info->quota_enabled) {
4654 btrfs_qgroup_free(root, num_bytes +
4655 dropped * root->leafsize);
4656 }
4657
4646 btrfs_block_rsv_release(root, &root->fs_info->delalloc_block_rsv, 4658 btrfs_block_rsv_release(root, &root->fs_info->delalloc_block_rsv,
4647 to_free); 4659 to_free);
4648} 4660}