Lines Matching refs:fs_info

68 static void qgroup_rsv_add(struct btrfs_fs_info *fs_info,  in qgroup_rsv_add()  argument
72 trace_qgroup_update_reserve(fs_info, qgroup, num_bytes, type); in qgroup_rsv_add()
76 static void qgroup_rsv_release(struct btrfs_fs_info *fs_info, in qgroup_rsv_release() argument
80 trace_qgroup_update_reserve(fs_info, qgroup, -(s64)num_bytes, type); in qgroup_rsv_release()
94 static void qgroup_rsv_add_by_qgroup(struct btrfs_fs_info *fs_info, in qgroup_rsv_add_by_qgroup() argument
101 qgroup_rsv_add(fs_info, dest, src->rsv.values[i], i); in qgroup_rsv_add_by_qgroup()
104 static void qgroup_rsv_release_by_qgroup(struct btrfs_fs_info *fs_info, in qgroup_rsv_release_by_qgroup() argument
111 qgroup_rsv_release(fs_info, dest, src->rsv.values[i], i); in qgroup_rsv_release_by_qgroup()
165 qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid,
167 static void qgroup_rescan_zero_tracking(struct btrfs_fs_info *fs_info);
170 static struct btrfs_qgroup *find_qgroup_rb(struct btrfs_fs_info *fs_info, in find_qgroup_rb() argument
173 struct rb_node *n = fs_info->qgroup_tree.rb_node; in find_qgroup_rb()
189 static struct btrfs_qgroup *add_qgroup_rb(struct btrfs_fs_info *fs_info, in add_qgroup_rb() argument
192 struct rb_node **p = &fs_info->qgroup_tree.rb_node; in add_qgroup_rb()
218 rb_insert_color(&qgroup->node, &fs_info->qgroup_tree); in add_qgroup_rb()
247 static int del_qgroup_rb(struct btrfs_fs_info *fs_info, u64 qgroupid) in del_qgroup_rb() argument
249 struct btrfs_qgroup *qgroup = find_qgroup_rb(fs_info, qgroupid); in del_qgroup_rb()
254 rb_erase(&qgroup->node, &fs_info->qgroup_tree); in del_qgroup_rb()
260 static int add_relation_rb(struct btrfs_fs_info *fs_info, in add_relation_rb() argument
267 member = find_qgroup_rb(fs_info, memberid); in add_relation_rb()
268 parent = find_qgroup_rb(fs_info, parentid); in add_relation_rb()
285 static int del_relation_rb(struct btrfs_fs_info *fs_info, in del_relation_rb() argument
292 member = find_qgroup_rb(fs_info, memberid); in del_relation_rb()
293 parent = find_qgroup_rb(fs_info, parentid); in del_relation_rb()
309 int btrfs_verify_qgroup_counts(struct btrfs_fs_info *fs_info, u64 qgroupid, in btrfs_verify_qgroup_counts() argument
314 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_verify_qgroup_counts()
327 int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info) in btrfs_read_qgroup_config() argument
331 struct btrfs_root *quota_root = fs_info->quota_root; in btrfs_read_qgroup_config()
339 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_read_qgroup_config()
342 fs_info->qgroup_ulist = ulist_alloc(GFP_KERNEL); in btrfs_read_qgroup_config()
343 if (!fs_info->qgroup_ulist) { in btrfs_read_qgroup_config()
355 fs_info->qgroup_flags = 0; in btrfs_read_qgroup_config()
382 btrfs_err(fs_info, in btrfs_read_qgroup_config()
387 fs_info->generation) { in btrfs_read_qgroup_config()
389 btrfs_err(fs_info, in btrfs_read_qgroup_config()
392 fs_info->qgroup_flags = btrfs_qgroup_status_flags(l, in btrfs_read_qgroup_config()
402 qgroup = find_qgroup_rb(fs_info, found_key.offset); in btrfs_read_qgroup_config()
405 btrfs_err(fs_info, "inconsistent qgroup config"); in btrfs_read_qgroup_config()
409 qgroup = add_qgroup_rb(fs_info, found_key.offset); in btrfs_read_qgroup_config()
473 ret = add_relation_rb(fs_info, found_key.objectid, in btrfs_read_qgroup_config()
476 btrfs_warn(fs_info, in btrfs_read_qgroup_config()
491 fs_info->qgroup_flags |= flags; in btrfs_read_qgroup_config()
492 if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON)) in btrfs_read_qgroup_config()
493 clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); in btrfs_read_qgroup_config()
494 else if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN && in btrfs_read_qgroup_config()
496 ret = qgroup_rescan_init(fs_info, rescan_progress, 0); in btrfs_read_qgroup_config()
500 ulist_free(fs_info->qgroup_ulist); in btrfs_read_qgroup_config()
501 fs_info->qgroup_ulist = NULL; in btrfs_read_qgroup_config()
502 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_read_qgroup_config()
514 void btrfs_free_qgroup_config(struct btrfs_fs_info *fs_info) in btrfs_free_qgroup_config() argument
519 while ((n = rb_first(&fs_info->qgroup_tree))) { in btrfs_free_qgroup_config()
521 rb_erase(n, &fs_info->qgroup_tree); in btrfs_free_qgroup_config()
529 ulist_free(fs_info->qgroup_ulist); in btrfs_free_qgroup_config()
530 fs_info->qgroup_ulist = NULL; in btrfs_free_qgroup_config()
537 struct btrfs_root *quota_root = trans->fs_info->quota_root; in add_qgroup_relation_item()
561 struct btrfs_root *quota_root = trans->fs_info->quota_root; in del_qgroup_relation_item()
598 if (btrfs_is_testing(quota_root->fs_info)) in add_qgroup_item()
659 struct btrfs_root *quota_root = trans->fs_info->quota_root; in del_qgroup_item()
705 struct btrfs_root *quota_root = trans->fs_info->quota_root; in update_qgroup_limit_item()
747 struct btrfs_fs_info *fs_info = trans->fs_info; in update_qgroup_info_item() local
748 struct btrfs_root *quota_root = fs_info->quota_root; in update_qgroup_info_item()
756 if (btrfs_is_testing(fs_info)) in update_qgroup_info_item()
792 struct btrfs_fs_info *fs_info = trans->fs_info; in update_qgroup_status_item() local
793 struct btrfs_root *quota_root = fs_info->quota_root; in update_qgroup_status_item()
819 btrfs_set_qgroup_status_flags(l, ptr, fs_info->qgroup_flags); in update_qgroup_status_item()
822 fs_info->qgroup_rescan_progress.objectid); in update_qgroup_status_item()
879 int btrfs_quota_enable(struct btrfs_fs_info *fs_info) in btrfs_quota_enable() argument
882 struct btrfs_root *tree_root = fs_info->tree_root; in btrfs_quota_enable()
893 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
894 if (fs_info->quota_root) in btrfs_quota_enable()
912 fs_info->qgroup_ulist = ulist_alloc(GFP_KERNEL); in btrfs_quota_enable()
913 if (!fs_info->qgroup_ulist) { in btrfs_quota_enable()
922 quota_root = btrfs_create_tree(trans, fs_info, in btrfs_quota_enable()
953 fs_info->qgroup_flags = BTRFS_QGROUP_STATUS_FLAG_ON | in btrfs_quota_enable()
955 btrfs_set_qgroup_status_flags(leaf, ptr, fs_info->qgroup_flags); in btrfs_quota_enable()
986 qgroup = add_qgroup_rb(fs_info, found_key.offset); in btrfs_quota_enable()
1010 qgroup = add_qgroup_rb(fs_info, BTRFS_FS_TREE_OBJECTID); in btrfs_quota_enable()
1016 spin_lock(&fs_info->qgroup_lock); in btrfs_quota_enable()
1017 fs_info->quota_root = quota_root; in btrfs_quota_enable()
1018 set_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); in btrfs_quota_enable()
1019 spin_unlock(&fs_info->qgroup_lock); in btrfs_quota_enable()
1026 ret = qgroup_rescan_init(fs_info, 0, 1); in btrfs_quota_enable()
1028 qgroup_rescan_zero_tracking(fs_info); in btrfs_quota_enable()
1029 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_quota_enable()
1030 &fs_info->qgroup_rescan_work); in btrfs_quota_enable()
1043 ulist_free(fs_info->qgroup_ulist); in btrfs_quota_enable()
1044 fs_info->qgroup_ulist = NULL; in btrfs_quota_enable()
1048 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
1052 int btrfs_quota_disable(struct btrfs_fs_info *fs_info) in btrfs_quota_disable() argument
1058 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
1059 if (!fs_info->quota_root) in btrfs_quota_disable()
1068 trans = btrfs_start_transaction(fs_info->tree_root, 1); in btrfs_quota_disable()
1074 clear_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags); in btrfs_quota_disable()
1075 btrfs_qgroup_wait_for_completion(fs_info, false); in btrfs_quota_disable()
1076 spin_lock(&fs_info->qgroup_lock); in btrfs_quota_disable()
1077 quota_root = fs_info->quota_root; in btrfs_quota_disable()
1078 fs_info->quota_root = NULL; in btrfs_quota_disable()
1079 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_quota_disable()
1080 spin_unlock(&fs_info->qgroup_lock); in btrfs_quota_disable()
1082 btrfs_free_qgroup_config(fs_info); in btrfs_quota_disable()
1099 clean_tree_block(fs_info, quota_root->node); in btrfs_quota_disable()
1110 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
1114 static void qgroup_dirty(struct btrfs_fs_info *fs_info, in qgroup_dirty() argument
1118 list_add(&qgroup->dirty, &fs_info->dirty_qgroups); in qgroup_dirty()
1135 static int __qgroup_excl_accounting(struct btrfs_fs_info *fs_info, in __qgroup_excl_accounting() argument
1146 qgroup = find_qgroup_rb(fs_info, ref_root); in __qgroup_excl_accounting()
1158 qgroup_rsv_add_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1160 qgroup_rsv_release_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1162 qgroup_dirty(fs_info, qgroup); in __qgroup_excl_accounting()
1181 qgroup_rsv_add_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1183 qgroup_rsv_release_by_qgroup(fs_info, qgroup, src); in __qgroup_excl_accounting()
1185 qgroup_dirty(fs_info, qgroup); in __qgroup_excl_accounting()
1212 static int quick_update_accounting(struct btrfs_fs_info *fs_info, in quick_update_accounting() argument
1220 qgroup = find_qgroup_rb(fs_info, src); in quick_update_accounting()
1225 err = __qgroup_excl_accounting(fs_info, tmp, dst, in quick_update_accounting()
1234 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in quick_update_accounting()
1241 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_add_qgroup_relation() local
1257 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_add_qgroup_relation()
1258 quota_root = fs_info->quota_root; in btrfs_add_qgroup_relation()
1263 member = find_qgroup_rb(fs_info, src); in btrfs_add_qgroup_relation()
1264 parent = find_qgroup_rb(fs_info, dst); in btrfs_add_qgroup_relation()
1288 spin_lock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1289 ret = add_relation_rb(fs_info, src, dst); in btrfs_add_qgroup_relation()
1291 spin_unlock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1294 ret = quick_update_accounting(fs_info, tmp, src, dst, 1); in btrfs_add_qgroup_relation()
1295 spin_unlock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1297 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_add_qgroup_relation()
1305 struct btrfs_fs_info *fs_info = trans->fs_info; in __del_qgroup_relation() local
1318 quota_root = fs_info->quota_root; in __del_qgroup_relation()
1324 member = find_qgroup_rb(fs_info, src); in __del_qgroup_relation()
1325 parent = find_qgroup_rb(fs_info, dst); in __del_qgroup_relation()
1344 spin_lock(&fs_info->qgroup_lock); in __del_qgroup_relation()
1345 del_relation_rb(fs_info, src, dst); in __del_qgroup_relation()
1346 ret = quick_update_accounting(fs_info, tmp, src, dst, -1); in __del_qgroup_relation()
1347 spin_unlock(&fs_info->qgroup_lock); in __del_qgroup_relation()
1356 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_del_qgroup_relation() local
1359 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_del_qgroup_relation()
1361 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_del_qgroup_relation()
1368 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_create_qgroup() local
1373 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_create_qgroup()
1374 quota_root = fs_info->quota_root; in btrfs_create_qgroup()
1379 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_create_qgroup()
1389 spin_lock(&fs_info->qgroup_lock); in btrfs_create_qgroup()
1390 qgroup = add_qgroup_rb(fs_info, qgroupid); in btrfs_create_qgroup()
1391 spin_unlock(&fs_info->qgroup_lock); in btrfs_create_qgroup()
1396 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_create_qgroup()
1402 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_remove_qgroup() local
1408 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_remove_qgroup()
1409 quota_root = fs_info->quota_root; in btrfs_remove_qgroup()
1415 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_remove_qgroup()
1439 spin_lock(&fs_info->qgroup_lock); in btrfs_remove_qgroup()
1440 del_qgroup_rb(fs_info, qgroupid); in btrfs_remove_qgroup()
1441 spin_unlock(&fs_info->qgroup_lock); in btrfs_remove_qgroup()
1443 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_remove_qgroup()
1450 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_limit_qgroup() local
1460 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_limit_qgroup()
1461 quota_root = fs_info->quota_root; in btrfs_limit_qgroup()
1467 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_limit_qgroup()
1473 spin_lock(&fs_info->qgroup_lock); in btrfs_limit_qgroup()
1512 spin_unlock(&fs_info->qgroup_lock); in btrfs_limit_qgroup()
1516 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_limit_qgroup()
1517 btrfs_info(fs_info, "unable to update quota limit for %llu", in btrfs_limit_qgroup()
1522 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_limit_qgroup()
1526 int btrfs_qgroup_trace_extent_nolock(struct btrfs_fs_info *fs_info, in btrfs_qgroup_trace_extent_nolock() argument
1536 trace_btrfs_qgroup_trace_extent(fs_info, record); in btrfs_qgroup_trace_extent_nolock()
1555 int btrfs_qgroup_trace_extent_post(struct btrfs_fs_info *fs_info, in btrfs_qgroup_trace_extent_post() argument
1562 ret = btrfs_find_all_roots(NULL, fs_info, bytenr, 0, &old_root, false); in btrfs_qgroup_trace_extent_post()
1564 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_trace_extent_post()
1565 btrfs_warn(fs_info, in btrfs_qgroup_trace_extent_post()
1585 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_trace_extent() local
1590 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) in btrfs_qgroup_trace_extent()
1603 ret = btrfs_qgroup_trace_extent_nolock(fs_info, delayed_refs, record); in btrfs_qgroup_trace_extent()
1609 return btrfs_qgroup_trace_extent_post(fs_info, record); in btrfs_qgroup_trace_extent()
1615 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_trace_leaf_items() local
1623 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_trace_leaf_items()
1719 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_trace_subtree() local
1728 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_trace_subtree()
1778 eb = read_tree_block(fs_info, child_bytenr, child_gen, in btrfs_qgroup_trace_subtree()
1797 fs_info->nodesize, in btrfs_qgroup_trace_subtree()
1833 static int qgroup_update_refcnt(struct btrfs_fs_info *fs_info, in qgroup_update_refcnt() argument
1848 qg = find_qgroup_rb(fs_info, unode->val); in qgroup_update_refcnt()
1922 static int qgroup_update_counters(struct btrfs_fs_info *fs_info, in qgroup_update_counters() argument
1941 trace_qgroup_update_counters(fs_info, qg, cur_old_count, in qgroup_update_counters()
2006 qgroup_dirty(fs_info, qg); in qgroup_update_counters()
2044 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_account_extent() local
2052 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_account_extent()
2070 BUG_ON(!fs_info->quota_root); in btrfs_qgroup_account_extent()
2072 trace_btrfs_qgroup_account_extent(fs_info, trans->transid, bytenr, in btrfs_qgroup_account_extent()
2086 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account_extent()
2087 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) { in btrfs_qgroup_account_extent()
2088 if (fs_info->qgroup_rescan_progress.objectid <= bytenr) { in btrfs_qgroup_account_extent()
2089 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account_extent()
2094 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account_extent()
2096 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_account_extent()
2097 seq = fs_info->qgroup_seq; in btrfs_qgroup_account_extent()
2100 ret = qgroup_update_refcnt(fs_info, old_roots, tmp, qgroups, seq, in btrfs_qgroup_account_extent()
2106 ret = qgroup_update_refcnt(fs_info, new_roots, tmp, qgroups, seq, in btrfs_qgroup_account_extent()
2111 qgroup_update_counters(fs_info, qgroups, nr_old_roots, nr_new_roots, in btrfs_qgroup_account_extent()
2117 fs_info->qgroup_seq += max(nr_old_roots, nr_new_roots) + 1; in btrfs_qgroup_account_extent()
2119 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_account_extent()
2130 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_account_extents() local
2144 trace_btrfs_qgroup_account_extents(fs_info, record); in btrfs_qgroup_account_extents()
2153 ret = btrfs_find_all_roots(NULL, fs_info, in btrfs_qgroup_account_extents()
2165 ret = btrfs_find_all_roots(trans, fs_info, in btrfs_qgroup_account_extents()
2197 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_run_qgroups() local
2198 struct btrfs_root *quota_root = fs_info->quota_root; in btrfs_run_qgroups()
2204 spin_lock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2205 while (!list_empty(&fs_info->dirty_qgroups)) { in btrfs_run_qgroups()
2207 qgroup = list_first_entry(&fs_info->dirty_qgroups, in btrfs_run_qgroups()
2210 spin_unlock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2213 fs_info->qgroup_flags |= in btrfs_run_qgroups()
2217 fs_info->qgroup_flags |= in btrfs_run_qgroups()
2219 spin_lock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2221 if (test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_run_qgroups()
2222 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_run_qgroups()
2224 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_run_qgroups()
2225 spin_unlock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2229 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_run_qgroups()
2246 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_qgroup_inherit() local
2247 struct btrfs_root *quota_root = fs_info->quota_root; in btrfs_qgroup_inherit()
2253 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_qgroup_inherit()
2254 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) in btrfs_qgroup_inherit()
2267 srcgroup = find_qgroup_rb(fs_info, *i_qgroups); in btrfs_qgroup_inherit()
2309 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_inherit()
2311 dstgroup = add_qgroup_rb(fs_info, objectid); in btrfs_qgroup_inherit()
2326 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_inherit()
2327 btrfs_info(fs_info, in btrfs_qgroup_inherit()
2335 srcgroup = find_qgroup_rb(fs_info, srcid); in btrfs_qgroup_inherit()
2344 level_size = fs_info->nodesize; in btrfs_qgroup_inherit()
2359 qgroup_dirty(fs_info, dstgroup); in btrfs_qgroup_inherit()
2360 qgroup_dirty(fs_info, srcgroup); in btrfs_qgroup_inherit()
2369 ret = add_relation_rb(fs_info, objectid, *i_qgroups); in btrfs_qgroup_inherit()
2383 src = find_qgroup_rb(fs_info, i_qgroups[0]); in btrfs_qgroup_inherit()
2384 dst = find_qgroup_rb(fs_info, i_qgroups[1]); in btrfs_qgroup_inherit()
2401 src = find_qgroup_rb(fs_info, i_qgroups[0]); in btrfs_qgroup_inherit()
2402 dst = find_qgroup_rb(fs_info, i_qgroups[1]); in btrfs_qgroup_inherit()
2414 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_inherit()
2416 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_qgroup_inherit()
2429 static bool qgroup_check_limits(struct btrfs_fs_info *fs_info, in qgroup_check_limits() argument
2465 btrfs_commit_transaction_locksafe(fs_info); in qgroup_check_limits()
2476 struct btrfs_fs_info *fs_info = root->fs_info; in qgroup_reserve() local
2488 if (test_bit(BTRFS_FS_QUOTA_OVERRIDE, &fs_info->flags) && in qgroup_reserve()
2492 spin_lock(&fs_info->qgroup_lock); in qgroup_reserve()
2493 quota_root = fs_info->quota_root; in qgroup_reserve()
2497 qgroup = find_qgroup_rb(fs_info, ref_root); in qgroup_reserve()
2505 ulist_reinit(fs_info->qgroup_ulist); in qgroup_reserve()
2506 ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid, in qgroup_reserve()
2511 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in qgroup_reserve()
2517 if (enforce && !qgroup_check_limits(fs_info, qg, num_bytes)) { in qgroup_reserve()
2523 ret = ulist_add(fs_info->qgroup_ulist, in qgroup_reserve()
2535 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in qgroup_reserve()
2540 trace_qgroup_update_reserve(fs_info, qg, num_bytes, type); in qgroup_reserve()
2541 qgroup_rsv_add(fs_info, qg, num_bytes, type); in qgroup_reserve()
2545 spin_unlock(&fs_info->qgroup_lock); in qgroup_reserve()
2558 void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info, in btrfs_qgroup_free_refroot() argument
2578 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_free_refroot()
2580 quota_root = fs_info->quota_root; in btrfs_qgroup_free_refroot()
2584 qgroup = find_qgroup_rb(fs_info, ref_root); in btrfs_qgroup_free_refroot()
2595 ulist_reinit(fs_info->qgroup_ulist); in btrfs_qgroup_free_refroot()
2596 ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid, in btrfs_qgroup_free_refroot()
2601 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in btrfs_qgroup_free_refroot()
2607 trace_qgroup_update_reserve(fs_info, qg, -(s64)num_bytes, type); in btrfs_qgroup_free_refroot()
2608 qgroup_rsv_release(fs_info, qg, num_bytes, type); in btrfs_qgroup_free_refroot()
2611 ret = ulist_add(fs_info->qgroup_ulist, in btrfs_qgroup_free_refroot()
2620 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_free_refroot()
2645 struct btrfs_fs_info *fs_info = trans->fs_info; in qgroup_rescan_leaf() local
2654 mutex_lock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
2655 ret = btrfs_search_slot_for_read(fs_info->extent_root, in qgroup_rescan_leaf()
2656 &fs_info->qgroup_rescan_progress, in qgroup_rescan_leaf()
2659 btrfs_debug(fs_info, in qgroup_rescan_leaf()
2661 fs_info->qgroup_rescan_progress.objectid, in qgroup_rescan_leaf()
2662 fs_info->qgroup_rescan_progress.type, in qgroup_rescan_leaf()
2663 fs_info->qgroup_rescan_progress.offset, ret); in qgroup_rescan_leaf()
2674 fs_info->qgroup_rescan_progress.objectid = (u64)-1; in qgroup_rescan_leaf()
2676 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
2683 fs_info->qgroup_rescan_progress.objectid = found.objectid + 1; in qgroup_rescan_leaf()
2688 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
2696 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
2704 num_bytes = fs_info->nodesize; in qgroup_rescan_leaf()
2708 ret = btrfs_find_all_roots(NULL, fs_info, found.objectid, 0, in qgroup_rescan_leaf()
2726 fs_info->qgroup_rescan_progress.objectid = (u64)-1; in qgroup_rescan_leaf()
2733 struct btrfs_fs_info *fs_info = container_of(work, struct btrfs_fs_info, in btrfs_qgroup_rescan_worker() local
2751 while (!err && !btrfs_fs_closing(fs_info)) { in btrfs_qgroup_rescan_worker()
2752 trans = btrfs_start_transaction(fs_info->fs_root, 0); in btrfs_qgroup_rescan_worker()
2757 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) { in btrfs_qgroup_rescan_worker()
2771 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
2772 if (!btrfs_fs_closing(fs_info)) in btrfs_qgroup_rescan_worker()
2773 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan_worker()
2776 fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT) { in btrfs_qgroup_rescan_worker()
2777 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_rescan_worker()
2779 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_rescan_worker()
2781 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
2787 trans = btrfs_start_transaction(fs_info->quota_root, 1); in btrfs_qgroup_rescan_worker()
2790 btrfs_err(fs_info, in btrfs_qgroup_rescan_worker()
2798 btrfs_err(fs_info, "fail to update qgroup status: %d", err); in btrfs_qgroup_rescan_worker()
2802 if (btrfs_fs_closing(fs_info)) { in btrfs_qgroup_rescan_worker()
2803 btrfs_info(fs_info, "qgroup scan paused"); in btrfs_qgroup_rescan_worker()
2805 btrfs_info(fs_info, "qgroup scan completed%s", in btrfs_qgroup_rescan_worker()
2808 btrfs_err(fs_info, "qgroup scan failed with %d", err); in btrfs_qgroup_rescan_worker()
2812 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
2813 fs_info->qgroup_rescan_running = false; in btrfs_qgroup_rescan_worker()
2814 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
2815 complete_all(&fs_info->qgroup_rescan_completion); in btrfs_qgroup_rescan_worker()
2823 qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid, in qgroup_rescan_init() argument
2830 if (!(fs_info->qgroup_flags & in qgroup_rescan_init()
2832 btrfs_warn(fs_info, in qgroup_rescan_init()
2835 } else if (!(fs_info->qgroup_flags & in qgroup_rescan_init()
2837 btrfs_warn(fs_info, in qgroup_rescan_init()
2846 mutex_lock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
2847 spin_lock(&fs_info->qgroup_lock); in qgroup_rescan_init()
2850 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) { in qgroup_rescan_init()
2851 btrfs_warn(fs_info, in qgroup_rescan_init()
2854 } else if (!(fs_info->qgroup_flags & in qgroup_rescan_init()
2856 btrfs_warn(fs_info, in qgroup_rescan_init()
2862 spin_unlock(&fs_info->qgroup_lock); in qgroup_rescan_init()
2863 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
2866 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_RESCAN; in qgroup_rescan_init()
2869 memset(&fs_info->qgroup_rescan_progress, 0, in qgroup_rescan_init()
2870 sizeof(fs_info->qgroup_rescan_progress)); in qgroup_rescan_init()
2871 fs_info->qgroup_rescan_progress.objectid = progress_objectid; in qgroup_rescan_init()
2872 init_completion(&fs_info->qgroup_rescan_completion); in qgroup_rescan_init()
2873 fs_info->qgroup_rescan_running = true; in qgroup_rescan_init()
2875 spin_unlock(&fs_info->qgroup_lock); in qgroup_rescan_init()
2876 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
2878 memset(&fs_info->qgroup_rescan_work, 0, in qgroup_rescan_init()
2879 sizeof(fs_info->qgroup_rescan_work)); in qgroup_rescan_init()
2880 btrfs_init_work(&fs_info->qgroup_rescan_work, in qgroup_rescan_init()
2887 qgroup_rescan_zero_tracking(struct btrfs_fs_info *fs_info) in qgroup_rescan_zero_tracking() argument
2892 spin_lock(&fs_info->qgroup_lock); in qgroup_rescan_zero_tracking()
2894 for (n = rb_first(&fs_info->qgroup_tree); n; n = rb_next(n)) { in qgroup_rescan_zero_tracking()
2901 spin_unlock(&fs_info->qgroup_lock); in qgroup_rescan_zero_tracking()
2905 btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info) in btrfs_qgroup_rescan() argument
2910 ret = qgroup_rescan_init(fs_info, 0, 1); in btrfs_qgroup_rescan()
2925 trans = btrfs_join_transaction(fs_info->fs_root); in btrfs_qgroup_rescan()
2927 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan()
2932 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan()
2936 qgroup_rescan_zero_tracking(fs_info); in btrfs_qgroup_rescan()
2938 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_qgroup_rescan()
2939 &fs_info->qgroup_rescan_work); in btrfs_qgroup_rescan()
2944 int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info, in btrfs_qgroup_wait_for_completion() argument
2950 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_wait_for_completion()
2951 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_wait_for_completion()
2952 running = fs_info->qgroup_rescan_running; in btrfs_qgroup_wait_for_completion()
2953 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_wait_for_completion()
2954 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_wait_for_completion()
2961 &fs_info->qgroup_rescan_completion); in btrfs_qgroup_wait_for_completion()
2963 wait_for_completion(&fs_info->qgroup_rescan_completion); in btrfs_qgroup_wait_for_completion()
2973 btrfs_qgroup_rescan_resume(struct btrfs_fs_info *fs_info) in btrfs_qgroup_rescan_resume() argument
2975 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) in btrfs_qgroup_rescan_resume()
2976 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_qgroup_rescan_resume()
2977 &fs_info->qgroup_rescan_work); in btrfs_qgroup_rescan_resume()
3006 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &root->fs_info->flags) || in btrfs_qgroup_reserve_data()
3058 len = round_up(start + len, root->fs_info->sectorsize); in qgroup_free_reserved_data()
3059 start = round_down(start, root->fs_info->sectorsize); in qgroup_free_reserved_data()
3093 btrfs_qgroup_free_refroot(root->fs_info, root->objectid, freed, in qgroup_free_reserved_data()
3124 btrfs_qgroup_free_refroot(BTRFS_I(inode)->root->fs_info, in __btrfs_qgroup_release_data()
3214 struct btrfs_fs_info *fs_info = root->fs_info; in __btrfs_qgroup_reserve_meta() local
3217 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in __btrfs_qgroup_reserve_meta()
3221 BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize)); in __btrfs_qgroup_reserve_meta()
3240 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_free_meta_all_pertrans() local
3242 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in btrfs_qgroup_free_meta_all_pertrans()
3249 btrfs_qgroup_free_refroot(fs_info, root->objectid, (u64)-1, in btrfs_qgroup_free_meta_all_pertrans()
3256 struct btrfs_fs_info *fs_info = root->fs_info; in __btrfs_qgroup_free_meta() local
3258 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in __btrfs_qgroup_free_meta()
3268 BUG_ON(num_bytes != round_down(num_bytes, fs_info->nodesize)); in __btrfs_qgroup_free_meta()
3270 btrfs_qgroup_free_refroot(fs_info, root->objectid, num_bytes, type); in __btrfs_qgroup_free_meta()
3273 static void qgroup_convert_meta(struct btrfs_fs_info *fs_info, u64 ref_root, in qgroup_convert_meta() argument
3276 struct btrfs_root *quota_root = fs_info->quota_root; in qgroup_convert_meta()
3287 spin_lock(&fs_info->qgroup_lock); in qgroup_convert_meta()
3288 qgroup = find_qgroup_rb(fs_info, ref_root); in qgroup_convert_meta()
3291 ulist_reinit(fs_info->qgroup_ulist); in qgroup_convert_meta()
3292 ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid, in qgroup_convert_meta()
3297 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in qgroup_convert_meta()
3303 qgroup_rsv_release(fs_info, qg, num_bytes, in qgroup_convert_meta()
3305 qgroup_rsv_add(fs_info, qg, num_bytes, in qgroup_convert_meta()
3308 ret = ulist_add(fs_info->qgroup_ulist, in qgroup_convert_meta()
3316 spin_unlock(&fs_info->qgroup_lock); in qgroup_convert_meta()
3321 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_convert_reserved_meta() local
3323 if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags) || in btrfs_qgroup_convert_reserved_meta()
3330 qgroup_convert_meta(fs_info, root->objectid, num_bytes); in btrfs_qgroup_convert_reserved_meta()
3352 btrfs_warn(BTRFS_I(inode)->root->fs_info, in btrfs_qgroup_check_reserved_leak()
3356 btrfs_qgroup_free_refroot(BTRFS_I(inode)->root->fs_info, in btrfs_qgroup_check_reserved_leak()