forked from Minki/linux
Btrfs: qgroup implementation and prototypes
Signed-off-by: Arne Jansen <sensille@gmx.net> Signed-off-by: Jan Schmidt <list.btrfs@jan-o-sch.net>
This commit is contained in:
parent
709c0486b9
commit
bed92eae26
@ -8,7 +8,7 @@ btrfs-y += super.o ctree.o extent-tree.o print-tree.o root-tree.o dir-item.o \
|
||||
extent_io.o volumes.o async-thread.o ioctl.o locking.o orphan.o \
|
||||
export.o tree-log.o free-space-cache.o zlib.o lzo.o \
|
||||
compression.o delayed-ref.o relocation.o delayed-inode.o scrub.o \
|
||||
reada.o backref.o ulist.o
|
||||
reada.o backref.o ulist.o qgroup.o
|
||||
|
||||
btrfs-$(CONFIG_BTRFS_FS_POSIX_ACL) += acl.o
|
||||
btrfs-$(CONFIG_BTRFS_FS_CHECK_INTEGRITY) += check-integrity.o
|
||||
|
@ -2830,6 +2830,8 @@ int btrfs_force_chunk_alloc(struct btrfs_trans_handle *trans,
|
||||
int btrfs_trim_fs(struct btrfs_root *root, struct fstrim_range *range);
|
||||
|
||||
int btrfs_init_space_info(struct btrfs_fs_info *fs_info);
|
||||
int btrfs_delayed_refs_qgroup_accounting(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info);
|
||||
/* ctree.c */
|
||||
int btrfs_bin_search(struct extent_buffer *eb, struct btrfs_key *key,
|
||||
int level, int *slot);
|
||||
@ -3339,6 +3341,50 @@ void btrfs_reada_detach(void *handle);
|
||||
int btree_readahead_hook(struct btrfs_root *root, struct extent_buffer *eb,
|
||||
u64 start, int err);
|
||||
|
||||
/* qgroup.c */
|
||||
struct qgroup_update {
|
||||
struct list_head list;
|
||||
struct btrfs_delayed_ref_node *node;
|
||||
struct btrfs_delayed_extent_op *extent_op;
|
||||
};
|
||||
|
||||
int btrfs_quota_enable(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info);
|
||||
int btrfs_quota_disable(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info);
|
||||
int btrfs_quota_rescan(struct btrfs_fs_info *fs_info);
|
||||
int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info, u64 src, u64 dst);
|
||||
int btrfs_del_qgroup_relation(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info, u64 src, u64 dst);
|
||||
int btrfs_create_qgroup(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info, u64 qgroupid,
|
||||
char *name);
|
||||
int btrfs_remove_qgroup(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info, u64 qgroupid);
|
||||
int btrfs_limit_qgroup(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info, u64 qgroupid,
|
||||
struct btrfs_qgroup_limit *limit);
|
||||
int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info);
|
||||
void btrfs_free_qgroup_config(struct btrfs_fs_info *fs_info);
|
||||
struct btrfs_delayed_extent_op;
|
||||
int btrfs_qgroup_record_ref(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_delayed_ref_node *node,
|
||||
struct btrfs_delayed_extent_op *extent_op);
|
||||
int btrfs_qgroup_account_ref(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_delayed_ref_node *node,
|
||||
struct btrfs_delayed_extent_op *extent_op);
|
||||
int btrfs_run_qgroups(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info);
|
||||
int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info, u64 srcid, u64 objectid,
|
||||
struct btrfs_qgroup_inherit *inherit);
|
||||
int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes);
|
||||
void btrfs_qgroup_free(struct btrfs_root *root, u64 num_bytes);
|
||||
|
||||
void assert_qgroups_uptodate(struct btrfs_trans_handle *trans);
|
||||
|
||||
static inline int is_fstree(u64 rootid)
|
||||
{
|
||||
if (rootid == BTRFS_FS_TREE_OBJECTID ||
|
||||
|
@ -2409,6 +2409,40 @@ static u64 find_middle(struct rb_root *root)
|
||||
}
|
||||
#endif
|
||||
|
||||
int btrfs_delayed_refs_qgroup_accounting(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_fs_info *fs_info)
|
||||
{
|
||||
struct qgroup_update *qgroup_update;
|
||||
int ret = 0;
|
||||
|
||||
if (list_empty(&trans->qgroup_ref_list) !=
|
||||
!trans->delayed_ref_elem.seq) {
|
||||
/* list without seq or seq without list */
|
||||
printk(KERN_ERR "btrfs: qgroup accounting update error, list is%s empty, seq is %llu\n",
|
||||
list_empty(&trans->qgroup_ref_list) ? "" : " not",
|
||||
trans->delayed_ref_elem.seq);
|
||||
BUG();
|
||||
}
|
||||
|
||||
if (!trans->delayed_ref_elem.seq)
|
||||
return 0;
|
||||
|
||||
while (!list_empty(&trans->qgroup_ref_list)) {
|
||||
qgroup_update = list_first_entry(&trans->qgroup_ref_list,
|
||||
struct qgroup_update, list);
|
||||
list_del(&qgroup_update->list);
|
||||
if (!ret)
|
||||
ret = btrfs_qgroup_account_ref(
|
||||
trans, fs_info, qgroup_update->node,
|
||||
qgroup_update->extent_op);
|
||||
kfree(qgroup_update);
|
||||
}
|
||||
|
||||
btrfs_put_tree_mod_seq(fs_info, &trans->delayed_ref_elem);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* this starts processing the delayed reference count updates and
|
||||
* extent insertions we have queued up so far. count can be
|
||||
|
@ -35,6 +35,30 @@ struct btrfs_ioctl_vol_args {
|
||||
#define BTRFS_FSID_SIZE 16
|
||||
#define BTRFS_UUID_SIZE 16
|
||||
|
||||
#define BTRFS_QGROUP_INHERIT_SET_LIMITS (1ULL << 0)
|
||||
|
||||
struct btrfs_qgroup_limit {
|
||||
__u64 flags;
|
||||
__u64 max_rfer;
|
||||
__u64 max_excl;
|
||||
__u64 rsv_rfer;
|
||||
__u64 rsv_excl;
|
||||
};
|
||||
|
||||
struct btrfs_qgroup_inherit {
|
||||
__u64 flags;
|
||||
__u64 num_qgroups;
|
||||
__u64 num_ref_copies;
|
||||
__u64 num_excl_copies;
|
||||
struct btrfs_qgroup_limit lim;
|
||||
__u64 qgroups[0];
|
||||
};
|
||||
|
||||
struct btrfs_ioctl_qgroup_limit_args {
|
||||
__u64 qgroupid;
|
||||
struct btrfs_qgroup_limit lim;
|
||||
};
|
||||
|
||||
#define BTRFS_SUBVOL_NAME_MAX 4039
|
||||
struct btrfs_ioctl_vol_args_v2 {
|
||||
__s64 fd;
|
||||
|
1571
fs/btrfs/qgroup.c
Normal file
1571
fs/btrfs/qgroup.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -351,6 +351,8 @@ again:
|
||||
h->block_rsv = NULL;
|
||||
h->orig_rsv = NULL;
|
||||
h->aborted = 0;
|
||||
h->delayed_ref_elem.seq = 0;
|
||||
INIT_LIST_HEAD(&h->qgroup_ref_list);
|
||||
|
||||
smp_mb();
|
||||
if (cur_trans->blocked && may_wait_transaction(root, type)) {
|
||||
|
@ -20,6 +20,7 @@
|
||||
#define __BTRFS_TRANSACTION__
|
||||
#include "btrfs_inode.h"
|
||||
#include "delayed-ref.h"
|
||||
#include "ctree.h"
|
||||
|
||||
struct btrfs_transaction {
|
||||
u64 transid;
|
||||
@ -63,6 +64,8 @@ struct btrfs_trans_handle {
|
||||
* Subvolume quota depends on this
|
||||
*/
|
||||
struct btrfs_root *root;
|
||||
struct seq_list delayed_ref_elem;
|
||||
struct list_head qgroup_ref_list;
|
||||
};
|
||||
|
||||
struct btrfs_pending_snapshot {
|
||||
|
Loading…
Reference in New Issue
Block a user