|
@@ -69,8 +69,10 @@ static const char *qgroup_rsv_type_str(enum btrfs_qgroup_rsv_type type)
|
|
{
|
|
{
|
|
if (type == BTRFS_QGROUP_RSV_DATA)
|
|
if (type == BTRFS_QGROUP_RSV_DATA)
|
|
return "data";
|
|
return "data";
|
|
- if (type == BTRFS_QGROUP_RSV_META)
|
|
|
|
- return "meta";
|
|
|
|
|
|
+ if (type == BTRFS_QGROUP_RSV_META_PERTRANS)
|
|
|
|
+ return "meta_pertrans";
|
|
|
|
+ if (type == BTRFS_QGROUP_RSV_META_PREALLOC)
|
|
|
|
+ return "meta_prealloc";
|
|
return NULL;
|
|
return NULL;
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
@@ -3065,8 +3067,8 @@ int btrfs_qgroup_release_data(struct inode *inode, u64 start, u64 len)
|
|
return __btrfs_qgroup_release_data(inode, NULL, start, len, 0);
|
|
return __btrfs_qgroup_release_data(inode, NULL, start, len, 0);
|
|
}
|
|
}
|
|
|
|
|
|
-int btrfs_qgroup_reserve_meta(struct btrfs_root *root, int num_bytes,
|
|
|
|
- bool enforce)
|
|
|
|
|
|
+int __btrfs_qgroup_reserve_meta(struct btrfs_root *root, int num_bytes,
|
|
|
|
+ enum btrfs_qgroup_rsv_type type, bool enforce)
|
|
{
|
|
{
|
|
struct btrfs_fs_info *fs_info = root->fs_info;
|
|
struct btrfs_fs_info *fs_info = root->fs_info;
|
|
int ret;
|
|
int ret;
|
|
@@ -3077,14 +3079,14 @@ int btrfs_qgroup_reserve_meta(struct btrfs_root *root, int num_bytes,
|
|
|
|
|
|
BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize));
|
|
BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize));
|
|
trace_qgroup_meta_reserve(root, (s64)num_bytes);
|
|
trace_qgroup_meta_reserve(root, (s64)num_bytes);
|
|
- ret = qgroup_reserve(root, num_bytes, enforce, BTRFS_QGROUP_RSV_META);
|
|
|
|
|
|
+ ret = qgroup_reserve(root, num_bytes, enforce, type);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
return ret;
|
|
return ret;
|
|
atomic64_add(num_bytes, &root->qgroup_meta_rsv);
|
|
atomic64_add(num_bytes, &root->qgroup_meta_rsv);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-void btrfs_qgroup_free_meta_all(struct btrfs_root *root)
|
|
|
|
|
|
+void btrfs_qgroup_free_meta_all_pertrans(struct btrfs_root *root)
|
|
{
|
|
{
|
|
struct btrfs_fs_info *fs_info = root->fs_info;
|
|
struct btrfs_fs_info *fs_info = root->fs_info;
|
|
u64 reserved;
|
|
u64 reserved;
|
|
@@ -3098,10 +3100,11 @@ void btrfs_qgroup_free_meta_all(struct btrfs_root *root)
|
|
return;
|
|
return;
|
|
trace_qgroup_meta_reserve(root, -(s64)reserved);
|
|
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);
|
|
|
|
|
|
+ BTRFS_QGROUP_RSV_META_PERTRANS);
|
|
}
|
|
}
|
|
|
|
|
|
-void btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes)
|
|
|
|
|
|
+void __btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes,
|
|
|
|
+ enum btrfs_qgroup_rsv_type type)
|
|
{
|
|
{
|
|
struct btrfs_fs_info *fs_info = root->fs_info;
|
|
struct btrfs_fs_info *fs_info = root->fs_info;
|
|
|
|
|
|
@@ -3113,8 +3116,7 @@ void btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes)
|
|
WARN_ON(atomic64_read(&root->qgroup_meta_rsv) < num_bytes);
|
|
WARN_ON(atomic64_read(&root->qgroup_meta_rsv) < num_bytes);
|
|
atomic64_sub(num_bytes, &root->qgroup_meta_rsv);
|
|
atomic64_sub(num_bytes, &root->qgroup_meta_rsv);
|
|
trace_qgroup_meta_reserve(root, -(s64)num_bytes);
|
|
trace_qgroup_meta_reserve(root, -(s64)num_bytes);
|
|
- btrfs_qgroup_free_refroot(fs_info, root->objectid, num_bytes,
|
|
|
|
- BTRFS_QGROUP_RSV_META);
|
|
|
|
|
|
+ btrfs_qgroup_free_refroot(fs_info, root->objectid, num_bytes, type);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|