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 | |
| 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')
| -rw-r--r-- | fs/btrfs/ctree.h | 3 | ||||
| -rw-r--r-- | fs/btrfs/disk-io.c | 1 | ||||
| -rw-r--r-- | fs/btrfs/qgroup.c | 40 | ||||
| -rw-r--r-- | fs/btrfs/qgroup.h | 4 |
4 files changed, 48 insertions, 0 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index 49bc792108b9..9df8f01de4df 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
| @@ -1943,6 +1943,9 @@ struct btrfs_root { | |||
| 1943 | int send_in_progress; | 1943 | int send_in_progress; |
| 1944 | struct btrfs_subvolume_writers *subv_writers; | 1944 | struct btrfs_subvolume_writers *subv_writers; |
| 1945 | atomic_t will_be_snapshoted; | 1945 | atomic_t will_be_snapshoted; |
| 1946 | |||
| 1947 | /* For qgroup metadata space reserve */ | ||
| 1948 | atomic_t qgroup_meta_rsv; | ||
| 1946 | }; | 1949 | }; |
| 1947 | 1950 | ||
| 1948 | struct btrfs_ioctl_defrag_range_args { | 1951 | struct btrfs_ioctl_defrag_range_args { |
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index bcbb596d9695..0e0544e0e20b 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c | |||
| @@ -1267,6 +1267,7 @@ static void __setup_root(u32 nodesize, u32 sectorsize, u32 stripesize, | |||
| 1267 | atomic_set(&root->orphan_inodes, 0); | 1267 | atomic_set(&root->orphan_inodes, 0); |
| 1268 | atomic_set(&root->refs, 1); | 1268 | atomic_set(&root->refs, 1); |
| 1269 | atomic_set(&root->will_be_snapshoted, 0); | 1269 | atomic_set(&root->will_be_snapshoted, 0); |
| 1270 | atomic_set(&root->qgroup_meta_rsv, 0); | ||
| 1270 | root->log_transid = 0; | 1271 | root->log_transid = 0; |
| 1271 | root->log_transid_committed = -1; | 1272 | root->log_transid_committed = -1; |
| 1272 | root->last_log_commit = 0; | 1273 | root->last_log_commit = 0; |
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 | } | ||
diff --git a/fs/btrfs/qgroup.h b/fs/btrfs/qgroup.h index 80924aeceb09..7d1c87cd3c78 100644 --- a/fs/btrfs/qgroup.h +++ b/fs/btrfs/qgroup.h | |||
| @@ -101,4 +101,8 @@ int btrfs_verify_qgroup_counts(struct btrfs_fs_info *fs_info, u64 qgroupid, | |||
| 101 | int btrfs_qgroup_reserve_data(struct inode *inode, u64 start, u64 len); | 101 | int btrfs_qgroup_reserve_data(struct inode *inode, u64 start, u64 len); |
| 102 | int btrfs_qgroup_release_data(struct inode *inode, u64 start, u64 len); | 102 | int btrfs_qgroup_release_data(struct inode *inode, u64 start, u64 len); |
| 103 | int btrfs_qgroup_free_data(struct inode *inode, u64 start, u64 len); | 103 | int btrfs_qgroup_free_data(struct inode *inode, u64 start, u64 len); |
| 104 | |||
| 105 | int btrfs_qgroup_reserve_meta(struct btrfs_root *root, int num_bytes); | ||
| 106 | void btrfs_qgroup_free_meta_all(struct btrfs_root *root); | ||
| 107 | void btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes); | ||
| 104 | #endif /* __BTRFS_QGROUP__ */ | 108 | #endif /* __BTRFS_QGROUP__ */ |
