fs/btrfs/qgroup.c
Source file repositories/reference/linux-study-clean/fs/btrfs/qgroup.c
File Facts
- System
- Linux kernel
- Corpus path
fs/btrfs/qgroup.c- Extension
.c- Size
- 139049 bytes
- Lines
- 4990
- Domain
- Core OS
- Bucket
- VFS And Filesystem Core
- Inferred role
- Core OS: implementation source
- Status
- source implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/sched.hlinux/pagemap.hlinux/writeback.hlinux/blkdev.hlinux/rbtree.hlinux/slab.hlinux/workqueue.hlinux/btrfs.hlinux/sched/mm.hctree.htransaction.hdisk-io.hlocking.hulist.hbackref.hextent_io.hqgroup.hblock-group.hsysfs.htree-mod-log.hfs.haccessors.hextent-tree.hroot-tree.htree-checker.h
Detected Declarations
function Copyrightfunction btrfs_qgroup_enabledfunction btrfs_qgroup_full_accountingfunction qgroup_rsv_totalfunction qgroup_rsv_addfunction qgroup_rsv_releasefunction qgroup_rsv_add_by_qgroupfunction qgroup_rsv_release_by_qgroupfunction btrfs_qgroup_update_old_refcntfunction btrfs_qgroup_update_new_refcntfunction btrfs_qgroup_get_old_refcntfunction btrfs_qgroup_get_new_refcntfunction btrfs_qgroup_qgroupid_key_cmpfunction btrfs_qgroup_qgroupid_cmpfunction __del_qgroup_rbfunction del_qgroup_rbfunction __add_relation_rbfunction add_relation_rbfunction del_relation_rbfunction list_for_each_entryfunction btrfs_verify_qgroup_countsfunction squota_check_parent_usagefunction qgroup_mark_inconsistentfunction qgroup_read_enable_genfunction btrfs_read_qgroup_configfunction close_ctreefunction close_ctreefunction add_qgroup_relation_itemfunction del_qgroup_relation_itemfunction add_qgroup_itemfunction del_qgroup_itemfunction update_qgroup_limit_itemfunction update_qgroup_info_itemfunction update_qgroup_status_itemfunction btrfs_clean_quota_treefunction btrfs_quota_enablefunction flush_reservationsfunction btrfs_quota_disablefunction qgroup_dirtyfunction qgroup_iterator_addfunction qgroup_iterator_cleanfunction reservationfunction quick_update_accountingfunction herefunction __del_qgroup_relationfunction btrfs_del_qgroup_relationfunction btrfs_create_qgroupfunction can_delete_parent_qgroup
Annotated Snippet
if (list->group == parent) {
list_del(&list->next_group);
list_del(&list->next_member);
kfree(list);
return 0;
}
}
return -ENOENT;
}
#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
int btrfs_verify_qgroup_counts(const struct btrfs_fs_info *fs_info, u64 qgroupid,
u64 rfer, u64 excl)
{
struct btrfs_qgroup *qgroup;
qgroup = find_qgroup_rb(fs_info, qgroupid);
if (!qgroup)
return -EINVAL;
if (qgroup->rfer != rfer || qgroup->excl != excl)
return -EINVAL;
return 0;
}
#endif
static bool squota_check_parent_usage(struct btrfs_fs_info *fs_info, struct btrfs_qgroup *parent)
{
u64 excl_sum = 0;
u64 rfer_sum = 0;
u64 excl_cmpr_sum = 0;
u64 rfer_cmpr_sum = 0;
struct btrfs_qgroup_list *glist;
int nr_members = 0;
bool mismatch;
if (btrfs_qgroup_mode(fs_info) != BTRFS_QGROUP_MODE_SIMPLE)
return false;
if (btrfs_qgroup_level(parent->qgroupid) == 0)
return false;
/* Eligible parent qgroup. Squota; level > 0; empty members list. */
list_for_each_entry(glist, &parent->members, next_member) {
excl_sum += glist->member->excl;
rfer_sum += glist->member->rfer;
excl_cmpr_sum += glist->member->excl_cmpr;
rfer_cmpr_sum += glist->member->rfer_cmpr;
nr_members++;
}
mismatch = (parent->excl != excl_sum || parent->rfer != rfer_sum ||
parent->excl_cmpr != excl_cmpr_sum || parent->rfer_cmpr != rfer_cmpr_sum);
WARN(mismatch,
"parent squota qgroup " BTRFS_QGROUP_FMT " has mismatched usage from its %d members. "
"%llu %llu %llu %llu vs %llu %llu %llu %llu\n",
BTRFS_QGROUP_FMT_VALUE(parent), nr_members, parent->excl,
parent->rfer, parent->excl_cmpr, parent->rfer_cmpr, excl_sum,
rfer_sum, excl_cmpr_sum, rfer_cmpr_sum);
return mismatch;
}
__printf(2, 3)
static void qgroup_mark_inconsistent(struct btrfs_fs_info *fs_info, const char *fmt, ...)
{
const u64 old_flags = fs_info->qgroup_flags;
if (btrfs_qgroup_mode(fs_info) == BTRFS_QGROUP_MODE_SIMPLE)
return;
fs_info->qgroup_flags |= (BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT |
BTRFS_QGROUP_RUNTIME_FLAG_CANCEL_RESCAN |
BTRFS_QGROUP_RUNTIME_FLAG_NO_ACCOUNTING);
if (!(old_flags & BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT)) {
struct va_format vaf;
va_list args;
va_start(args, fmt);
vaf.fmt = fmt;
vaf.va = &args;
btrfs_warn_rl(fs_info, "qgroup marked inconsistent, %pV", &vaf);
va_end(args);
}
}
static void qgroup_read_enable_gen(struct btrfs_fs_info *fs_info,
struct extent_buffer *leaf, int slot,
struct btrfs_qgroup_status_item *ptr)
{
ASSERT(btrfs_fs_incompat(fs_info, SIMPLE_QUOTA));
ASSERT(btrfs_item_size(leaf, slot) >= sizeof(*ptr));
fs_info->qgroup_enable_gen = btrfs_qgroup_status_enable_gen(leaf, ptr);
Annotation
- Immediate include surface: `linux/sched.h`, `linux/pagemap.h`, `linux/writeback.h`, `linux/blkdev.h`, `linux/rbtree.h`, `linux/slab.h`, `linux/workqueue.h`, `linux/btrfs.h`.
- Detected declarations: `function Copyright`, `function btrfs_qgroup_enabled`, `function btrfs_qgroup_full_accounting`, `function qgroup_rsv_total`, `function qgroup_rsv_add`, `function qgroup_rsv_release`, `function qgroup_rsv_add_by_qgroup`, `function qgroup_rsv_release_by_qgroup`, `function btrfs_qgroup_update_old_refcnt`, `function btrfs_qgroup_update_new_refcnt`.
- Atlas domain: Core OS / VFS And Filesystem Core.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.