Skip to content

Commit bed92ea

Browse files
Arne JansenJan Schmidt
authored andcommitted
Btrfs: qgroup implementation and prototypes
Signed-off-by: Arne Jansen <[email protected]> Signed-off-by: Jan Schmidt <[email protected]>
1 parent 709c048 commit bed92ea

File tree

7 files changed

+1681
-1
lines changed

7 files changed

+1681
-1
lines changed

fs/btrfs/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ btrfs-y += super.o ctree.o extent-tree.o print-tree.o root-tree.o dir-item.o \
88
extent_io.o volumes.o async-thread.o ioctl.o locking.o orphan.o \
99
export.o tree-log.o free-space-cache.o zlib.o lzo.o \
1010
compression.o delayed-ref.o relocation.o delayed-inode.o scrub.o \
11-
reada.o backref.o ulist.o
11+
reada.o backref.o ulist.o qgroup.o
1212

1313
btrfs-$(CONFIG_BTRFS_FS_POSIX_ACL) += acl.o
1414
btrfs-$(CONFIG_BTRFS_FS_CHECK_INTEGRITY) += check-integrity.o

fs/btrfs/ctree.h

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2830,6 +2830,8 @@ int btrfs_force_chunk_alloc(struct btrfs_trans_handle *trans,
28302830
int btrfs_trim_fs(struct btrfs_root *root, struct fstrim_range *range);
28312831

28322832
int btrfs_init_space_info(struct btrfs_fs_info *fs_info);
2833+
int btrfs_delayed_refs_qgroup_accounting(struct btrfs_trans_handle *trans,
2834+
struct btrfs_fs_info *fs_info);
28332835
/* ctree.c */
28342836
int btrfs_bin_search(struct extent_buffer *eb, struct btrfs_key *key,
28352837
int level, int *slot);
@@ -3339,6 +3341,50 @@ void btrfs_reada_detach(void *handle);
33393341
int btree_readahead_hook(struct btrfs_root *root, struct extent_buffer *eb,
33403342
u64 start, int err);
33413343

3344+
/* qgroup.c */
3345+
struct qgroup_update {
3346+
struct list_head list;
3347+
struct btrfs_delayed_ref_node *node;
3348+
struct btrfs_delayed_extent_op *extent_op;
3349+
};
3350+
3351+
int btrfs_quota_enable(struct btrfs_trans_handle *trans,
3352+
struct btrfs_fs_info *fs_info);
3353+
int btrfs_quota_disable(struct btrfs_trans_handle *trans,
3354+
struct btrfs_fs_info *fs_info);
3355+
int btrfs_quota_rescan(struct btrfs_fs_info *fs_info);
3356+
int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans,
3357+
struct btrfs_fs_info *fs_info, u64 src, u64 dst);
3358+
int btrfs_del_qgroup_relation(struct btrfs_trans_handle *trans,
3359+
struct btrfs_fs_info *fs_info, u64 src, u64 dst);
3360+
int btrfs_create_qgroup(struct btrfs_trans_handle *trans,
3361+
struct btrfs_fs_info *fs_info, u64 qgroupid,
3362+
char *name);
3363+
int btrfs_remove_qgroup(struct btrfs_trans_handle *trans,
3364+
struct btrfs_fs_info *fs_info, u64 qgroupid);
3365+
int btrfs_limit_qgroup(struct btrfs_trans_handle *trans,
3366+
struct btrfs_fs_info *fs_info, u64 qgroupid,
3367+
struct btrfs_qgroup_limit *limit);
3368+
int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info);
3369+
void btrfs_free_qgroup_config(struct btrfs_fs_info *fs_info);
3370+
struct btrfs_delayed_extent_op;
3371+
int btrfs_qgroup_record_ref(struct btrfs_trans_handle *trans,
3372+
struct btrfs_delayed_ref_node *node,
3373+
struct btrfs_delayed_extent_op *extent_op);
3374+
int btrfs_qgroup_account_ref(struct btrfs_trans_handle *trans,
3375+
struct btrfs_fs_info *fs_info,
3376+
struct btrfs_delayed_ref_node *node,
3377+
struct btrfs_delayed_extent_op *extent_op);
3378+
int btrfs_run_qgroups(struct btrfs_trans_handle *trans,
3379+
struct btrfs_fs_info *fs_info);
3380+
int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans,
3381+
struct btrfs_fs_info *fs_info, u64 srcid, u64 objectid,
3382+
struct btrfs_qgroup_inherit *inherit);
3383+
int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes);
3384+
void btrfs_qgroup_free(struct btrfs_root *root, u64 num_bytes);
3385+
3386+
void assert_qgroups_uptodate(struct btrfs_trans_handle *trans);
3387+
33423388
static inline int is_fstree(u64 rootid)
33433389
{
33443390
if (rootid == BTRFS_FS_TREE_OBJECTID ||

fs/btrfs/extent-tree.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2409,6 +2409,40 @@ static u64 find_middle(struct rb_root *root)
24092409
}
24102410
#endif
24112411

2412+
int btrfs_delayed_refs_qgroup_accounting(struct btrfs_trans_handle *trans,
2413+
struct btrfs_fs_info *fs_info)
2414+
{
2415+
struct qgroup_update *qgroup_update;
2416+
int ret = 0;
2417+
2418+
if (list_empty(&trans->qgroup_ref_list) !=
2419+
!trans->delayed_ref_elem.seq) {
2420+
/* list without seq or seq without list */
2421+
printk(KERN_ERR "btrfs: qgroup accounting update error, list is%s empty, seq is %llu\n",
2422+
list_empty(&trans->qgroup_ref_list) ? "" : " not",
2423+
trans->delayed_ref_elem.seq);
2424+
BUG();
2425+
}
2426+
2427+
if (!trans->delayed_ref_elem.seq)
2428+
return 0;
2429+
2430+
while (!list_empty(&trans->qgroup_ref_list)) {
2431+
qgroup_update = list_first_entry(&trans->qgroup_ref_list,
2432+
struct qgroup_update, list);
2433+
list_del(&qgroup_update->list);
2434+
if (!ret)
2435+
ret = btrfs_qgroup_account_ref(
2436+
trans, fs_info, qgroup_update->node,
2437+
qgroup_update->extent_op);
2438+
kfree(qgroup_update);
2439+
}
2440+
2441+
btrfs_put_tree_mod_seq(fs_info, &trans->delayed_ref_elem);
2442+
2443+
return ret;
2444+
}
2445+
24122446
/*
24132447
* this starts processing the delayed reference count updates and
24142448
* extent insertions we have queued up so far. count can be

fs/btrfs/ioctl.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,30 @@ struct btrfs_ioctl_vol_args {
3535
#define BTRFS_FSID_SIZE 16
3636
#define BTRFS_UUID_SIZE 16
3737

38+
#define BTRFS_QGROUP_INHERIT_SET_LIMITS (1ULL << 0)
39+
40+
struct btrfs_qgroup_limit {
41+
__u64 flags;
42+
__u64 max_rfer;
43+
__u64 max_excl;
44+
__u64 rsv_rfer;
45+
__u64 rsv_excl;
46+
};
47+
48+
struct btrfs_qgroup_inherit {
49+
__u64 flags;
50+
__u64 num_qgroups;
51+
__u64 num_ref_copies;
52+
__u64 num_excl_copies;
53+
struct btrfs_qgroup_limit lim;
54+
__u64 qgroups[0];
55+
};
56+
57+
struct btrfs_ioctl_qgroup_limit_args {
58+
__u64 qgroupid;
59+
struct btrfs_qgroup_limit lim;
60+
};
61+
3862
#define BTRFS_SUBVOL_NAME_MAX 4039
3963
struct btrfs_ioctl_vol_args_v2 {
4064
__s64 fd;

0 commit comments

Comments
 (0)