Hi all, Okey, this is the V2 for the qgroup type. In this version, we account both of the data and metadata in a qgroup and you can limit data or metadata or mixed. You can limit them at the same time.
(a). I restructed the btrfs_qgroup in memory: btrfs_qgroup: |-------------| ----------------- |rfer | |data_info |--------------->btrfs_qgroup_info|rfer_cmpr | |metadata_info | |excl | | | |excl_cmpr | |data_limits | --------------- |metadata_limits| |mixed_limits |--------------->btrfs_qgroup_limits|------------- |-------------- | |lim_flags | |max_rfer | |max_excl | |rsv_rfer | |rsv_excl | ------------ In this way, we can store the information for data and metadata separately. And we can limit then in three ways: data_limits, metadata_limits and mixed_limits. (b). I have to add a incompatability feature for it. I reuse the objectid to search btrfs_qgroup_info_item. ------------------------------------ ------------------------------------------------ |0 |BTRFS_QGROUP_INFO_KEY |qgroupid| ------------>|TYPE_OBJECTID |BTRFS_QGROUP_INFO_KEY |qgroupid| ------------------------------------ ------------------------------------------------ And introduce two macros for different type of infos. #define BTRFS_QGROUP_DATA_INFO_OBJECTID 1ULL #define BTRFS_QGROUP_METADATA_INFO_OBJECTID 2ULL There is a similar change for limits. (c). Testing. Hi Chris and David, as what I mentioned in a offline mail, there is a url for merging or testing. btrfs: https://yangdongsh...@github.com/yangdongsheng/linux.git qgroup_type_v2 btrfs-progs: https://yangdongsh...@github.com/yangdongsheng/btrfs-progs.git qgroup_type_v2 (1). btrfs/022 and btrfs/042 kernel.v4.0-4c1 kernel.qgroup_type.patched v3.19-rc2(progs) pass pass Patched(progs) pass pass (2). No qgroup type. Script: # mkfs.btrfs /dev/sdc -f # mount /dev/sdc /mnt # btrfs quota enable /mnt # btrfs quota rescan -w /mnt # btrfs sub create /mnt/sub # btrfs qgroup limit -e 10M 0/257 /mnt # dd if=/dev/zero of=/mnt/sub/data bs=1024 count=1000000 # sync # btrfs qgroup show -prce --raw /mnt Expected: dd: error writing '/mnt/sub/data': Disk quota exceeded 10145+0 records in 10144+0 records out 10387456 bytes (10 MB) copied, 0.0368423 s, 282 MB/s qgroupid rfer excl max_rfer max_excl parent child -------- ---- ---- -------- -------- ------ ----- 0/5 16384 16384 0 0 --- --- 0/257 10403840 10403840 0 0 --- --- kernel.v4.0-4c1.bugfix_patched kernel.qgroup_type.patched v3.19-rc2(progs) pass pass Patched(progs) pass pass (3) qgroup type. Script: # mkfs.btrfs -O qgroup-type /dev/sdc -f # mount /dev/sdc /mnt # btrfs quota enable /mnt # btrfs quota rescan -w /mnt # btrfs sub create /mnt/sub # btrfs qgroup limit --type data -e 10M 0/257 /mnt # dd if=/dev/zero of=/mnt/sub/data bs=1024 count=1000000 # sync # btrfs qgroup show -prce --raw --type data /mnt # btrfs qgroup show -prce --raw --type metadata /mnt # btrfs qgroup show -prce --raw --type mixed /mnt kernel.v4.0-4c1.bugfix_patched kernel.qgroup_type.patched v3.19-rc2(progs) mkfs fail(no feature for qgroup-type) mkfs fail(no feature for qgroup-type) Patched(progs) open_ctree failed. (Expected) result as below. (pass) Result: dd: error writing '/mnt/sub/data': Disk quota exceeded 10241+0 records in 10240+0 records out <------10240 means 10M 10485760 bytes (10 MB) copied, 0.0331533 s, 316 MB/s qgroupid rfer excl max_rfer max_excl parent child -------- ---- ---- -------- -------- ------ ----- 0/5 0 0 0 0 --- --- 0/257 10485760 10485760 0 10485760 --- --- <------DATA info and limits qgroupid rfer excl max_rfer max_excl parent child -------- ---- ---- -------- -------- ------ ----- 0/5 16384 16384 0 0 --- --- 0/257 16384 16384 0 0 --- --- <------METADATA info and limits qgroupid rfer excl max_rfer max_excl parent child -------- ---- ---- -------- -------- ------ ----- 0/5 16384 16384 0 0 --- --- 0/257 10502144 10502144 0 0 --- --- <------MIXED info and limits After all, you can use btrfs-debug-tree tool to show the details for each items. Any comment or test are welcome !!! Thanx Yang Dongsheng Yang (7): Btrfs: qgroup: split information and limits in qgroup to other structures. Btrfs: qgroup: add incompatability feature for QGROUP_TYPE. Btrfs: qgroup: record and account ref for qgroup in different type. Btrfs: qgroup: update all infos and limits to disk. Btrfs: qgroup: update quota numbers in btrfs_qgroup_inherit. Btrfs: qgroup: account data and metadata separately in rescan. Btrfs: qgroup: allow user to limit qgroup in different type. fs/btrfs/ctree.h | 20 +- fs/btrfs/extent-tree.c | 48 ++-- fs/btrfs/qgroup.c | 536 +++++++++++++++++++++++++++++++++--------- fs/btrfs/qgroup.h | 52 +++- fs/btrfs/tests/qgroup-tests.c | 15 +- fs/btrfs/transaction.c | 11 +- 6 files changed, 534 insertions(+), 148 deletions(-) -- 1.8.4.2 -- 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