Lines Matching refs:fs_info
106 qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid,
108 static void qgroup_rescan_zero_tracking(struct btrfs_fs_info *fs_info);
111 static struct btrfs_qgroup *find_qgroup_rb(struct btrfs_fs_info *fs_info, in find_qgroup_rb() argument
114 struct rb_node *n = fs_info->qgroup_tree.rb_node; in find_qgroup_rb()
130 static struct btrfs_qgroup *add_qgroup_rb(struct btrfs_fs_info *fs_info, in add_qgroup_rb() argument
133 struct rb_node **p = &fs_info->qgroup_tree.rb_node; in add_qgroup_rb()
159 rb_insert_color(&qgroup->node, &fs_info->qgroup_tree); in add_qgroup_rb()
188 static int del_qgroup_rb(struct btrfs_fs_info *fs_info, u64 qgroupid) in del_qgroup_rb() argument
190 struct btrfs_qgroup *qgroup = find_qgroup_rb(fs_info, qgroupid); in del_qgroup_rb()
195 rb_erase(&qgroup->node, &fs_info->qgroup_tree); in del_qgroup_rb()
201 static int add_relation_rb(struct btrfs_fs_info *fs_info, in add_relation_rb() argument
208 member = find_qgroup_rb(fs_info, memberid); in add_relation_rb()
209 parent = find_qgroup_rb(fs_info, parentid); in add_relation_rb()
226 static int del_relation_rb(struct btrfs_fs_info *fs_info, in del_relation_rb() argument
233 member = find_qgroup_rb(fs_info, memberid); in del_relation_rb()
234 parent = find_qgroup_rb(fs_info, parentid); in del_relation_rb()
250 int btrfs_verify_qgroup_counts(struct btrfs_fs_info *fs_info, u64 qgroupid, in btrfs_verify_qgroup_counts() argument
255 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_verify_qgroup_counts()
268 int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info) in btrfs_read_qgroup_config() argument
272 struct btrfs_root *quota_root = fs_info->quota_root; in btrfs_read_qgroup_config()
280 if (!fs_info->quota_enabled) in btrfs_read_qgroup_config()
283 fs_info->qgroup_ulist = ulist_alloc(GFP_NOFS); in btrfs_read_qgroup_config()
284 if (!fs_info->qgroup_ulist) { in btrfs_read_qgroup_config()
296 fs_info->qgroup_flags = 0; in btrfs_read_qgroup_config()
323 btrfs_err(fs_info, in btrfs_read_qgroup_config()
328 fs_info->generation) { in btrfs_read_qgroup_config()
330 btrfs_err(fs_info, in btrfs_read_qgroup_config()
334 fs_info->qgroup_flags = btrfs_qgroup_status_flags(l, in btrfs_read_qgroup_config()
344 qgroup = find_qgroup_rb(fs_info, found_key.offset); in btrfs_read_qgroup_config()
347 btrfs_err(fs_info, "inconsitent qgroup config"); in btrfs_read_qgroup_config()
351 qgroup = add_qgroup_rb(fs_info, found_key.offset); in btrfs_read_qgroup_config()
415 ret = add_relation_rb(fs_info, found_key.objectid, in btrfs_read_qgroup_config()
418 btrfs_warn(fs_info, in btrfs_read_qgroup_config()
433 fs_info->qgroup_flags |= flags; in btrfs_read_qgroup_config()
434 if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON)) { in btrfs_read_qgroup_config()
435 fs_info->quota_enabled = 0; in btrfs_read_qgroup_config()
436 fs_info->pending_quota_state = 0; in btrfs_read_qgroup_config()
437 } else if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN && in btrfs_read_qgroup_config()
439 ret = qgroup_rescan_init(fs_info, rescan_progress, 0); in btrfs_read_qgroup_config()
444 ulist_free(fs_info->qgroup_ulist); in btrfs_read_qgroup_config()
445 fs_info->qgroup_ulist = NULL; in btrfs_read_qgroup_config()
446 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_read_qgroup_config()
458 void btrfs_free_qgroup_config(struct btrfs_fs_info *fs_info) in btrfs_free_qgroup_config() argument
463 while ((n = rb_first(&fs_info->qgroup_tree))) { in btrfs_free_qgroup_config()
465 rb_erase(n, &fs_info->qgroup_tree); in btrfs_free_qgroup_config()
473 ulist_free(fs_info->qgroup_ulist); in btrfs_free_qgroup_config()
474 fs_info->qgroup_ulist = NULL; in btrfs_free_qgroup_config()
734 struct btrfs_fs_info *fs_info, in update_qgroup_status_item() argument
762 btrfs_set_qgroup_status_flags(l, ptr, fs_info->qgroup_flags); in update_qgroup_status_item()
765 fs_info->qgroup_rescan_progress.objectid); in update_qgroup_status_item()
818 root->fs_info->pending_quota_state = 0; in btrfs_clean_quota_tree()
824 struct btrfs_fs_info *fs_info) in btrfs_quota_enable() argument
827 struct btrfs_root *tree_root = fs_info->tree_root; in btrfs_quota_enable()
837 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
838 if (fs_info->quota_root) { in btrfs_quota_enable()
839 fs_info->pending_quota_state = 1; in btrfs_quota_enable()
843 fs_info->qgroup_ulist = ulist_alloc(GFP_NOFS); in btrfs_quota_enable()
844 if (!fs_info->qgroup_ulist) { in btrfs_quota_enable()
852 quota_root = btrfs_create_tree(trans, fs_info, in btrfs_quota_enable()
879 fs_info->qgroup_flags = BTRFS_QGROUP_STATUS_FLAG_ON | in btrfs_quota_enable()
881 btrfs_set_qgroup_status_flags(leaf, ptr, fs_info->qgroup_flags); in btrfs_quota_enable()
909 qgroup = add_qgroup_rb(fs_info, found_key.offset); in btrfs_quota_enable()
928 qgroup = add_qgroup_rb(fs_info, BTRFS_FS_TREE_OBJECTID); in btrfs_quota_enable()
933 spin_lock(&fs_info->qgroup_lock); in btrfs_quota_enable()
934 fs_info->quota_root = quota_root; in btrfs_quota_enable()
935 fs_info->pending_quota_state = 1; in btrfs_quota_enable()
936 spin_unlock(&fs_info->qgroup_lock); in btrfs_quota_enable()
947 ulist_free(fs_info->qgroup_ulist); in btrfs_quota_enable()
948 fs_info->qgroup_ulist = NULL; in btrfs_quota_enable()
950 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_enable()
955 struct btrfs_fs_info *fs_info) in btrfs_quota_disable() argument
957 struct btrfs_root *tree_root = fs_info->tree_root; in btrfs_quota_disable()
961 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
962 if (!fs_info->quota_root) in btrfs_quota_disable()
964 spin_lock(&fs_info->qgroup_lock); in btrfs_quota_disable()
965 fs_info->quota_enabled = 0; in btrfs_quota_disable()
966 fs_info->pending_quota_state = 0; in btrfs_quota_disable()
967 quota_root = fs_info->quota_root; in btrfs_quota_disable()
968 fs_info->quota_root = NULL; in btrfs_quota_disable()
969 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_quota_disable()
970 spin_unlock(&fs_info->qgroup_lock); in btrfs_quota_disable()
972 btrfs_free_qgroup_config(fs_info); in btrfs_quota_disable()
985 clean_tree_block(trans, tree_root->fs_info, quota_root->node); in btrfs_quota_disable()
993 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_quota_disable()
997 static void qgroup_dirty(struct btrfs_fs_info *fs_info, in qgroup_dirty() argument
1001 list_add(&qgroup->dirty, &fs_info->dirty_qgroups); in qgroup_dirty()
1011 static int __qgroup_excl_accounting(struct btrfs_fs_info *fs_info, in __qgroup_excl_accounting() argument
1021 qgroup = find_qgroup_rb(fs_info, ref_root); in __qgroup_excl_accounting()
1034 qgroup_dirty(fs_info, qgroup); in __qgroup_excl_accounting()
1055 qgroup_dirty(fs_info, qgroup); in __qgroup_excl_accounting()
1082 static int quick_update_accounting(struct btrfs_fs_info *fs_info, in quick_update_accounting() argument
1090 qgroup = find_qgroup_rb(fs_info, src); in quick_update_accounting()
1095 err = __qgroup_excl_accounting(fs_info, tmp, dst, in quick_update_accounting()
1104 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in quick_update_accounting()
1109 struct btrfs_fs_info *fs_info, u64 src, u64 dst) in btrfs_add_qgroup_relation() argument
1126 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_add_qgroup_relation()
1127 quota_root = fs_info->quota_root; in btrfs_add_qgroup_relation()
1132 member = find_qgroup_rb(fs_info, src); in btrfs_add_qgroup_relation()
1133 parent = find_qgroup_rb(fs_info, dst); in btrfs_add_qgroup_relation()
1157 spin_lock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1158 ret = add_relation_rb(quota_root->fs_info, src, dst); in btrfs_add_qgroup_relation()
1160 spin_unlock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1163 ret = quick_update_accounting(fs_info, tmp, src, dst, 1); in btrfs_add_qgroup_relation()
1164 spin_unlock(&fs_info->qgroup_lock); in btrfs_add_qgroup_relation()
1166 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_add_qgroup_relation()
1172 struct btrfs_fs_info *fs_info, u64 src, u64 dst) in __del_qgroup_relation() argument
1186 quota_root = fs_info->quota_root; in __del_qgroup_relation()
1192 member = find_qgroup_rb(fs_info, src); in __del_qgroup_relation()
1193 parent = find_qgroup_rb(fs_info, dst); in __del_qgroup_relation()
1212 spin_lock(&fs_info->qgroup_lock); in __del_qgroup_relation()
1213 del_relation_rb(fs_info, src, dst); in __del_qgroup_relation()
1214 ret = quick_update_accounting(fs_info, tmp, src, dst, -1); in __del_qgroup_relation()
1215 spin_unlock(&fs_info->qgroup_lock); in __del_qgroup_relation()
1222 struct btrfs_fs_info *fs_info, u64 src, u64 dst) in btrfs_del_qgroup_relation() argument
1226 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_del_qgroup_relation()
1227 ret = __del_qgroup_relation(trans, fs_info, src, dst); in btrfs_del_qgroup_relation()
1228 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_del_qgroup_relation()
1234 struct btrfs_fs_info *fs_info, u64 qgroupid) in btrfs_create_qgroup() argument
1240 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_create_qgroup()
1241 quota_root = fs_info->quota_root; in btrfs_create_qgroup()
1246 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_create_qgroup()
1256 spin_lock(&fs_info->qgroup_lock); in btrfs_create_qgroup()
1257 qgroup = add_qgroup_rb(fs_info, qgroupid); in btrfs_create_qgroup()
1258 spin_unlock(&fs_info->qgroup_lock); in btrfs_create_qgroup()
1263 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_create_qgroup()
1268 struct btrfs_fs_info *fs_info, u64 qgroupid) in btrfs_remove_qgroup() argument
1275 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_remove_qgroup()
1276 quota_root = fs_info->quota_root; in btrfs_remove_qgroup()
1282 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_remove_qgroup()
1298 ret = __del_qgroup_relation(trans, fs_info, in btrfs_remove_qgroup()
1305 spin_lock(&fs_info->qgroup_lock); in btrfs_remove_qgroup()
1306 del_qgroup_rb(quota_root->fs_info, qgroupid); in btrfs_remove_qgroup()
1307 spin_unlock(&fs_info->qgroup_lock); in btrfs_remove_qgroup()
1309 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_remove_qgroup()
1314 struct btrfs_fs_info *fs_info, u64 qgroupid, in btrfs_limit_qgroup() argument
1321 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_limit_qgroup()
1322 quota_root = fs_info->quota_root; in btrfs_limit_qgroup()
1328 qgroup = find_qgroup_rb(fs_info, qgroupid); in btrfs_limit_qgroup()
1334 spin_lock(&fs_info->qgroup_lock); in btrfs_limit_qgroup()
1345 spin_unlock(&fs_info->qgroup_lock); in btrfs_limit_qgroup()
1349 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_limit_qgroup()
1350 btrfs_info(fs_info, "unable to update quota limit for %llu", in btrfs_limit_qgroup()
1355 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_limit_qgroup()
1377 static int qgroup_oper_exists(struct btrfs_fs_info *fs_info, in qgroup_oper_exists() argument
1384 spin_lock(&fs_info->qgroup_op_lock); in qgroup_oper_exists()
1385 n = fs_info->qgroup_op_tree.rb_node; in qgroup_oper_exists()
1394 spin_unlock(&fs_info->qgroup_op_lock); in qgroup_oper_exists()
1398 spin_unlock(&fs_info->qgroup_op_lock); in qgroup_oper_exists()
1424 static int insert_qgroup_oper(struct btrfs_fs_info *fs_info, in insert_qgroup_oper() argument
1432 spin_lock(&fs_info->qgroup_op_lock); in insert_qgroup_oper()
1433 p = &fs_info->qgroup_op_tree.rb_node; in insert_qgroup_oper()
1443 spin_unlock(&fs_info->qgroup_op_lock); in insert_qgroup_oper()
1448 rb_insert_color(&oper->n, &fs_info->qgroup_op_tree); in insert_qgroup_oper()
1449 spin_unlock(&fs_info->qgroup_op_lock); in insert_qgroup_oper()
1470 struct btrfs_fs_info *fs_info, u64 ref_root, in btrfs_qgroup_record_ref() argument
1477 if (!is_fstree(ref_root) || !fs_info->quota_enabled) in btrfs_qgroup_record_ref()
1488 oper->seq = atomic_inc_return(&fs_info->qgroup_op_seq); in btrfs_qgroup_record_ref()
1504 if (qgroup_oper_exists(fs_info, oper)) { in btrfs_qgroup_record_ref()
1510 ret = insert_qgroup_oper(fs_info, oper); in btrfs_qgroup_record_ref()
1520 btrfs_get_tree_mod_seq(fs_info, &oper->elem); in btrfs_qgroup_record_ref()
1525 static int qgroup_excl_accounting(struct btrfs_fs_info *fs_info, in qgroup_excl_accounting() argument
1536 spin_lock(&fs_info->qgroup_lock); in qgroup_excl_accounting()
1537 if (!fs_info->quota_root) in qgroup_excl_accounting()
1550 ret = __qgroup_excl_accounting(fs_info, tmp, oper->ref_root, in qgroup_excl_accounting()
1553 spin_unlock(&fs_info->qgroup_lock); in qgroup_excl_accounting()
1562 static int qgroup_calc_old_refcnt(struct btrfs_fs_info *fs_info, in qgroup_calc_old_refcnt() argument
1579 qg = find_qgroup_rb(fs_info, unode->val); in qgroup_calc_old_refcnt()
1650 static int qgroup_account_deleted_refs(struct btrfs_fs_info *fs_info, in qgroup_account_deleted_refs() argument
1669 spin_lock(&fs_info->qgroup_op_lock); in qgroup_account_deleted_refs()
1671 spin_unlock(&fs_info->qgroup_op_lock); in qgroup_account_deleted_refs()
1683 qg = find_qgroup_rb(fs_info, tmp_oper->ref_root); in qgroup_account_deleted_refs()
1708 spin_lock(&fs_info->qgroup_op_lock); in qgroup_account_deleted_refs()
1710 spin_unlock(&fs_info->qgroup_op_lock); in qgroup_account_deleted_refs()
1745 static int qgroup_calc_new_refcnt(struct btrfs_fs_info *fs_info, in qgroup_calc_new_refcnt() argument
1798 static int qgroup_adjust_counters(struct btrfs_fs_info *fs_info, in qgroup_adjust_counters() argument
1867 qgroup_dirty(fs_info, qg); in qgroup_adjust_counters()
1878 struct btrfs_fs_info *fs_info, in check_existing_refs() argument
1886 ret = btrfs_find_all_roots(trans, fs_info, oper->bytenr, in check_existing_refs()
1900 btrfs_put_tree_mod_seq(fs_info, &oper->elem); in check_existing_refs()
1946 struct btrfs_fs_info *fs_info, in qgroup_shared_accounting() argument
1959 ret = check_existing_refs(trans, fs_info, oper); in qgroup_shared_accounting()
1976 btrfs_get_tree_mod_seq(fs_info, &elem); in qgroup_shared_accounting()
1977 ret = btrfs_find_all_roots(trans, fs_info, oper->bytenr, elem.seq, in qgroup_shared_accounting()
1979 btrfs_put_tree_mod_seq(fs_info, &elem); in qgroup_shared_accounting()
1985 spin_lock(&fs_info->qgroup_lock); in qgroup_shared_accounting()
1986 qgroup = find_qgroup_rb(fs_info, oper->ref_root); in qgroup_shared_accounting()
1989 seq = fs_info->qgroup_seq; in qgroup_shared_accounting()
1999 ret = qgroup_calc_old_refcnt(fs_info, oper->ref_root, tmp, roots, qgroups, in qgroup_shared_accounting()
2009 ret = qgroup_calc_new_refcnt(fs_info, oper, qgroup, tmp, qgroups, in qgroup_shared_accounting()
2024 ret = qgroup_account_deleted_refs(fs_info, oper, tmp, qgroups, seq, in qgroup_shared_accounting()
2039 fs_info->qgroup_seq += old_roots + 1; in qgroup_shared_accounting()
2046 qgroup_adjust_counters(fs_info, oper->ref_root, oper->num_bytes, in qgroup_shared_accounting()
2049 spin_unlock(&fs_info->qgroup_lock); in qgroup_shared_accounting()
2062 struct btrfs_fs_info *fs_info, in qgroup_subtree_accounting() argument
2080 btrfs_get_tree_mod_seq(fs_info, &elem); in qgroup_subtree_accounting()
2081 ret = btrfs_find_all_roots(trans, fs_info, oper->bytenr, in qgroup_subtree_accounting()
2083 btrfs_put_tree_mod_seq(fs_info, &elem); in qgroup_subtree_accounting()
2111 spin_lock(&fs_info->qgroup_lock); in qgroup_subtree_accounting()
2112 qg = find_qgroup_rb(fs_info, root_obj); in qgroup_subtree_accounting()
2118 qgroup_dirty(fs_info, qg); in qgroup_subtree_accounting()
2139 qgroup_dirty(fs_info, qg); in qgroup_subtree_accounting()
2153 spin_unlock(&fs_info->qgroup_lock); in qgroup_subtree_accounting()
2168 struct btrfs_fs_info *fs_info, in btrfs_qgroup_account() argument
2173 if (!fs_info->quota_enabled) in btrfs_qgroup_account()
2176 BUG_ON(!fs_info->quota_root); in btrfs_qgroup_account()
2178 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account()
2179 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) { in btrfs_qgroup_account()
2180 if (fs_info->qgroup_rescan_progress.objectid <= oper->bytenr) { in btrfs_qgroup_account()
2181 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account()
2185 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_account()
2194 ret = qgroup_excl_accounting(fs_info, oper); in btrfs_qgroup_account()
2198 ret = qgroup_shared_accounting(trans, fs_info, oper); in btrfs_qgroup_account()
2201 ret = qgroup_subtree_accounting(trans, fs_info, oper); in btrfs_qgroup_account()
2214 struct btrfs_fs_info *fs_info) in btrfs_delayed_qgroup_accounting() argument
2224 ret = btrfs_qgroup_account(trans, fs_info, oper); in btrfs_delayed_qgroup_accounting()
2225 spin_lock(&fs_info->qgroup_op_lock); in btrfs_delayed_qgroup_accounting()
2226 rb_erase(&oper->n, &fs_info->qgroup_op_tree); in btrfs_delayed_qgroup_accounting()
2227 spin_unlock(&fs_info->qgroup_op_lock); in btrfs_delayed_qgroup_accounting()
2228 btrfs_put_tree_mod_seq(fs_info, &oper->elem); in btrfs_delayed_qgroup_accounting()
2238 struct btrfs_fs_info *fs_info) in btrfs_run_qgroups() argument
2240 struct btrfs_root *quota_root = fs_info->quota_root; in btrfs_run_qgroups()
2247 if (!fs_info->quota_enabled && fs_info->pending_quota_state) in btrfs_run_qgroups()
2250 fs_info->quota_enabled = fs_info->pending_quota_state; in btrfs_run_qgroups()
2252 spin_lock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2253 while (!list_empty(&fs_info->dirty_qgroups)) { in btrfs_run_qgroups()
2255 qgroup = list_first_entry(&fs_info->dirty_qgroups, in btrfs_run_qgroups()
2258 spin_unlock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2261 fs_info->qgroup_flags |= in btrfs_run_qgroups()
2265 fs_info->qgroup_flags |= in btrfs_run_qgroups()
2267 spin_lock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2269 if (fs_info->quota_enabled) in btrfs_run_qgroups()
2270 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_run_qgroups()
2272 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_ON; in btrfs_run_qgroups()
2273 spin_unlock(&fs_info->qgroup_lock); in btrfs_run_qgroups()
2275 ret = update_qgroup_status_item(trans, fs_info, quota_root); in btrfs_run_qgroups()
2277 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_run_qgroups()
2280 ret = qgroup_rescan_init(fs_info, 0, 1); in btrfs_run_qgroups()
2282 qgroup_rescan_zero_tracking(fs_info); in btrfs_run_qgroups()
2283 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_run_qgroups()
2284 &fs_info->qgroup_rescan_work); in btrfs_run_qgroups()
2299 struct btrfs_fs_info *fs_info, u64 srcid, u64 objectid, in btrfs_qgroup_inherit() argument
2305 struct btrfs_root *quota_root = fs_info->quota_root; in btrfs_qgroup_inherit()
2311 mutex_lock(&fs_info->qgroup_ioctl_lock); in btrfs_qgroup_inherit()
2312 if (!fs_info->quota_enabled) in btrfs_qgroup_inherit()
2325 srcgroup = find_qgroup_rb(fs_info, *i_qgroups); in btrfs_qgroup_inherit()
2353 srcroot = btrfs_read_fs_root_no_name(fs_info, &srckey); in btrfs_qgroup_inherit()
2383 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_inherit()
2385 dstgroup = add_qgroup_rb(fs_info, objectid); in btrfs_qgroup_inherit()
2400 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_inherit()
2401 btrfs_info(fs_info, "unable to update quota limit for %llu", in btrfs_qgroup_inherit()
2408 srcgroup = find_qgroup_rb(fs_info, srcid); in btrfs_qgroup_inherit()
2431 qgroup_dirty(fs_info, dstgroup); in btrfs_qgroup_inherit()
2432 qgroup_dirty(fs_info, srcgroup); in btrfs_qgroup_inherit()
2440 ret = add_relation_rb(quota_root->fs_info, objectid, in btrfs_qgroup_inherit()
2451 src = find_qgroup_rb(fs_info, i_qgroups[0]); in btrfs_qgroup_inherit()
2452 dst = find_qgroup_rb(fs_info, i_qgroups[1]); in btrfs_qgroup_inherit()
2467 src = find_qgroup_rb(fs_info, i_qgroups[0]); in btrfs_qgroup_inherit()
2468 dst = find_qgroup_rb(fs_info, i_qgroups[1]); in btrfs_qgroup_inherit()
2481 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_inherit()
2483 mutex_unlock(&fs_info->qgroup_ioctl_lock); in btrfs_qgroup_inherit()
2491 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_reserve() local
2503 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_reserve()
2504 quota_root = fs_info->quota_root; in btrfs_qgroup_reserve()
2508 qgroup = find_qgroup_rb(fs_info, ref_root); in btrfs_qgroup_reserve()
2516 ulist_reinit(fs_info->qgroup_ulist); in btrfs_qgroup_reserve()
2517 ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid, in btrfs_qgroup_reserve()
2522 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in btrfs_qgroup_reserve()
2543 ret = ulist_add(fs_info->qgroup_ulist, in btrfs_qgroup_reserve()
2555 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in btrfs_qgroup_reserve()
2564 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_reserve()
2572 struct btrfs_fs_info *fs_info = root->fs_info; in btrfs_qgroup_free() local
2584 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_free()
2586 quota_root = fs_info->quota_root; in btrfs_qgroup_free()
2590 qgroup = find_qgroup_rb(fs_info, ref_root); in btrfs_qgroup_free()
2594 ulist_reinit(fs_info->qgroup_ulist); in btrfs_qgroup_free()
2595 ret = ulist_add(fs_info->qgroup_ulist, qgroup->qgroupid, in btrfs_qgroup_free()
2600 while ((unode = ulist_next(fs_info->qgroup_ulist, &uiter))) { in btrfs_qgroup_free()
2609 ret = ulist_add(fs_info->qgroup_ulist, in btrfs_qgroup_free()
2618 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_free()
2625 btrfs_err(trans->root->fs_info, in assert_qgroups_uptodate()
2639 qgroup_rescan_leaf(struct btrfs_fs_info *fs_info, struct btrfs_path *path, in qgroup_rescan_leaf() argument
2653 mutex_lock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
2654 ret = btrfs_search_slot_for_read(fs_info->extent_root, in qgroup_rescan_leaf()
2655 &fs_info->qgroup_rescan_progress, in qgroup_rescan_leaf()
2659 fs_info->qgroup_rescan_progress.objectid, in qgroup_rescan_leaf()
2660 fs_info->qgroup_rescan_progress.type, in qgroup_rescan_leaf()
2661 fs_info->qgroup_rescan_progress.offset, ret); in qgroup_rescan_leaf()
2672 fs_info->qgroup_rescan_progress.objectid = (u64)-1; in qgroup_rescan_leaf()
2674 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
2680 fs_info->qgroup_rescan_progress.objectid = found.objectid + 1; in qgroup_rescan_leaf()
2682 btrfs_get_tree_mod_seq(fs_info, &tree_mod_seq_elem); in qgroup_rescan_leaf()
2686 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_leaf()
2694 num_bytes = fs_info->extent_root->nodesize; in qgroup_rescan_leaf()
2699 ret = btrfs_find_all_roots(NULL, fs_info, found.objectid, 0, in qgroup_rescan_leaf()
2703 spin_lock(&fs_info->qgroup_lock); in qgroup_rescan_leaf()
2704 seq = fs_info->qgroup_seq; in qgroup_rescan_leaf()
2705 fs_info->qgroup_seq += roots->nnodes + 1; /* max refcnt */ in qgroup_rescan_leaf()
2708 ret = qgroup_calc_old_refcnt(fs_info, 0, tmp, roots, qgroups, in qgroup_rescan_leaf()
2711 spin_unlock(&fs_info->qgroup_lock); in qgroup_rescan_leaf()
2716 ret = qgroup_adjust_counters(fs_info, 0, num_bytes, qgroups, in qgroup_rescan_leaf()
2719 spin_unlock(&fs_info->qgroup_lock); in qgroup_rescan_leaf()
2723 spin_unlock(&fs_info->qgroup_lock); in qgroup_rescan_leaf()
2727 btrfs_put_tree_mod_seq(fs_info, &tree_mod_seq_elem); in qgroup_rescan_leaf()
2734 struct btrfs_fs_info *fs_info = container_of(work, struct btrfs_fs_info, in btrfs_qgroup_rescan_worker() local
2758 trans = btrfs_start_transaction(fs_info->fs_root, 0); in btrfs_qgroup_rescan_worker()
2763 if (!fs_info->quota_enabled) { in btrfs_qgroup_rescan_worker()
2766 err = qgroup_rescan_leaf(fs_info, path, trans, in btrfs_qgroup_rescan_worker()
2770 btrfs_commit_transaction(trans, fs_info->fs_root); in btrfs_qgroup_rescan_worker()
2772 btrfs_end_transaction(trans, fs_info->fs_root); in btrfs_qgroup_rescan_worker()
2781 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
2782 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan_worker()
2785 fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT) { in btrfs_qgroup_rescan_worker()
2786 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_rescan_worker()
2788 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT; in btrfs_qgroup_rescan_worker()
2790 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_rescan_worker()
2796 trans = btrfs_start_transaction(fs_info->quota_root, 1); in btrfs_qgroup_rescan_worker()
2799 btrfs_err(fs_info, in btrfs_qgroup_rescan_worker()
2804 ret = update_qgroup_status_item(trans, fs_info, fs_info->quota_root); in btrfs_qgroup_rescan_worker()
2807 btrfs_err(fs_info, "fail to update qgroup status: %d\n", err); in btrfs_qgroup_rescan_worker()
2809 btrfs_end_transaction(trans, fs_info->quota_root); in btrfs_qgroup_rescan_worker()
2812 btrfs_info(fs_info, "qgroup scan completed%s", in btrfs_qgroup_rescan_worker()
2815 btrfs_err(fs_info, "qgroup scan failed with %d", err); in btrfs_qgroup_rescan_worker()
2819 complete_all(&fs_info->qgroup_rescan_completion); in btrfs_qgroup_rescan_worker()
2827 qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid, in qgroup_rescan_init() argument
2833 (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) || in qgroup_rescan_init()
2834 !(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON))) { in qgroup_rescan_init()
2839 mutex_lock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
2840 spin_lock(&fs_info->qgroup_lock); in qgroup_rescan_init()
2843 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) in qgroup_rescan_init()
2845 else if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON)) in qgroup_rescan_init()
2849 spin_unlock(&fs_info->qgroup_lock); in qgroup_rescan_init()
2850 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
2853 fs_info->qgroup_flags |= BTRFS_QGROUP_STATUS_FLAG_RESCAN; in qgroup_rescan_init()
2856 memset(&fs_info->qgroup_rescan_progress, 0, in qgroup_rescan_init()
2857 sizeof(fs_info->qgroup_rescan_progress)); in qgroup_rescan_init()
2858 fs_info->qgroup_rescan_progress.objectid = progress_objectid; in qgroup_rescan_init()
2860 spin_unlock(&fs_info->qgroup_lock); in qgroup_rescan_init()
2861 mutex_unlock(&fs_info->qgroup_rescan_lock); in qgroup_rescan_init()
2863 init_completion(&fs_info->qgroup_rescan_completion); in qgroup_rescan_init()
2865 memset(&fs_info->qgroup_rescan_work, 0, in qgroup_rescan_init()
2866 sizeof(fs_info->qgroup_rescan_work)); in qgroup_rescan_init()
2867 btrfs_init_work(&fs_info->qgroup_rescan_work, in qgroup_rescan_init()
2873 btrfs_info(fs_info, "qgroup_rescan_init failed with %d", ret); in qgroup_rescan_init()
2881 qgroup_rescan_zero_tracking(struct btrfs_fs_info *fs_info) in qgroup_rescan_zero_tracking() argument
2886 spin_lock(&fs_info->qgroup_lock); in qgroup_rescan_zero_tracking()
2888 for (n = rb_first(&fs_info->qgroup_tree); n; n = rb_next(n)) { in qgroup_rescan_zero_tracking()
2895 spin_unlock(&fs_info->qgroup_lock); in qgroup_rescan_zero_tracking()
2899 btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info) in btrfs_qgroup_rescan() argument
2904 ret = qgroup_rescan_init(fs_info, 0, 1); in btrfs_qgroup_rescan()
2919 trans = btrfs_join_transaction(fs_info->fs_root); in btrfs_qgroup_rescan()
2921 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan()
2924 ret = btrfs_commit_transaction(trans, fs_info->fs_root); in btrfs_qgroup_rescan()
2926 fs_info->qgroup_flags &= ~BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_rescan()
2930 qgroup_rescan_zero_tracking(fs_info); in btrfs_qgroup_rescan()
2932 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_qgroup_rescan()
2933 &fs_info->qgroup_rescan_work); in btrfs_qgroup_rescan()
2938 int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info) in btrfs_qgroup_wait_for_completion() argument
2943 mutex_lock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_wait_for_completion()
2944 spin_lock(&fs_info->qgroup_lock); in btrfs_qgroup_wait_for_completion()
2945 running = fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN; in btrfs_qgroup_wait_for_completion()
2946 spin_unlock(&fs_info->qgroup_lock); in btrfs_qgroup_wait_for_completion()
2947 mutex_unlock(&fs_info->qgroup_rescan_lock); in btrfs_qgroup_wait_for_completion()
2951 &fs_info->qgroup_rescan_completion); in btrfs_qgroup_wait_for_completion()
2961 btrfs_qgroup_rescan_resume(struct btrfs_fs_info *fs_info) in btrfs_qgroup_rescan_resume() argument
2963 if (fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN) in btrfs_qgroup_rescan_resume()
2964 btrfs_queue_work(fs_info->qgroup_rescan_workers, in btrfs_qgroup_rescan_resume()
2965 &fs_info->qgroup_rescan_work); in btrfs_qgroup_rescan_resume()