Lines Matching refs:fs_info

69 static void qgroup_rsv_add(struct btrfs_fs_info *fs_info,  in qgroup_rsv_add()  argument
73 trace_qgroup_update_reserve(fs_info, qgroup, num_bytes, type); in qgroup_rsv_add()
77 static void qgroup_rsv_release(struct btrfs_fs_info *fs_info, in qgroup_rsv_release() argument
81 trace_qgroup_update_reserve(fs_info, qgroup, -(s64)num_bytes, type); in qgroup_rsv_release()
95 static void qgroup_rsv_add_by_qgroup(struct btrfs_fs_info *fs_info, in qgroup_rsv_add_by_qgroup() argument
102 qgroup_rsv_add(fs_info, dest, src->rsv.values[i], i); in qgroup_rsv_add_by_qgroup()
105 static void qgroup_rsv_release_by_qgroup(struct btrfs_fs_info *fs_info, in qgroup_rsv_release_by_qgroup() argument
112 qgroup_rsv_release(fs_info, dest, src->rsv.values[i], i); in qgroup_rsv_release_by_qgroup()
166 qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid,
168 static void qgroup_rescan_zero_tracking(struct btrfs_fs_info *fs_info);
171 static struct btrfs_qgroup *find_qgroup_rb(struct btrfs_fs_info *fs_info, in find_qgroup_rb() argument
174 struct rb_node *n = fs_info->qgroup_tree.rb_node; in find_qgroup_rb()
190 static struct btrfs_qgroup *add_qgroup_rb(struct btrfs_fs_info *fs_info, in add_qgroup_rb() argument
193 struct rb_node **p = &fs_info->qgroup_tree.rb_node; in add_qgroup_rb()
219 rb_insert_color(&qgroup->node, &fs_info->qgroup_tree); in add_qgroup_rb()
224 static void __del_qgroup_rb(struct btrfs_fs_info *fs_info, in __del_qgroup_rb() argument
248 static int del_qgroup_rb(struct btrfs_fs_info *fs_info, u64 qgroupid) in del_qgroup_rb() argument
250 struct btrfs_qgroup *qgroup = find_qgroup_rb(fs_info, qgroupid); in del_qgroup_rb()
255 rb_erase(&qgroup->node, &fs_info->qgroup_tree); in del_qgroup_rb()
256 __del_qgroup_rb(fs_info, qgroup); in del_qgroup_rb()
261 static int add_relation_rb(struct btrfs_fs_info *fs_info, in add_relation_rb() argument
268 member = find_qgroup_rb(fs_info, memberid); in add_relation_rb()
269 parent = find_qgroup_rb(fs_info, parentid); in add_relation_rb()
286 static int del_relation_rb(struct btrfs_fs_info *fs_info, in del_relation_rb() argument
293 member = find_qgroup_rb(fs_info, memberid); in del_relation_rb()
294 parent = find_qgroup_rb(fs_info, parentid); in del_relation_rb()
310 int btrfs_verify_qgroup_counts(struct btrfs_fs_info *fs_info, u64 qgroupid, in btrfs_verify_qgroup_counts() argument
315 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_verify_qgroup_counts()
328 int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info) in btrfs_read_qgroup_config() argument
332 struct btrfs_root *quota_root = fs_info->quota_root; in btrfs_read_qgroup_config()
340 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_read_qgroup_config()
343 fs_info->qgroup_ulist = ulist_alloc(GFP_KERNEL); in btrfs_read_qgroup_config()
344 if (!fs_info->qgroup_ulist) { in btrfs_read_qgroup_config()
355 ret = btrfs_sysfs_add_qgroups(fs_info); in btrfs_read_qgroup_config()
359 fs_info->qgroup_flags = 0; in btrfs_read_qgroup_config()
386 btrfs_err(fs_info, in btrfs_read_qgroup_config()
391 fs_info->generation) { in btrfs_read_qgroup_config()
393 btrfs_err(fs_info, in btrfs_read_qgroup_config()
396 fs_info->qgroup_flags = btrfs_qgroup_status_flags(l, in btrfs_read_qgroup_config()
406 qgroup = find_qgroup_rb(fs_info, found_key.offset); in btrfs_read_qgroup_config()
409 btrfs_err(fs_info, "inconsistent qgroup config"); in btrfs_read_qgroup_config()
413 qgroup = add_qgroup_rb(fs_info, found_key.offset); in btrfs_read_qgroup_config()
419 ret = btrfs_sysfs_add_one_qgroup(fs_info, qgroup); in btrfs_read_qgroup_config()
481 ret = add_relation_rb(fs_info, found_key.objectid, in btrfs_read_qgroup_config()
484 btrfs_warn(fs_info, in btrfs_read_qgroup_config()
500 fs_info->qgroup_flags |= flags; in btrfs_read_qgroup_config()
501 if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON)) in btrfs_read_qgroup_config()
502 clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); in btrfs_read_qgroup_config()
503 else if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN && in btrfs_read_qgroup_config()
505 ret = qgroup_rescan_init(fs_info, rescan_progress, 0); in btrfs_read_qgroup_config()
508 ulist_free(fs_info->qgroup_ulist); in btrfs_read_qgroup_config()
509 fs_info->qgroup_ulist = NULL; in btrfs_read_qgroup_config()
510 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_read_qgroup_config()
511 btrfs_sysfs_del_qgroups(fs_info); in btrfs_read_qgroup_config()
524 bool btrfs_check_quota_leak(struct btrfs_fs_info *fs_info) in btrfs_check_quota_leak() argument
529 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_check_quota_leak()
536 for (node = rb_first(&fs_info->qgroup_tree); node; node = rb_next(node)) { in btrfs_check_quota_leak()
544 btrfs_warn(fs_info, in btrfs_check_quota_leak()
561 void btrfs_free_qgroup_config(struct btrfs_fs_info *fs_info) in btrfs_free_qgroup_config() argument
566 while ((n = rb_first(&fs_info->qgroup_tree))) { in btrfs_free_qgroup_config()
568 rb_erase(n, &fs_info->qgroup_tree); in btrfs_free_qgroup_config()
569 __del_qgroup_rb(fs_info, qgroup); in btrfs_free_qgroup_config()
570 btrfs_sysfs_del_one_qgroup(fs_info, qgroup); in btrfs_free_qgroup_config()
578 ulist_free(fs_info->qgroup_ulist); in btrfs_free_qgroup_config()
579 fs_info->qgroup_ulist = NULL; in btrfs_free_qgroup_config()
580 btrfs_sysfs_del_qgroups(fs_info); in btrfs_free_qgroup_config()
587 struct btrfs_root *quota_root = trans->fs_info->quota_root; in add_qgroup_relation_item()
611 struct btrfs_root *quota_root = trans->fs_info->quota_root; in del_qgroup_relation_item()
648 if (btrfs_is_testing(quota_root->fs_info)) in add_qgroup_item()
709 struct btrfs_root *quota_root = trans->fs_info->quota_root; in del_qgroup_item()
755 struct btrfs_root *quota_root = trans->fs_info->quota_root; in update_qgroup_limit_item()
797 struct btrfs_fs_info *fs_info = trans->fs_info; in update_qgroup_info_item() local
798 struct btrfs_root *quota_root = fs_info->quota_root; in update_qgroup_info_item()
806 if (btrfs_is_testing(fs_info)) in update_qgroup_info_item()
842 struct btrfs_fs_info *fs_info = trans->fs_info; in update_qgroup_status_item() local
843 struct btrfs_root *quota_root = fs_info->quota_root; in update_qgroup_status_item()
869 btrfs_set_qgroup_status_flags(l, ptr, fs_info->qgroup_flags); in update_qgroup_status_item()
872 fs_info->qgroup_rescan_progress.objectid); in update_qgroup_status_item()
929 int btrfs_quota_enable(struct btrfs_fs_info *fs_info) in btrfs_quota_enable() argument
932 struct btrfs_root *tree_root = fs_info->tree_root; in btrfs_quota_enable()
950 lockdep_assert_held_write(&fs_info->subvol_sem); in btrfs_quota_enable()
952 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
953 if (fs_info->quota_root) in btrfs_quota_enable()
962 ret = btrfs_sysfs_add_qgroups(fs_info); in btrfs_quota_enable()
979 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
991 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
998 if (fs_info->quota_root) in btrfs_quota_enable()
1001 fs_info->qgroup_ulist = ulist; in btrfs_quota_enable()
1037 fs_info->qgroup_flags = BTRFS_QGROUP_STATUS_FLAG_ON | in btrfs_quota_enable()
1039 btrfs_set_qgroup_status_flags(leaf, ptr, fs_info->qgroup_flags); in btrfs_quota_enable()
1074 qgroup = add_qgroup_rb(fs_info, found_key.offset); in btrfs_quota_enable()
1080 ret = btrfs_sysfs_add_one_qgroup(fs_info, qgroup); in btrfs_quota_enable()
1117 qgroup = add_qgroup_rb(fs_info, BTRFS_FS_TREE_OBJECTID); in btrfs_quota_enable()
1123 ret = btrfs_sysfs_add_one_qgroup(fs_info, qgroup); in btrfs_quota_enable()
1129 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
1141 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
1150 spin_lock(&fs_info->qgroup_lock); in btrfs_quota_enable()
1151 fs_info->quota_root = quota_root; in btrfs_quota_enable()
1152 set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); in btrfs_quota_enable()
1153 spin_unlock(&fs_info->qgroup_lock); in btrfs_quota_enable()
1155 ret = qgroup_rescan_init(fs_info, 0, 1); in btrfs_quota_enable()
1157 qgroup_rescan_zero_tracking(fs_info); in btrfs_quota_enable()
1158 fs_info->qgroup_rescan_running = true; in btrfs_quota_enable()
1159 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_quota_enable()
1160 &fs_info->qgroup_rescan_work); in btrfs_quota_enable()
1185 ulist_free(fs_info->qgroup_ulist); in btrfs_quota_enable()
1186 fs_info->qgroup_ulist = NULL; in btrfs_quota_enable()
1187 btrfs_sysfs_del_qgroups(fs_info); in btrfs_quota_enable()
1189 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
1198 int btrfs_quota_disable(struct btrfs_fs_info *fs_info) in btrfs_quota_disable() argument
1209 lockdep_assert_held_write(&fs_info->subvol_sem); in btrfs_quota_disable()
1211 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
1212 if (!fs_info->quota_root) in btrfs_quota_disable()
1221 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
1228 clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); in btrfs_quota_disable()
1229 btrfs_qgroup_wait_for_completion(fs_info, false); in btrfs_quota_disable()
1240 trans = btrfs_start_transaction(fs_info->tree_root, 1); in btrfs_quota_disable()
1242 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
1246 set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); in btrfs_quota_disable()
1250 if (!fs_info->quota_root) in btrfs_quota_disable()
1253 spin_lock(&fs_info->qgroup_lock); in btrfs_quota_disable()
1254 quota_root = fs_info->quota_root; in btrfs_quota_disable()
1255 fs_info->quota_root = NULL; in btrfs_quota_disable()
1256 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_quota_disable()
1257 spin_unlock(&fs_info->qgroup_lock); in btrfs_quota_disable()
1259 btrfs_free_qgroup_config(fs_info); in btrfs_quota_disable()
1283 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
1292 static void qgroup_dirty(struct btrfs_fs_info *fs_info, in qgroup_dirty() argument
1296 list_add(&qgroup->dirty, &fs_info->dirty_qgroups); in qgroup_dirty()
1313 static int __qgroup_excl_accounting(struct btrfs_fs_info *fs_info, in __qgroup_excl_accounting() argument
1324 qgroup = find_qgroup_rb(fs_info, ref_root); in __qgroup_excl_accounting()
1336 qgroup_rsv_add_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1338 qgroup_rsv_release_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1340 qgroup_dirty(fs_info, qgroup); in __qgroup_excl_accounting()
1359 qgroup_rsv_add_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1361 qgroup_rsv_release_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1363 qgroup_dirty(fs_info, qgroup); in __qgroup_excl_accounting()
1390 static int quick_update_accounting(struct btrfs_fs_info *fs_info, in quick_update_accounting() argument
1398 qgroup = find_qgroup_rb(fs_info, src); in quick_update_accounting()
1403 err = __qgroup_excl_accounting(fs_info, tmp, dst, in quick_update_accounting()
1412 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in quick_update_accounting()
1419 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_add_qgroup_relation() local
1438 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_add_qgroup_relation()
1439 if (!fs_info->quota_root) { in btrfs_add_qgroup_relation()
1443 member = find_qgroup_rb(fs_info, src); in btrfs_add_qgroup_relation()
1444 parent = find_qgroup_rb(fs_info, dst); in btrfs_add_qgroup_relation()
1468 spin_lock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1469 ret = add_relation_rb(fs_info, src, dst); in btrfs_add_qgroup_relation()
1471 spin_unlock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1474 ret = quick_update_accounting(fs_info, tmp, src, dst, 1); in btrfs_add_qgroup_relation()
1475 spin_unlock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1477 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_add_qgroup_relation()
1485 struct btrfs_fs_info *fs_info = trans->fs_info; in __del_qgroup_relation() local
1502 if (!fs_info->quota_root) { in __del_qgroup_relation()
1507 member = find_qgroup_rb(fs_info, src); in __del_qgroup_relation()
1508 parent = find_qgroup_rb(fs_info, dst); in __del_qgroup_relation()
1537 spin_lock(&fs_info->qgroup_lock); in __del_qgroup_relation()
1538 del_relation_rb(fs_info, src, dst); in __del_qgroup_relation()
1539 ret = quick_update_accounting(fs_info, tmp, src, dst, -1); in __del_qgroup_relation()
1540 spin_unlock(&fs_info->qgroup_lock); in __del_qgroup_relation()
1550 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_del_qgroup_relation() local
1553 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_del_qgroup_relation()
1555 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_del_qgroup_relation()
1562 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_create_qgroup() local
1567 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_create_qgroup()
1568 if (!fs_info->quota_root) { in btrfs_create_qgroup()
1572 quota_root = fs_info->quota_root; in btrfs_create_qgroup()
1573 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_create_qgroup()
1583 spin_lock(&fs_info->qgroup_lock); in btrfs_create_qgroup()
1584 qgroup = add_qgroup_rb(fs_info, qgroupid); in btrfs_create_qgroup()
1585 spin_unlock(&fs_info->qgroup_lock); in btrfs_create_qgroup()
1591 ret = btrfs_sysfs_add_one_qgroup(fs_info, qgroup); in btrfs_create_qgroup()
1593 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_create_qgroup()
1599 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_remove_qgroup() local
1604 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_remove_qgroup()
1605 if (!fs_info->quota_root) { in btrfs_remove_qgroup()
1610 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_remove_qgroup()
1635 spin_lock(&fs_info->qgroup_lock); in btrfs_remove_qgroup()
1636 del_qgroup_rb(fs_info, qgroupid); in btrfs_remove_qgroup()
1637 spin_unlock(&fs_info->qgroup_lock); in btrfs_remove_qgroup()
1644 btrfs_sysfs_del_one_qgroup(fs_info, qgroup); in btrfs_remove_qgroup()
1647 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_remove_qgroup()
1654 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_limit_qgroup() local
1663 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_limit_qgroup()
1664 if (!fs_info->quota_root) { in btrfs_limit_qgroup()
1669 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_limit_qgroup()
1675 spin_lock(&fs_info->qgroup_lock); in btrfs_limit_qgroup()
1714 spin_unlock(&fs_info->qgroup_lock); in btrfs_limit_qgroup()
1718 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_limit_qgroup()
1719 btrfs_info(fs_info, "unable to update quota limit for %llu", in btrfs_limit_qgroup()
1724 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_limit_qgroup()
1728 int btrfs_qgroup_trace_extent_nolock(struct btrfs_fs_info *fs_info, in btrfs_qgroup_trace_extent_nolock() argument
1738 trace_btrfs_qgroup_trace_extent(fs_info, record); in btrfs_qgroup_trace_extent_nolock()
1763 int btrfs_qgroup_trace_extent_post(struct btrfs_fs_info *fs_info, in btrfs_qgroup_trace_extent_post() argument
1770 ret = btrfs_find_all_roots(NULL, fs_info, bytenr, 0, &old_root, false); in btrfs_qgroup_trace_extent_post()
1772 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_trace_extent_post()
1773 btrfs_warn(fs_info, in btrfs_qgroup_trace_extent_post()
1793 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_trace_extent() local
1798 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) in btrfs_qgroup_trace_extent()
1811 ret = btrfs_qgroup_trace_extent_nolock(fs_info, delayed_refs, record); in btrfs_qgroup_trace_extent()
1817 return btrfs_qgroup_trace_extent_post(fs_info, record); in btrfs_qgroup_trace_extent()
1823 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_trace_leaf_items() local
1831 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_trace_leaf_items()
1977 struct btrfs_fs_info *fs_info = trans->fs_info; in qgroup_trace_extent_swap() local
1978 u32 nodesize = fs_info->nodesize; in qgroup_trace_extent_swap()
2022 eb = read_tree_block(fs_info, child_bytenr, child_gen, in qgroup_trace_extent_swap()
2114 struct btrfs_fs_info *fs_info = trans->fs_info; in qgroup_trace_new_subtree_blocks() local
2124 btrfs_err_rl(fs_info, in qgroup_trace_new_subtree_blocks()
2142 btrfs_err_rl(fs_info, in qgroup_trace_new_subtree_blocks()
2162 eb = read_tree_block(fs_info, child_bytenr, child_gen, in qgroup_trace_new_subtree_blocks()
2226 struct btrfs_fs_info *fs_info = trans->fs_info; in qgroup_trace_subtree_swap() local
2231 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in qgroup_trace_subtree_swap()
2236 btrfs_err_rl(fs_info, in qgroup_trace_subtree_swap()
2270 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in qgroup_trace_subtree_swap()
2278 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_trace_subtree() local
2287 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_trace_subtree()
2337 eb = read_tree_block(fs_info, child_bytenr, child_gen, in btrfs_qgroup_trace_subtree()
2356 fs_info->nodesize, in btrfs_qgroup_trace_subtree()
2392 static int qgroup_update_refcnt(struct btrfs_fs_info *fs_info, in qgroup_update_refcnt() argument
2407 qg = find_qgroup_rb(fs_info, unode->val); in qgroup_update_refcnt()
2481 static int qgroup_update_counters(struct btrfs_fs_info *fs_info, in qgroup_update_counters() argument
2500 trace_qgroup_update_counters(fs_info, qg, cur_old_count, in qgroup_update_counters()
2565 qgroup_dirty(fs_info, qg); in qgroup_update_counters()
2603 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_account_extent() local
2615 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_account_extent()
2633 BUG_ON(!fs_info->quota_root); in btrfs_qgroup_account_extent()
2635 trace_btrfs_qgroup_account_extent(fs_info, trans->transid, bytenr, in btrfs_qgroup_account_extent()
2649 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account_extent()
2650 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) { in btrfs_qgroup_account_extent()
2651 if (fs_info->qgroup_rescan_progress.objectid <= bytenr) { in btrfs_qgroup_account_extent()
2652 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account_extent()
2657 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account_extent()
2659 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_account_extent()
2660 seq = fs_info->qgroup_seq; in btrfs_qgroup_account_extent()
2663 ret = qgroup_update_refcnt(fs_info, old_roots, tmp, qgroups, seq, in btrfs_qgroup_account_extent()
2669 ret = qgroup_update_refcnt(fs_info, new_roots, tmp, qgroups, seq, in btrfs_qgroup_account_extent()
2674 qgroup_update_counters(fs_info, qgroups, nr_old_roots, nr_new_roots, in btrfs_qgroup_account_extent()
2680 fs_info->qgroup_seq += max(nr_old_roots, nr_new_roots) + 1; in btrfs_qgroup_account_extent()
2682 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_account_extent()
2693 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_account_extents() local
2709 trace_btrfs_qgroup_account_extents(fs_info, record); in btrfs_qgroup_account_extents()
2718 ret = btrfs_find_all_roots(NULL, fs_info, in btrfs_qgroup_account_extents()
2726 btrfs_qgroup_free_refroot(fs_info, in btrfs_qgroup_account_extents()
2735 ret = btrfs_find_all_roots(trans, fs_info, in btrfs_qgroup_account_extents()
2759 trace_qgroup_num_dirty_extents(fs_info, trans->transid, in btrfs_qgroup_account_extents()
2769 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_run_qgroups() local
2772 if (!fs_info->quota_root) in btrfs_run_qgroups()
2775 spin_lock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2776 while (!list_empty(&fs_info->dirty_qgroups)) { in btrfs_run_qgroups()
2778 qgroup = list_first_entry(&fs_info->dirty_qgroups, in btrfs_run_qgroups()
2781 spin_unlock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2784 fs_info->qgroup_flags |= in btrfs_run_qgroups()
2788 fs_info->qgroup_flags |= in btrfs_run_qgroups()
2790 spin_lock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2792 if (test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_run_qgroups()
2793 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_run_qgroups()
2795 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_run_qgroups()
2796 spin_unlock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2800 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_run_qgroups()
2818 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_inherit() local
2838 spin_lock(&fs_info->trans_lock); in btrfs_qgroup_inherit()
2841 spin_unlock(&fs_info->trans_lock); in btrfs_qgroup_inherit()
2844 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_qgroup_inherit()
2845 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_inherit()
2848 quota_root = fs_info->quota_root; in btrfs_qgroup_inherit()
2859 srcgroup = find_qgroup_rb(fs_info, *i_qgroups); in btrfs_qgroup_inherit()
2901 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_inherit()
2903 dstgroup = add_qgroup_rb(fs_info, objectid); in btrfs_qgroup_inherit()
2916 qgroup_dirty(fs_info, dstgroup); in btrfs_qgroup_inherit()
2920 srcgroup = find_qgroup_rb(fs_info, srcid); in btrfs_qgroup_inherit()
2929 level_size = fs_info->nodesize; in btrfs_qgroup_inherit()
2944 qgroup_dirty(fs_info, dstgroup); in btrfs_qgroup_inherit()
2945 qgroup_dirty(fs_info, srcgroup); in btrfs_qgroup_inherit()
2954 ret = add_relation_rb(fs_info, objectid, *i_qgroups); in btrfs_qgroup_inherit()
2975 src = find_qgroup_rb(fs_info, i_qgroups[0]); in btrfs_qgroup_inherit()
2976 dst = find_qgroup_rb(fs_info, i_qgroups[1]); in btrfs_qgroup_inherit()
2996 src = find_qgroup_rb(fs_info, i_qgroups[0]); in btrfs_qgroup_inherit()
2997 dst = find_qgroup_rb(fs_info, i_qgroups[1]); in btrfs_qgroup_inherit()
3010 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_inherit()
3012 ret = btrfs_sysfs_add_one_qgroup(fs_info, dstgroup); in btrfs_qgroup_inherit()
3015 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_qgroup_inherit()
3017 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_inherit()
3038 struct btrfs_fs_info *fs_info = root->fs_info; in qgroup_reserve() local
3050 if (test_bit(BTRFS_FS_QUOTA_OVERRIDE, &fs_info->flags) && in qgroup_reserve()
3054 spin_lock(&fs_info->qgroup_lock); in qgroup_reserve()
3055 if (!fs_info->quota_root) in qgroup_reserve()
3058 qgroup = find_qgroup_rb(fs_info, ref_root); in qgroup_reserve()
3066 ulist_reinit(fs_info->qgroup_ulist); in qgroup_reserve()
3067 ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid, in qgroup_reserve()
3072 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in qgroup_reserve()
3084 ret = ulist_add(fs_info->qgroup_ulist, in qgroup_reserve()
3096 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in qgroup_reserve()
3101 qgroup_rsv_add(fs_info, qg, num_bytes, type); in qgroup_reserve()
3105 spin_unlock(&fs_info->qgroup_lock); in qgroup_reserve()
3118 void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info, in btrfs_qgroup_free_refroot() argument
3137 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_free_refroot()
3139 if (!fs_info->quota_root) in btrfs_qgroup_free_refroot()
3142 qgroup = find_qgroup_rb(fs_info, ref_root); in btrfs_qgroup_free_refroot()
3153 ulist_reinit(fs_info->qgroup_ulist); in btrfs_qgroup_free_refroot()
3154 ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid, in btrfs_qgroup_free_refroot()
3159 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in btrfs_qgroup_free_refroot()
3165 qgroup_rsv_release(fs_info, qg, num_bytes, type); in btrfs_qgroup_free_refroot()
3168 ret = ulist_add(fs_info->qgroup_ulist, in btrfs_qgroup_free_refroot()
3177 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_free_refroot()
3202 struct btrfs_fs_info *fs_info = trans->fs_info; in qgroup_rescan_leaf() local
3211 mutex_lock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
3212 ret = btrfs_search_slot_for_read(fs_info->extent_root, in qgroup_rescan_leaf()
3213 &fs_info->qgroup_rescan_progress, in qgroup_rescan_leaf()
3216 btrfs_debug(fs_info, in qgroup_rescan_leaf()
3218 fs_info->qgroup_rescan_progress.objectid, in qgroup_rescan_leaf()
3219 fs_info->qgroup_rescan_progress.type, in qgroup_rescan_leaf()
3220 fs_info->qgroup_rescan_progress.offset, ret); in qgroup_rescan_leaf()
3231 fs_info->qgroup_rescan_progress.objectid = (u64)-1; in qgroup_rescan_leaf()
3233 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
3240 fs_info->qgroup_rescan_progress.objectid = found.objectid + 1; in qgroup_rescan_leaf()
3245 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
3250 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
3258 num_bytes = fs_info->nodesize; in qgroup_rescan_leaf()
3262 ret = btrfs_find_all_roots(NULL, fs_info, found.objectid, 0, in qgroup_rescan_leaf()
3278 fs_info->qgroup_rescan_progress.objectid = (u64)-1; in qgroup_rescan_leaf()
3283 static bool rescan_should_stop(struct btrfs_fs_info *fs_info) in rescan_should_stop() argument
3285 return btrfs_fs_closing(fs_info) || in rescan_should_stop()
3286 test_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state) || in rescan_should_stop()
3287 !test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); in rescan_should_stop()
3292 struct btrfs_fs_info *fs_info = container_of(work, struct btrfs_fs_info, in btrfs_qgroup_rescan_worker() local
3311 while (!err && !(stopped = rescan_should_stop(fs_info))) { in btrfs_qgroup_rescan_worker()
3312 trans = btrfs_start_transaction(fs_info->fs_root, 0); in btrfs_qgroup_rescan_worker()
3329 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
3331 fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT) { in btrfs_qgroup_rescan_worker()
3332 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_rescan_worker()
3334 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_rescan_worker()
3336 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
3342 trans = btrfs_start_transaction(fs_info->quota_root, 1); in btrfs_qgroup_rescan_worker()
3346 btrfs_err(fs_info, in btrfs_qgroup_rescan_worker()
3351 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
3353 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan_worker()
3358 btrfs_err(fs_info, "fail to update qgroup status: %d", in btrfs_qgroup_rescan_worker()
3362 fs_info->qgroup_rescan_running = false; in btrfs_qgroup_rescan_worker()
3363 complete_all(&fs_info->qgroup_rescan_completion); in btrfs_qgroup_rescan_worker()
3364 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
3372 btrfs_info(fs_info, "qgroup scan paused"); in btrfs_qgroup_rescan_worker()
3374 btrfs_info(fs_info, "qgroup scan completed%s", in btrfs_qgroup_rescan_worker()
3377 btrfs_err(fs_info, "qgroup scan failed with %d", err); in btrfs_qgroup_rescan_worker()
3386 qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid, in qgroup_rescan_init() argument
3393 if (!(fs_info->qgroup_flags & in qgroup_rescan_init()
3395 btrfs_warn(fs_info, in qgroup_rescan_init()
3398 } else if (!(fs_info->qgroup_flags & in qgroup_rescan_init()
3400 btrfs_warn(fs_info, in qgroup_rescan_init()
3409 mutex_lock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
3412 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) { in qgroup_rescan_init()
3413 btrfs_warn(fs_info, in qgroup_rescan_init()
3416 } else if (!(fs_info->qgroup_flags & in qgroup_rescan_init()
3418 btrfs_warn(fs_info, in qgroup_rescan_init()
3421 } else if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) { in qgroup_rescan_init()
3427 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
3430 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_RESCAN; in qgroup_rescan_init()
3433 memset(&fs_info->qgroup_rescan_progress, 0, in qgroup_rescan_init()
3434 sizeof(fs_info->qgroup_rescan_progress)); in qgroup_rescan_init()
3435 fs_info->qgroup_rescan_progress.objectid = progress_objectid; in qgroup_rescan_init()
3436 init_completion(&fs_info->qgroup_rescan_completion); in qgroup_rescan_init()
3437 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
3439 btrfs_init_work(&fs_info->qgroup_rescan_work, in qgroup_rescan_init()
3445 qgroup_rescan_zero_tracking(struct btrfs_fs_info *fs_info) in qgroup_rescan_zero_tracking() argument
3450 spin_lock(&fs_info->qgroup_lock); in qgroup_rescan_zero_tracking()
3452 for (n = rb_first(&fs_info->qgroup_tree); n; n = rb_next(n)) { in qgroup_rescan_zero_tracking()
3458 qgroup_dirty(fs_info, qgroup); in qgroup_rescan_zero_tracking()
3460 spin_unlock(&fs_info->qgroup_lock); in qgroup_rescan_zero_tracking()
3464 btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info) in btrfs_qgroup_rescan() argument
3469 ret = qgroup_rescan_init(fs_info, 0, 1); in btrfs_qgroup_rescan()
3484 trans = btrfs_join_transaction(fs_info->fs_root); in btrfs_qgroup_rescan()
3486 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan()
3491 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan()
3495 qgroup_rescan_zero_tracking(fs_info); in btrfs_qgroup_rescan()
3497 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan()
3498 fs_info->qgroup_rescan_running = true; in btrfs_qgroup_rescan()
3499 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_qgroup_rescan()
3500 &fs_info->qgroup_rescan_work); in btrfs_qgroup_rescan()
3501 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan()
3506 int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info, in btrfs_qgroup_wait_for_completion() argument
3512 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_wait_for_completion()
3513 running = fs_info->qgroup_rescan_running; in btrfs_qgroup_wait_for_completion()
3514 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_wait_for_completion()
3521 &fs_info->qgroup_rescan_completion); in btrfs_qgroup_wait_for_completion()
3523 wait_for_completion(&fs_info->qgroup_rescan_completion); in btrfs_qgroup_wait_for_completion()
3533 btrfs_qgroup_rescan_resume(struct btrfs_fs_info *fs_info) in btrfs_qgroup_rescan_resume() argument
3535 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) { in btrfs_qgroup_rescan_resume()
3536 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_resume()
3537 fs_info->qgroup_rescan_running = true; in btrfs_qgroup_rescan_resume()
3538 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_qgroup_rescan_resume()
3539 &fs_info->qgroup_rescan_work); in btrfs_qgroup_rescan_resume()
3540 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_resume()
3698 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags) || in qgroup_reserve_data()
3780 len = round_up(start + len, root->fs_info->sectorsize); in qgroup_free_reserved_data()
3781 start = round_down(start, root->fs_info->sectorsize); in qgroup_free_reserved_data()
3815 btrfs_qgroup_free_refroot(root->fs_info, root->root_key.objectid, freed, in qgroup_free_reserved_data()
3831 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &inode->root->fs_info->flags)) in __btrfs_qgroup_release_data()
3849 btrfs_qgroup_free_refroot(inode->root->fs_info, in __btrfs_qgroup_release_data()
3939 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_reserve_meta() local
3942 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in btrfs_qgroup_reserve_meta()
3946 BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize)); in btrfs_qgroup_reserve_meta()
3980 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_free_meta_all_pertrans() local
3982 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in btrfs_qgroup_free_meta_all_pertrans()
3989 btrfs_qgroup_free_refroot(fs_info, root->root_key.objectid, (u64)-1, in btrfs_qgroup_free_meta_all_pertrans()
3996 struct btrfs_fs_info *fs_info = root->fs_info; in __btrfs_qgroup_free_meta() local
3998 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in __btrfs_qgroup_free_meta()
4008 BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize)); in __btrfs_qgroup_free_meta()
4010 btrfs_qgroup_free_refroot(fs_info, root->root_key.objectid, in __btrfs_qgroup_free_meta()
4014 static void qgroup_convert_meta(struct btrfs_fs_info *fs_info, u64 ref_root, in qgroup_convert_meta() argument
4024 if (!fs_info->quota_root) in qgroup_convert_meta()
4027 spin_lock(&fs_info->qgroup_lock); in qgroup_convert_meta()
4028 qgroup = find_qgroup_rb(fs_info, ref_root); in qgroup_convert_meta()
4031 ulist_reinit(fs_info->qgroup_ulist); in qgroup_convert_meta()
4032 ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid, in qgroup_convert_meta()
4037 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in qgroup_convert_meta()
4043 qgroup_rsv_release(fs_info, qg, num_bytes, in qgroup_convert_meta()
4045 qgroup_rsv_add(fs_info, qg, num_bytes, in qgroup_convert_meta()
4048 ret = ulist_add(fs_info->qgroup_ulist, in qgroup_convert_meta()
4056 spin_unlock(&fs_info->qgroup_lock); in qgroup_convert_meta()
4061 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_convert_reserved_meta() local
4063 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in btrfs_qgroup_convert_reserved_meta()
4070 qgroup_convert_meta(fs_info, root->root_key.objectid, num_bytes); in btrfs_qgroup_convert_reserved_meta()
4092 btrfs_warn(inode->root->fs_info, in btrfs_qgroup_check_reserved_leak()
4096 btrfs_qgroup_free_refroot(inode->root->fs_info, in btrfs_qgroup_check_reserved_leak()
4163 struct btrfs_fs_info *fs_info = subvol_root->fs_info; in btrfs_qgroup_add_swapped_blocks() local
4171 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_add_swapped_blocks()
4176 btrfs_err_rl(fs_info, in btrfs_qgroup_add_swapped_blocks()
4255 fs_info->qgroup_flags |= in btrfs_qgroup_add_swapped_blocks()
4270 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_trace_subtree_after_cow() local
4281 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_trace_subtree_after_cow()
4320 reloc_eb = read_tree_block(fs_info, block->reloc_bytenr, in btrfs_qgroup_trace_subtree_after_cow()
4340 btrfs_err_rl(fs_info, in btrfs_qgroup_trace_subtree_after_cow()
4343 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_trace_subtree_after_cow()