diff options
| author | Qu Wenruo <quwenruo@cn.fujitsu.com> | 2015-09-08 05:08:38 -0400 |
|---|---|---|
| committer | Chris Mason <clm@fb.com> | 2015-10-21 21:37:47 -0400 |
| commit | 55eeaf0578038c40baaf3cf9408c23e42cd2a2b8 (patch) | |
| tree | 3539d0575ebba0c079cc293b9cf884a402688d1b /fs/btrfs/qgroup.c | |
| parent | 297d750b9f8d7e6f2dbdf8abc5aa3b5c656affdc (diff) | |
btrfs: qgroup: Introduce new functions to reserve/free metadata
Introduce new functions btrfs_qgroup_reserve/free_meta() to reserve/free
metadata reserved space.
Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: Chris Mason <clm@fb.com>
Diffstat (limited to 'fs/btrfs/qgroup.c')
| -rw-r--r-- | fs/btrfs/qgroup.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index 75d8e584c3e5..897a49d71638 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
| @@ -2594,3 +2594,43 @@ int btrfs_qgroup_release_data(struct inode *inode, u64 start, u64 len) | |||
| 2594 | { | 2594 | { |
| 2595 | return __btrfs_qgroup_release_data(inode, start, len, 0); | 2595 | return __btrfs_qgroup_release_data(inode, start, len, 0); |
| 2596 | } | 2596 | } |
| 2597 | |||
| 2598 | int btrfs_qgroup_reserve_meta(struct btrfs_root *root, int num_bytes) | ||
| 2599 | { | ||
| 2600 | int ret; | ||
| 2601 | |||
| 2602 | if (!root->fs_info->quota_enabled || !is_fstree(root->objectid) || | ||
| 2603 | num_bytes == 0) | ||
| 2604 | return 0; | ||
| 2605 | |||
| 2606 | BUG_ON(num_bytes != round_down(num_bytes, root->nodesize)); | ||
| 2607 | ret = btrfs_qgroup_reserve(root, num_bytes); | ||
| 2608 | if (ret < 0) | ||
| 2609 | return ret; | ||
| 2610 | atomic_add(num_bytes, &root->qgroup_meta_rsv); | ||
| 2611 | return ret; | ||
| 2612 | } | ||
| 2613 | |||
| 2614 | void btrfs_qgroup_free_meta_all(struct btrfs_root *root) | ||
| 2615 | { | ||
| 2616 | int reserved; | ||
| 2617 | |||
| 2618 | if (!root->fs_info->quota_enabled || !is_fstree(root->objectid)) | ||
| 2619 | return; | ||
| 2620 | |||
| 2621 | reserved = atomic_xchg(&root->qgroup_meta_rsv, 0); | ||
| 2622 | if (reserved == 0) | ||
| 2623 | return; | ||
| 2624 | btrfs_qgroup_free(root, reserved); | ||
| 2625 | } | ||
| 2626 | |||
| 2627 | void btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes) | ||
| 2628 | { | ||
| 2629 | if (!root->fs_info->quota_enabled || !is_fstree(root->objectid)) | ||
| 2630 | return; | ||
| 2631 | |||
| 2632 | BUG_ON(num_bytes != round_down(num_bytes, root->nodesize)); | ||
| 2633 | WARN_ON(atomic_read(&root->qgroup_meta_rsv) < num_bytes); | ||
| 2634 | atomic_sub(num_bytes, &root->qgroup_meta_rsv); | ||
| 2635 | btrfs_qgroup_free(root, num_bytes); | ||
| 2636 | } | ||
