On 2017年10月24日 19:00, Nikolay Borisov wrote: > > > On 24.10.2017 11:39, Qu Wenruo wrote: >> Instead of single qgroup->reserved, use a new structure btrfs_qgroup_rsv >> to restore different types of reservation. >> >> This patch only updates the header and needed modification to pass >> compile. >> >> Signed-off-by: Qu Wenruo <w...@suse.com> >> --- >> fs/btrfs/qgroup.c | 16 ++++++++++------ >> fs/btrfs/qgroup.h | 27 +++++++++++++++++++++++++-- >> 2 files changed, 35 insertions(+), 8 deletions(-) >> >> diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c >> index e172d4843eae..fe3adb996883 100644 >> --- a/fs/btrfs/qgroup.c >> +++ b/fs/btrfs/qgroup.c >> @@ -2444,7 +2444,8 @@ static int qgroup_reserve(struct btrfs_root *root, u64 >> num_bytes, bool enforce) >> } >> >> void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info, >> - u64 ref_root, u64 num_bytes) >> + u64 ref_root, u64 num_bytes, >> + enum btrfs_qgroup_rsv_type type) >> { >> struct btrfs_root *quota_root; >> struct btrfs_qgroup *qgroup; >> @@ -2936,7 +2937,8 @@ static int qgroup_free_reserved_data(struct inode >> *inode, >> goto out; >> freed += changeset.bytes_changed; >> } >> - btrfs_qgroup_free_refroot(root->fs_info, root->objectid, freed); >> + btrfs_qgroup_free_refroot(root->fs_info, root->objectid, freed, >> + BTRFS_QGROUP_RSV_DATA); >> ret = freed; >> out: >> extent_changeset_release(&changeset); >> @@ -2968,7 +2970,7 @@ static int __btrfs_qgroup_release_data(struct inode >> *inode, >> if (free) >> btrfs_qgroup_free_refroot(BTRFS_I(inode)->root->fs_info, >> BTRFS_I(inode)->root->objectid, >> - changeset.bytes_changed); >> + changeset.bytes_changed, BTRFS_QGROUP_RSV_DATA); >> ret = changeset.bytes_changed; >> out: >> extent_changeset_release(&changeset); >> @@ -3045,7 +3047,8 @@ void btrfs_qgroup_free_meta_all(struct btrfs_root >> *root) >> if (reserved == 0) >> return; >> trace_qgroup_meta_reserve(root, -(s64)reserved); >> - btrfs_qgroup_free_refroot(fs_info, root->objectid, reserved); >> + btrfs_qgroup_free_refroot(fs_info, root->objectid, reserved, >> + BTRFS_QGROUP_RSV_META); >> } >> >> void btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes) >> @@ -3060,7 +3063,8 @@ void btrfs_qgroup_free_meta(struct btrfs_root *root, >> int num_bytes) >> WARN_ON(atomic64_read(&root->qgroup_meta_rsv) < num_bytes); >> atomic64_sub(num_bytes, &root->qgroup_meta_rsv); >> trace_qgroup_meta_reserve(root, -(s64)num_bytes); >> - btrfs_qgroup_free_refroot(fs_info, root->objectid, num_bytes); >> + btrfs_qgroup_free_refroot(fs_info, root->objectid, num_bytes, >> + BTRFS_QGROUP_RSV_META); >> } >> >> /* >> @@ -3088,7 +3092,7 @@ void btrfs_qgroup_check_reserved_leak(struct inode >> *inode) >> } >> btrfs_qgroup_free_refroot(BTRFS_I(inode)->root->fs_info, >> BTRFS_I(inode)->root->objectid, >> - changeset.bytes_changed); >> + changeset.bytes_changed, BTRFS_QGROUP_RSV_DATA); >> >> } >> extent_changeset_release(&changeset); >> diff --git a/fs/btrfs/qgroup.h b/fs/btrfs/qgroup.h >> index d9984e87cddf..0b04cbc5b5ce 100644 >> --- a/fs/btrfs/qgroup.h >> +++ b/fs/btrfs/qgroup.h >> @@ -61,6 +61,26 @@ struct btrfs_qgroup_extent_record { >> struct ulist *old_roots; >> }; >> >> +enum btrfs_qgroup_rsv_type { >> + BTRFS_QGROUP_RSV_DATA = 0, >> + BTRFS_QGROUP_RSV_META = 1, >> + BTRFS_QGROUP_RSV_TYPES = 1, > > nit: Why not BTRFS_QGROUP_RSV_TYPES_MAX = 2;
My original plan is just as the same as yours. However I still remember I did it before and David fixed it by using TYPES, so I follow his naming schema here. Kernel is also using this naming schema else where: d91876496bcf ("btrfs: compress: put variables defined per compress type in struct to make cache friendly") > >> +}; >> + >> +/* >> + * Represents how many bytes we reserved for this qgroup. >> + * >> + * Each type should have different reservation behavior. >> + * E.g, data follows its io_tree flag modification, while >> + * *currently* meta is just reserve-and-clear during transcation. >> + * >> + * TODO: Add new type for delalloc, which can exist across several >> + * transaction. >> + */ >> +struct btrfs_qgroup_rsv { >> + u64 values[BTRFS_QGROUP_RSV_TYPES + 1]; > > nit: And here just BTRFS_QGROUP_RSV_TYPES_MAX rather than the +1 here, > seems more idiomatic to me. To follow same naming schema from David. (IIRC it was about tree-checker patchset, checking file extent type part) In fact, I crashed kernel several times due to the tiny +1, without even a clue for hours just testing blindly, until latest gcc gives warning about it. Thanks, Qu > >> +}; >> + >> /* >> * one struct for each qgroup, organized in fs_info->qgroup_tree. >> */ >> @@ -88,6 +108,7 @@ struct btrfs_qgroup { >> * reservation tracking >> */ >> u64 reserved; >> + struct btrfs_qgroup_rsv rsv; >> >> /* >> * lists >> @@ -228,12 +249,14 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle >> *trans, >> struct btrfs_fs_info *fs_info, u64 srcid, u64 objectid, >> struct btrfs_qgroup_inherit *inherit); >> void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info, >> - u64 ref_root, u64 num_bytes); >> + u64 ref_root, u64 num_bytes, >> + enum btrfs_qgroup_rsv_type type); >> static inline void btrfs_qgroup_free_delayed_ref(struct btrfs_fs_info >> *fs_info, >> u64 ref_root, u64 num_bytes) >> { >> trace_btrfs_qgroup_free_delayed_ref(fs_info, ref_root, num_bytes); >> - btrfs_qgroup_free_refroot(fs_info, ref_root, num_bytes); >> + btrfs_qgroup_free_refroot(fs_info, ref_root, num_bytes, >> + BTRFS_QGROUP_RSV_DATA); >> } >> >> #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS >> > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >
signature.asc
Description: OpenPGP digital signature