Lines Matching refs:fs_info

70 static void qgroup_rsv_add(struct btrfs_fs_info *fs_info,  in qgroup_rsv_add()  argument
74 trace_qgroup_update_reserve(fs_info, qgroup, num_bytes, type); in qgroup_rsv_add()
78 static void qgroup_rsv_release(struct btrfs_fs_info *fs_info, in qgroup_rsv_release() argument
82 trace_qgroup_update_reserve(fs_info, qgroup, -(s64)num_bytes, type); in qgroup_rsv_release()
96 static void qgroup_rsv_add_by_qgroup(struct btrfs_fs_info *fs_info, in qgroup_rsv_add_by_qgroup() argument
103 qgroup_rsv_add(fs_info, dest, src->rsv.values[i], i); in qgroup_rsv_add_by_qgroup()
106 static void qgroup_rsv_release_by_qgroup(struct btrfs_fs_info *fs_info, in qgroup_rsv_release_by_qgroup() argument
113 qgroup_rsv_release(fs_info, dest, src->rsv.values[i], i); in qgroup_rsv_release_by_qgroup()
167 qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid,
169 static void qgroup_rescan_zero_tracking(struct btrfs_fs_info *fs_info);
172 static struct btrfs_qgroup *find_qgroup_rb(struct btrfs_fs_info *fs_info, in find_qgroup_rb() argument
175 struct rb_node *n = fs_info->qgroup_tree.rb_node; in find_qgroup_rb()
191 static struct btrfs_qgroup *add_qgroup_rb(struct btrfs_fs_info *fs_info, in add_qgroup_rb() argument
194 struct rb_node **p = &fs_info->qgroup_tree.rb_node; in add_qgroup_rb()
220 rb_insert_color(&qgroup->node, &fs_info->qgroup_tree); in add_qgroup_rb()
225 static void __del_qgroup_rb(struct btrfs_fs_info *fs_info, in __del_qgroup_rb() argument
249 static int del_qgroup_rb(struct btrfs_fs_info *fs_info, u64 qgroupid) in del_qgroup_rb() argument
251 struct btrfs_qgroup *qgroup = find_qgroup_rb(fs_info, qgroupid); in del_qgroup_rb()
256 rb_erase(&qgroup->node, &fs_info->qgroup_tree); in del_qgroup_rb()
257 __del_qgroup_rb(fs_info, qgroup); in del_qgroup_rb()
262 static int add_relation_rb(struct btrfs_fs_info *fs_info, in add_relation_rb() argument
269 member = find_qgroup_rb(fs_info, memberid); in add_relation_rb()
270 parent = find_qgroup_rb(fs_info, parentid); in add_relation_rb()
287 static int del_relation_rb(struct btrfs_fs_info *fs_info, in del_relation_rb() argument
294 member = find_qgroup_rb(fs_info, memberid); in del_relation_rb()
295 parent = find_qgroup_rb(fs_info, parentid); in del_relation_rb()
311 int btrfs_verify_qgroup_counts(struct btrfs_fs_info *fs_info, u64 qgroupid, in btrfs_verify_qgroup_counts() argument
316 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_verify_qgroup_counts()
329 int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info) in btrfs_read_qgroup_config() argument
333 struct btrfs_root *quota_root = fs_info->quota_root; in btrfs_read_qgroup_config()
341 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_read_qgroup_config()
344 fs_info->qgroup_ulist = ulist_alloc(GFP_KERNEL); in btrfs_read_qgroup_config()
345 if (!fs_info->qgroup_ulist) { in btrfs_read_qgroup_config()
356 ret = btrfs_sysfs_add_qgroups(fs_info); in btrfs_read_qgroup_config()
360 fs_info->qgroup_flags = 0; in btrfs_read_qgroup_config()
387 btrfs_err(fs_info, in btrfs_read_qgroup_config()
392 fs_info->generation) { in btrfs_read_qgroup_config()
394 btrfs_err(fs_info, in btrfs_read_qgroup_config()
397 fs_info->qgroup_flags = btrfs_qgroup_status_flags(l, in btrfs_read_qgroup_config()
407 qgroup = find_qgroup_rb(fs_info, found_key.offset); in btrfs_read_qgroup_config()
410 btrfs_err(fs_info, "inconsistent qgroup config"); in btrfs_read_qgroup_config()
414 qgroup = add_qgroup_rb(fs_info, found_key.offset); in btrfs_read_qgroup_config()
420 ret = btrfs_sysfs_add_one_qgroup(fs_info, qgroup); in btrfs_read_qgroup_config()
482 ret = add_relation_rb(fs_info, found_key.objectid, in btrfs_read_qgroup_config()
485 btrfs_warn(fs_info, in btrfs_read_qgroup_config()
501 fs_info->qgroup_flags |= flags; in btrfs_read_qgroup_config()
502 if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON)) in btrfs_read_qgroup_config()
503 clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); in btrfs_read_qgroup_config()
504 else if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN && in btrfs_read_qgroup_config()
506 ret = qgroup_rescan_init(fs_info, rescan_progress, 0); in btrfs_read_qgroup_config()
509 ulist_free(fs_info->qgroup_ulist); in btrfs_read_qgroup_config()
510 fs_info->qgroup_ulist = NULL; in btrfs_read_qgroup_config()
511 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_read_qgroup_config()
512 btrfs_sysfs_del_qgroups(fs_info); in btrfs_read_qgroup_config()
525 bool btrfs_check_quota_leak(struct btrfs_fs_info *fs_info) in btrfs_check_quota_leak() argument
530 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_check_quota_leak()
537 for (node = rb_first(&fs_info->qgroup_tree); node; node = rb_next(node)) { in btrfs_check_quota_leak()
545 btrfs_warn(fs_info, in btrfs_check_quota_leak()
562 void btrfs_free_qgroup_config(struct btrfs_fs_info *fs_info) in btrfs_free_qgroup_config() argument
567 while ((n = rb_first(&fs_info->qgroup_tree))) { in btrfs_free_qgroup_config()
569 rb_erase(n, &fs_info->qgroup_tree); in btrfs_free_qgroup_config()
570 __del_qgroup_rb(fs_info, qgroup); in btrfs_free_qgroup_config()
571 btrfs_sysfs_del_one_qgroup(fs_info, qgroup); in btrfs_free_qgroup_config()
579 ulist_free(fs_info->qgroup_ulist); in btrfs_free_qgroup_config()
580 fs_info->qgroup_ulist = NULL; in btrfs_free_qgroup_config()
581 btrfs_sysfs_del_qgroups(fs_info); in btrfs_free_qgroup_config()
588 struct btrfs_root *quota_root = trans->fs_info->quota_root; in add_qgroup_relation_item()
612 struct btrfs_root *quota_root = trans->fs_info->quota_root; in del_qgroup_relation_item()
649 if (btrfs_is_testing(quota_root->fs_info)) in add_qgroup_item()
710 struct btrfs_root *quota_root = trans->fs_info->quota_root; in del_qgroup_item()
756 struct btrfs_root *quota_root = trans->fs_info->quota_root; in update_qgroup_limit_item()
798 struct btrfs_fs_info *fs_info = trans->fs_info; in update_qgroup_info_item() local
799 struct btrfs_root *quota_root = fs_info->quota_root; in update_qgroup_info_item()
807 if (btrfs_is_testing(fs_info)) in update_qgroup_info_item()
843 struct btrfs_fs_info *fs_info = trans->fs_info; in update_qgroup_status_item() local
844 struct btrfs_root *quota_root = fs_info->quota_root; in update_qgroup_status_item()
870 btrfs_set_qgroup_status_flags(l, ptr, fs_info->qgroup_flags); in update_qgroup_status_item()
873 fs_info->qgroup_rescan_progress.objectid); in update_qgroup_status_item()
928 int btrfs_quota_enable(struct btrfs_fs_info *fs_info) in btrfs_quota_enable() argument
931 struct btrfs_root *tree_root = fs_info->tree_root; in btrfs_quota_enable()
943 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
944 if (fs_info->quota_root) in btrfs_quota_enable()
953 ret = btrfs_sysfs_add_qgroups(fs_info); in btrfs_quota_enable()
970 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
982 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
989 if (fs_info->quota_root) in btrfs_quota_enable()
992 fs_info->qgroup_ulist = ulist; in btrfs_quota_enable()
1028 fs_info->qgroup_flags = BTRFS_QGROUP_STATUS_FLAG_ON | in btrfs_quota_enable()
1030 btrfs_set_qgroup_status_flags(leaf, ptr, fs_info->qgroup_flags); in btrfs_quota_enable()
1065 qgroup = add_qgroup_rb(fs_info, found_key.offset); in btrfs_quota_enable()
1071 ret = btrfs_sysfs_add_one_qgroup(fs_info, qgroup); in btrfs_quota_enable()
1108 qgroup = add_qgroup_rb(fs_info, BTRFS_FS_TREE_OBJECTID); in btrfs_quota_enable()
1114 ret = btrfs_sysfs_add_one_qgroup(fs_info, qgroup); in btrfs_quota_enable()
1130 spin_lock(&fs_info->qgroup_lock); in btrfs_quota_enable()
1131 fs_info->quota_root = quota_root; in btrfs_quota_enable()
1132 set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); in btrfs_quota_enable()
1133 spin_unlock(&fs_info->qgroup_lock); in btrfs_quota_enable()
1135 ret = qgroup_rescan_init(fs_info, 0, 1); in btrfs_quota_enable()
1137 qgroup_rescan_zero_tracking(fs_info); in btrfs_quota_enable()
1138 fs_info->qgroup_rescan_running = true; in btrfs_quota_enable()
1139 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_quota_enable()
1140 &fs_info->qgroup_rescan_work); in btrfs_quota_enable()
1150 ulist_free(fs_info->qgroup_ulist); in btrfs_quota_enable()
1151 fs_info->qgroup_ulist = NULL; in btrfs_quota_enable()
1152 btrfs_sysfs_del_qgroups(fs_info); in btrfs_quota_enable()
1154 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
1163 int btrfs_quota_disable(struct btrfs_fs_info *fs_info) in btrfs_quota_disable() argument
1169 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
1170 if (!fs_info->quota_root) in btrfs_quota_disable()
1172 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
1183 trans = btrfs_start_transaction(fs_info->tree_root, 1); in btrfs_quota_disable()
1185 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
1192 if (!fs_info->quota_root) in btrfs_quota_disable()
1195 clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); in btrfs_quota_disable()
1196 btrfs_qgroup_wait_for_completion(fs_info, false); in btrfs_quota_disable()
1197 spin_lock(&fs_info->qgroup_lock); in btrfs_quota_disable()
1198 quota_root = fs_info->quota_root; in btrfs_quota_disable()
1199 fs_info->quota_root = NULL; in btrfs_quota_disable()
1200 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_quota_disable()
1201 spin_unlock(&fs_info->qgroup_lock); in btrfs_quota_disable()
1203 btrfs_free_qgroup_config(fs_info); in btrfs_quota_disable()
1228 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
1237 static void qgroup_dirty(struct btrfs_fs_info *fs_info, in qgroup_dirty() argument
1241 list_add(&qgroup->dirty, &fs_info->dirty_qgroups); in qgroup_dirty()
1258 static int __qgroup_excl_accounting(struct btrfs_fs_info *fs_info, in __qgroup_excl_accounting() argument
1269 qgroup = find_qgroup_rb(fs_info, ref_root); in __qgroup_excl_accounting()
1281 qgroup_rsv_add_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1283 qgroup_rsv_release_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1285 qgroup_dirty(fs_info, qgroup); in __qgroup_excl_accounting()
1304 qgroup_rsv_add_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1306 qgroup_rsv_release_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1308 qgroup_dirty(fs_info, qgroup); in __qgroup_excl_accounting()
1335 static int quick_update_accounting(struct btrfs_fs_info *fs_info, in quick_update_accounting() argument
1343 qgroup = find_qgroup_rb(fs_info, src); in quick_update_accounting()
1348 err = __qgroup_excl_accounting(fs_info, tmp, dst, in quick_update_accounting()
1357 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in quick_update_accounting()
1364 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_add_qgroup_relation() local
1383 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_add_qgroup_relation()
1384 if (!fs_info->quota_root) { in btrfs_add_qgroup_relation()
1388 member = find_qgroup_rb(fs_info, src); in btrfs_add_qgroup_relation()
1389 parent = find_qgroup_rb(fs_info, dst); in btrfs_add_qgroup_relation()
1413 spin_lock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1414 ret = add_relation_rb(fs_info, src, dst); in btrfs_add_qgroup_relation()
1416 spin_unlock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1419 ret = quick_update_accounting(fs_info, tmp, src, dst, 1); in btrfs_add_qgroup_relation()
1420 spin_unlock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1422 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_add_qgroup_relation()
1430 struct btrfs_fs_info *fs_info = trans->fs_info; in __del_qgroup_relation() local
1447 if (!fs_info->quota_root) { in __del_qgroup_relation()
1452 member = find_qgroup_rb(fs_info, src); in __del_qgroup_relation()
1453 parent = find_qgroup_rb(fs_info, dst); in __del_qgroup_relation()
1482 spin_lock(&fs_info->qgroup_lock); in __del_qgroup_relation()
1483 del_relation_rb(fs_info, src, dst); in __del_qgroup_relation()
1484 ret = quick_update_accounting(fs_info, tmp, src, dst, -1); in __del_qgroup_relation()
1485 spin_unlock(&fs_info->qgroup_lock); in __del_qgroup_relation()
1495 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_del_qgroup_relation() local
1498 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_del_qgroup_relation()
1500 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_del_qgroup_relation()
1507 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_create_qgroup() local
1512 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_create_qgroup()
1513 if (!fs_info->quota_root) { in btrfs_create_qgroup()
1517 quota_root = fs_info->quota_root; in btrfs_create_qgroup()
1518 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_create_qgroup()
1528 spin_lock(&fs_info->qgroup_lock); in btrfs_create_qgroup()
1529 qgroup = add_qgroup_rb(fs_info, qgroupid); in btrfs_create_qgroup()
1530 spin_unlock(&fs_info->qgroup_lock); in btrfs_create_qgroup()
1536 ret = btrfs_sysfs_add_one_qgroup(fs_info, qgroup); in btrfs_create_qgroup()
1538 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_create_qgroup()
1544 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_remove_qgroup() local
1549 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_remove_qgroup()
1550 if (!fs_info->quota_root) { in btrfs_remove_qgroup()
1555 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_remove_qgroup()
1580 spin_lock(&fs_info->qgroup_lock); in btrfs_remove_qgroup()
1581 del_qgroup_rb(fs_info, qgroupid); in btrfs_remove_qgroup()
1582 spin_unlock(&fs_info->qgroup_lock); in btrfs_remove_qgroup()
1589 btrfs_sysfs_del_one_qgroup(fs_info, qgroup); in btrfs_remove_qgroup()
1592 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_remove_qgroup()
1599 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_limit_qgroup() local
1608 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_limit_qgroup()
1609 if (!fs_info->quota_root) { in btrfs_limit_qgroup()
1614 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_limit_qgroup()
1620 spin_lock(&fs_info->qgroup_lock); in btrfs_limit_qgroup()
1659 spin_unlock(&fs_info->qgroup_lock); in btrfs_limit_qgroup()
1663 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_limit_qgroup()
1664 btrfs_info(fs_info, "unable to update quota limit for %llu", in btrfs_limit_qgroup()
1669 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_limit_qgroup()
1673 int btrfs_qgroup_trace_extent_nolock(struct btrfs_fs_info *fs_info, in btrfs_qgroup_trace_extent_nolock() argument
1683 trace_btrfs_qgroup_trace_extent(fs_info, record); in btrfs_qgroup_trace_extent_nolock()
1736 ret = btrfs_find_all_roots(NULL, trans->fs_info, bytenr, 0, &old_root, in btrfs_qgroup_trace_extent_post()
1739 trans->fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_trace_extent_post()
1740 btrfs_warn(trans->fs_info, in btrfs_qgroup_trace_extent_post()
1760 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_trace_extent() local
1765 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) in btrfs_qgroup_trace_extent()
1778 ret = btrfs_qgroup_trace_extent_nolock(fs_info, delayed_refs, record); in btrfs_qgroup_trace_extent()
1790 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_trace_leaf_items() local
1798 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_trace_leaf_items()
1944 struct btrfs_fs_info *fs_info = trans->fs_info; in qgroup_trace_extent_swap() local
1945 u32 nodesize = fs_info->nodesize; in qgroup_trace_extent_swap()
2069 struct btrfs_fs_info *fs_info = trans->fs_info; in qgroup_trace_new_subtree_blocks() local
2079 btrfs_err_rl(fs_info, in qgroup_trace_new_subtree_blocks()
2095 btrfs_err_rl(fs_info, in qgroup_trace_new_subtree_blocks()
2171 struct btrfs_fs_info *fs_info = trans->fs_info; in qgroup_trace_subtree_swap() local
2176 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in qgroup_trace_subtree_swap()
2181 btrfs_err_rl(fs_info, in qgroup_trace_subtree_swap()
2215 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in qgroup_trace_subtree_swap()
2223 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_trace_subtree() local
2232 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_trace_subtree()
2291 fs_info->nodesize, in btrfs_qgroup_trace_subtree()
2327 static int qgroup_update_refcnt(struct btrfs_fs_info *fs_info, in qgroup_update_refcnt() argument
2342 qg = find_qgroup_rb(fs_info, unode->val); in qgroup_update_refcnt()
2416 static int qgroup_update_counters(struct btrfs_fs_info *fs_info, in qgroup_update_counters() argument
2435 trace_qgroup_update_counters(fs_info, qg, cur_old_count, in qgroup_update_counters()
2500 qgroup_dirty(fs_info, qg); in qgroup_update_counters()
2538 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_account_extent() local
2550 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_account_extent()
2568 BUG_ON(!fs_info->quota_root); in btrfs_qgroup_account_extent()
2570 trace_btrfs_qgroup_account_extent(fs_info, trans->transid, bytenr, in btrfs_qgroup_account_extent()
2584 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account_extent()
2585 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) { in btrfs_qgroup_account_extent()
2586 if (fs_info->qgroup_rescan_progress.objectid <= bytenr) { in btrfs_qgroup_account_extent()
2587 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account_extent()
2592 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account_extent()
2594 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_account_extent()
2595 seq = fs_info->qgroup_seq; in btrfs_qgroup_account_extent()
2598 ret = qgroup_update_refcnt(fs_info, old_roots, tmp, qgroups, seq, in btrfs_qgroup_account_extent()
2604 ret = qgroup_update_refcnt(fs_info, new_roots, tmp, qgroups, seq, in btrfs_qgroup_account_extent()
2609 qgroup_update_counters(fs_info, qgroups, nr_old_roots, nr_new_roots, in btrfs_qgroup_account_extent()
2615 fs_info->qgroup_seq += max(nr_old_roots, nr_new_roots) + 1; in btrfs_qgroup_account_extent()
2617 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_account_extent()
2628 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_account_extents() local
2644 trace_btrfs_qgroup_account_extents(fs_info, record); in btrfs_qgroup_account_extents()
2653 ret = btrfs_find_all_roots(NULL, fs_info, in btrfs_qgroup_account_extents()
2661 btrfs_qgroup_free_refroot(fs_info, in btrfs_qgroup_account_extents()
2670 ret = btrfs_find_all_roots(trans, fs_info, in btrfs_qgroup_account_extents()
2694 trace_qgroup_num_dirty_extents(fs_info, trans->transid, in btrfs_qgroup_account_extents()
2704 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_run_qgroups() local
2707 if (!fs_info->quota_root) in btrfs_run_qgroups()
2710 spin_lock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2711 while (!list_empty(&fs_info->dirty_qgroups)) { in btrfs_run_qgroups()
2713 qgroup = list_first_entry(&fs_info->dirty_qgroups, in btrfs_run_qgroups()
2716 spin_unlock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2719 fs_info->qgroup_flags |= in btrfs_run_qgroups()
2723 fs_info->qgroup_flags |= in btrfs_run_qgroups()
2725 spin_lock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2727 if (test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_run_qgroups()
2728 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_run_qgroups()
2730 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_run_qgroups()
2731 spin_unlock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2735 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_run_qgroups()
2753 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_inherit() local
2773 spin_lock(&fs_info->trans_lock); in btrfs_qgroup_inherit()
2776 spin_unlock(&fs_info->trans_lock); in btrfs_qgroup_inherit()
2779 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_qgroup_inherit()
2780 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_inherit()
2783 quota_root = fs_info->quota_root; in btrfs_qgroup_inherit()
2794 srcgroup = find_qgroup_rb(fs_info, *i_qgroups); in btrfs_qgroup_inherit()
2836 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_inherit()
2838 dstgroup = add_qgroup_rb(fs_info, objectid); in btrfs_qgroup_inherit()
2853 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_inherit()
2854 btrfs_info(fs_info, in btrfs_qgroup_inherit()
2862 srcgroup = find_qgroup_rb(fs_info, srcid); in btrfs_qgroup_inherit()
2871 level_size = fs_info->nodesize; in btrfs_qgroup_inherit()
2886 qgroup_dirty(fs_info, dstgroup); in btrfs_qgroup_inherit()
2887 qgroup_dirty(fs_info, srcgroup); in btrfs_qgroup_inherit()
2896 ret = add_relation_rb(fs_info, objectid, *i_qgroups); in btrfs_qgroup_inherit()
2917 src = find_qgroup_rb(fs_info, i_qgroups[0]); in btrfs_qgroup_inherit()
2918 dst = find_qgroup_rb(fs_info, i_qgroups[1]); in btrfs_qgroup_inherit()
2938 src = find_qgroup_rb(fs_info, i_qgroups[0]); in btrfs_qgroup_inherit()
2939 dst = find_qgroup_rb(fs_info, i_qgroups[1]); in btrfs_qgroup_inherit()
2952 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_inherit()
2954 ret = btrfs_sysfs_add_one_qgroup(fs_info, dstgroup); in btrfs_qgroup_inherit()
2957 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_qgroup_inherit()
2959 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_inherit()
2980 struct btrfs_fs_info *fs_info = root->fs_info; in qgroup_reserve() local
2992 if (test_bit(BTRFS_FS_QUOTA_OVERRIDE, &fs_info->flags) && in qgroup_reserve()
2996 spin_lock(&fs_info->qgroup_lock); in qgroup_reserve()
2997 if (!fs_info->quota_root) in qgroup_reserve()
3000 qgroup = find_qgroup_rb(fs_info, ref_root); in qgroup_reserve()
3008 ulist_reinit(fs_info->qgroup_ulist); in qgroup_reserve()
3009 ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid, in qgroup_reserve()
3014 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in qgroup_reserve()
3026 ret = ulist_add(fs_info->qgroup_ulist, in qgroup_reserve()
3038 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in qgroup_reserve()
3043 qgroup_rsv_add(fs_info, qg, num_bytes, type); in qgroup_reserve()
3047 spin_unlock(&fs_info->qgroup_lock); in qgroup_reserve()
3060 void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info, in btrfs_qgroup_free_refroot() argument
3079 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_free_refroot()
3081 if (!fs_info->quota_root) in btrfs_qgroup_free_refroot()
3084 qgroup = find_qgroup_rb(fs_info, ref_root); in btrfs_qgroup_free_refroot()
3095 ulist_reinit(fs_info->qgroup_ulist); in btrfs_qgroup_free_refroot()
3096 ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid, in btrfs_qgroup_free_refroot()
3101 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in btrfs_qgroup_free_refroot()
3107 qgroup_rsv_release(fs_info, qg, num_bytes, type); in btrfs_qgroup_free_refroot()
3110 ret = ulist_add(fs_info->qgroup_ulist, in btrfs_qgroup_free_refroot()
3119 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_free_refroot()
3144 struct btrfs_fs_info *fs_info = trans->fs_info; in qgroup_rescan_leaf() local
3153 mutex_lock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
3154 ret = btrfs_search_slot_for_read(fs_info->extent_root, in qgroup_rescan_leaf()
3155 &fs_info->qgroup_rescan_progress, in qgroup_rescan_leaf()
3158 btrfs_debug(fs_info, in qgroup_rescan_leaf()
3160 fs_info->qgroup_rescan_progress.objectid, in qgroup_rescan_leaf()
3161 fs_info->qgroup_rescan_progress.type, in qgroup_rescan_leaf()
3162 fs_info->qgroup_rescan_progress.offset, ret); in qgroup_rescan_leaf()
3173 fs_info->qgroup_rescan_progress.objectid = (u64)-1; in qgroup_rescan_leaf()
3175 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
3182 fs_info->qgroup_rescan_progress.objectid = found.objectid + 1; in qgroup_rescan_leaf()
3187 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
3192 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
3200 num_bytes = fs_info->nodesize; in qgroup_rescan_leaf()
3204 ret = btrfs_find_all_roots(NULL, fs_info, found.objectid, 0, in qgroup_rescan_leaf()
3220 fs_info->qgroup_rescan_progress.objectid = (u64)-1; in qgroup_rescan_leaf()
3225 static bool rescan_should_stop(struct btrfs_fs_info *fs_info) in rescan_should_stop() argument
3227 return btrfs_fs_closing(fs_info) || in rescan_should_stop()
3228 test_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state); in rescan_should_stop()
3233 struct btrfs_fs_info *fs_info = container_of(work, struct btrfs_fs_info, in btrfs_qgroup_rescan_worker() local
3252 while (!err && !(stopped = rescan_should_stop(fs_info))) { in btrfs_qgroup_rescan_worker()
3253 trans = btrfs_start_transaction(fs_info->fs_root, 0); in btrfs_qgroup_rescan_worker()
3258 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) { in btrfs_qgroup_rescan_worker()
3272 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
3274 fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT) { in btrfs_qgroup_rescan_worker()
3275 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_rescan_worker()
3277 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_rescan_worker()
3279 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
3285 trans = btrfs_start_transaction(fs_info->quota_root, 1); in btrfs_qgroup_rescan_worker()
3289 btrfs_err(fs_info, in btrfs_qgroup_rescan_worker()
3294 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
3296 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan_worker()
3301 btrfs_err(fs_info, "fail to update qgroup status: %d", in btrfs_qgroup_rescan_worker()
3305 fs_info->qgroup_rescan_running = false; in btrfs_qgroup_rescan_worker()
3306 complete_all(&fs_info->qgroup_rescan_completion); in btrfs_qgroup_rescan_worker()
3307 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
3315 btrfs_info(fs_info, "qgroup scan paused"); in btrfs_qgroup_rescan_worker()
3317 btrfs_info(fs_info, "qgroup scan completed%s", in btrfs_qgroup_rescan_worker()
3320 btrfs_err(fs_info, "qgroup scan failed with %d", err); in btrfs_qgroup_rescan_worker()
3329 qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid, in qgroup_rescan_init() argument
3336 if (!(fs_info->qgroup_flags & in qgroup_rescan_init()
3338 btrfs_warn(fs_info, in qgroup_rescan_init()
3341 } else if (!(fs_info->qgroup_flags & in qgroup_rescan_init()
3343 btrfs_warn(fs_info, in qgroup_rescan_init()
3352 mutex_lock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
3355 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) { in qgroup_rescan_init()
3356 btrfs_warn(fs_info, in qgroup_rescan_init()
3359 } else if (!(fs_info->qgroup_flags & in qgroup_rescan_init()
3361 btrfs_warn(fs_info, in qgroup_rescan_init()
3367 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
3370 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_RESCAN; in qgroup_rescan_init()
3373 memset(&fs_info->qgroup_rescan_progress, 0, in qgroup_rescan_init()
3374 sizeof(fs_info->qgroup_rescan_progress)); in qgroup_rescan_init()
3375 fs_info->qgroup_rescan_progress.objectid = progress_objectid; in qgroup_rescan_init()
3376 init_completion(&fs_info->qgroup_rescan_completion); in qgroup_rescan_init()
3377 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
3379 btrfs_init_work(&fs_info->qgroup_rescan_work, in qgroup_rescan_init()
3385 qgroup_rescan_zero_tracking(struct btrfs_fs_info *fs_info) in qgroup_rescan_zero_tracking() argument
3390 spin_lock(&fs_info->qgroup_lock); in qgroup_rescan_zero_tracking()
3392 for (n = rb_first(&fs_info->qgroup_tree); n; n = rb_next(n)) { in qgroup_rescan_zero_tracking()
3398 qgroup_dirty(fs_info, qgroup); in qgroup_rescan_zero_tracking()
3400 spin_unlock(&fs_info->qgroup_lock); in qgroup_rescan_zero_tracking()
3404 btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info) in btrfs_qgroup_rescan() argument
3409 ret = qgroup_rescan_init(fs_info, 0, 1); in btrfs_qgroup_rescan()
3424 trans = btrfs_join_transaction(fs_info->fs_root); in btrfs_qgroup_rescan()
3426 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan()
3431 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan()
3435 qgroup_rescan_zero_tracking(fs_info); in btrfs_qgroup_rescan()
3437 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan()
3438 fs_info->qgroup_rescan_running = true; in btrfs_qgroup_rescan()
3439 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_qgroup_rescan()
3440 &fs_info->qgroup_rescan_work); in btrfs_qgroup_rescan()
3441 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan()
3446 int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info, in btrfs_qgroup_wait_for_completion() argument
3452 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_wait_for_completion()
3453 running = fs_info->qgroup_rescan_running; in btrfs_qgroup_wait_for_completion()
3454 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_wait_for_completion()
3461 &fs_info->qgroup_rescan_completion); in btrfs_qgroup_wait_for_completion()
3463 wait_for_completion(&fs_info->qgroup_rescan_completion); in btrfs_qgroup_wait_for_completion()
3473 btrfs_qgroup_rescan_resume(struct btrfs_fs_info *fs_info) in btrfs_qgroup_rescan_resume() argument
3475 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) { in btrfs_qgroup_rescan_resume()
3476 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_resume()
3477 fs_info->qgroup_rescan_running = true; in btrfs_qgroup_rescan_resume()
3478 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_qgroup_rescan_resume()
3479 &fs_info->qgroup_rescan_work); in btrfs_qgroup_rescan_resume()
3480 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_resume()
3615 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags) || in qgroup_reserve_data()
3696 len = round_up(start + len, root->fs_info->sectorsize); in qgroup_free_reserved_data()
3697 start = round_down(start, root->fs_info->sectorsize); in qgroup_free_reserved_data()
3731 btrfs_qgroup_free_refroot(root->fs_info, root->root_key.objectid, freed, in qgroup_free_reserved_data()
3747 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &inode->root->fs_info->flags)) in __btrfs_qgroup_release_data()
3765 btrfs_qgroup_free_refroot(inode->root->fs_info, in __btrfs_qgroup_release_data()
3855 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_reserve_meta() local
3858 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in btrfs_qgroup_reserve_meta()
3862 BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize)); in btrfs_qgroup_reserve_meta()
3896 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_free_meta_all_pertrans() local
3898 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in btrfs_qgroup_free_meta_all_pertrans()
3905 btrfs_qgroup_free_refroot(fs_info, root->root_key.objectid, (u64)-1, in btrfs_qgroup_free_meta_all_pertrans()
3912 struct btrfs_fs_info *fs_info = root->fs_info; in __btrfs_qgroup_free_meta() local
3914 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in __btrfs_qgroup_free_meta()
3924 BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize)); in __btrfs_qgroup_free_meta()
3926 btrfs_qgroup_free_refroot(fs_info, root->root_key.objectid, in __btrfs_qgroup_free_meta()
3930 static void qgroup_convert_meta(struct btrfs_fs_info *fs_info, u64 ref_root, in qgroup_convert_meta() argument
3940 if (!fs_info->quota_root) in qgroup_convert_meta()
3943 spin_lock(&fs_info->qgroup_lock); in qgroup_convert_meta()
3944 qgroup = find_qgroup_rb(fs_info, ref_root); in qgroup_convert_meta()
3947 ulist_reinit(fs_info->qgroup_ulist); in qgroup_convert_meta()
3948 ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid, in qgroup_convert_meta()
3953 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in qgroup_convert_meta()
3959 qgroup_rsv_release(fs_info, qg, num_bytes, in qgroup_convert_meta()
3961 qgroup_rsv_add(fs_info, qg, num_bytes, in qgroup_convert_meta()
3964 ret = ulist_add(fs_info->qgroup_ulist, in qgroup_convert_meta()
3972 spin_unlock(&fs_info->qgroup_lock); in qgroup_convert_meta()
3977 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_convert_reserved_meta() local
3979 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in btrfs_qgroup_convert_reserved_meta()
3986 qgroup_convert_meta(fs_info, root->root_key.objectid, num_bytes); in btrfs_qgroup_convert_reserved_meta()
4008 btrfs_warn(inode->root->fs_info, in btrfs_qgroup_check_reserved_leak()
4012 btrfs_qgroup_free_refroot(inode->root->fs_info, in btrfs_qgroup_check_reserved_leak()
4079 struct btrfs_fs_info *fs_info = subvol_root->fs_info; in btrfs_qgroup_add_swapped_blocks() local
4087 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_add_swapped_blocks()
4092 btrfs_err_rl(fs_info, in btrfs_qgroup_add_swapped_blocks()
4171 fs_info->qgroup_flags |= in btrfs_qgroup_add_swapped_blocks()
4186 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_trace_subtree_after_cow() local
4197 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_trace_subtree_after_cow()
4236 reloc_eb = read_tree_block(fs_info, block->reloc_bytenr, 0, in btrfs_qgroup_trace_subtree_after_cow()
4256 btrfs_err_rl(fs_info, in btrfs_qgroup_trace_subtree_after_cow()
4259 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_trace_subtree_after_cow()