backref.c (30a9da5d8d494dda15d4b79a8596445140d3aac9) backref.c (29cbcf401793f4e2c871c846edc2191731df2c41)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2011 STRATO. All rights reserved.
4 */
5
6#include <linux/mm.h>
7#include <linux/rbtree.h>
8#include <trace/events/btrfs.h>

--- 1156 unchanged lines hidden (view full) ---

1165 * FIXME some caching might speed things up
1166 */
1167static int find_parent_nodes(struct btrfs_trans_handle *trans,
1168 struct btrfs_fs_info *fs_info, u64 bytenr,
1169 u64 time_seq, struct ulist *refs,
1170 struct ulist *roots, const u64 *extent_item_pos,
1171 struct share_check *sc, bool ignore_offset)
1172{
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2011 STRATO. All rights reserved.
4 */
5
6#include <linux/mm.h>
7#include <linux/rbtree.h>
8#include <trace/events/btrfs.h>

--- 1156 unchanged lines hidden (view full) ---

1165 * FIXME some caching might speed things up
1166 */
1167static int find_parent_nodes(struct btrfs_trans_handle *trans,
1168 struct btrfs_fs_info *fs_info, u64 bytenr,
1169 u64 time_seq, struct ulist *refs,
1170 struct ulist *roots, const u64 *extent_item_pos,
1171 struct share_check *sc, bool ignore_offset)
1172{
1173 struct btrfs_root *root = fs_info->extent_root;
1173 struct btrfs_root *root = btrfs_extent_root(fs_info, bytenr);
1174 struct btrfs_key key;
1175 struct btrfs_path *path;
1176 struct btrfs_delayed_ref_root *delayed_refs = NULL;
1177 struct btrfs_delayed_ref_head *head;
1178 int info_level = 0;
1179 int ret;
1180 struct prelim_ref *ref;
1181 struct rb_node *node;

--- 560 unchanged lines hidden (view full) ---

1742 * this makes the path point to (logical EXTENT_ITEM *)
1743 * returns BTRFS_EXTENT_FLAG_DATA for data, BTRFS_EXTENT_FLAG_TREE_BLOCK for
1744 * tree blocks and <0 on error.
1745 */
1746int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical,
1747 struct btrfs_path *path, struct btrfs_key *found_key,
1748 u64 *flags_ret)
1749{
1174 struct btrfs_key key;
1175 struct btrfs_path *path;
1176 struct btrfs_delayed_ref_root *delayed_refs = NULL;
1177 struct btrfs_delayed_ref_head *head;
1178 int info_level = 0;
1179 int ret;
1180 struct prelim_ref *ref;
1181 struct rb_node *node;

--- 560 unchanged lines hidden (view full) ---

1742 * this makes the path point to (logical EXTENT_ITEM *)
1743 * returns BTRFS_EXTENT_FLAG_DATA for data, BTRFS_EXTENT_FLAG_TREE_BLOCK for
1744 * tree blocks and <0 on error.
1745 */
1746int extent_from_logical(struct btrfs_fs_info *fs_info, u64 logical,
1747 struct btrfs_path *path, struct btrfs_key *found_key,
1748 u64 *flags_ret)
1749{
1750 struct btrfs_root *extent_root = btrfs_extent_root(fs_info, logical);
1750 int ret;
1751 u64 flags;
1752 u64 size = 0;
1753 u32 item_size;
1754 const struct extent_buffer *eb;
1755 struct btrfs_extent_item *ei;
1756 struct btrfs_key key;
1757
1758 if (btrfs_fs_incompat(fs_info, SKINNY_METADATA))
1759 key.type = BTRFS_METADATA_ITEM_KEY;
1760 else
1761 key.type = BTRFS_EXTENT_ITEM_KEY;
1762 key.objectid = logical;
1763 key.offset = (u64)-1;
1764
1751 int ret;
1752 u64 flags;
1753 u64 size = 0;
1754 u32 item_size;
1755 const struct extent_buffer *eb;
1756 struct btrfs_extent_item *ei;
1757 struct btrfs_key key;
1758
1759 if (btrfs_fs_incompat(fs_info, SKINNY_METADATA))
1760 key.type = BTRFS_METADATA_ITEM_KEY;
1761 else
1762 key.type = BTRFS_EXTENT_ITEM_KEY;
1763 key.objectid = logical;
1764 key.offset = (u64)-1;
1765
1765 ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
1766 ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0);
1766 if (ret < 0)
1767 return ret;
1768
1767 if (ret < 0)
1768 return ret;
1769
1769 ret = btrfs_previous_extent_item(fs_info->extent_root, path, 0);
1770 ret = btrfs_previous_extent_item(extent_root, path, 0);
1770 if (ret) {
1771 if (ret > 0)
1772 ret = -ENOENT;
1773 return ret;
1774 }
1775 btrfs_item_key_to_cpu(path->nodes[0], found_key, path->slots[0]);
1776 if (found_key->type == BTRFS_METADATA_ITEM_KEY)
1777 size = fs_info->nodesize;

--- 552 unchanged lines hidden (view full) ---

2330 ret->fs_info = fs_info;
2331
2332 return ret;
2333}
2334
2335int btrfs_backref_iter_start(struct btrfs_backref_iter *iter, u64 bytenr)
2336{
2337 struct btrfs_fs_info *fs_info = iter->fs_info;
1771 if (ret) {
1772 if (ret > 0)
1773 ret = -ENOENT;
1774 return ret;
1775 }
1776 btrfs_item_key_to_cpu(path->nodes[0], found_key, path->slots[0]);
1777 if (found_key->type == BTRFS_METADATA_ITEM_KEY)
1778 size = fs_info->nodesize;

--- 552 unchanged lines hidden (view full) ---

2331 ret->fs_info = fs_info;
2332
2333 return ret;
2334}
2335
2336int btrfs_backref_iter_start(struct btrfs_backref_iter *iter, u64 bytenr)
2337{
2338 struct btrfs_fs_info *fs_info = iter->fs_info;
2339 struct btrfs_root *extent_root = btrfs_extent_root(fs_info, bytenr);
2338 struct btrfs_path *path = iter->path;
2339 struct btrfs_extent_item *ei;
2340 struct btrfs_key key;
2341 int ret;
2342
2343 key.objectid = bytenr;
2344 key.type = BTRFS_METADATA_ITEM_KEY;
2345 key.offset = (u64)-1;
2346 iter->bytenr = bytenr;
2347
2340 struct btrfs_path *path = iter->path;
2341 struct btrfs_extent_item *ei;
2342 struct btrfs_key key;
2343 int ret;
2344
2345 key.objectid = bytenr;
2346 key.type = BTRFS_METADATA_ITEM_KEY;
2347 key.offset = (u64)-1;
2348 iter->bytenr = bytenr;
2349
2348 ret = btrfs_search_slot(NULL, fs_info->extent_root, &key, path, 0, 0);
2350 ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0);
2349 if (ret < 0)
2350 return ret;
2351 if (ret == 0) {
2352 ret = -EUCLEAN;
2353 goto release;
2354 }
2355 if (path->slots[0] == 0) {
2356 WARN_ON(IS_ENABLED(CONFIG_BTRFS_DEBUG));

--- 26 unchanged lines hidden (view full) ---

2383 if (btrfs_extent_flags(path->nodes[0], ei) & BTRFS_EXTENT_FLAG_DATA) {
2384 ret = -ENOTSUPP;
2385 goto release;
2386 }
2387 iter->cur_ptr = (u32)(iter->item_ptr + sizeof(*ei));
2388
2389 /* If there is no inline backref, go search for keyed backref */
2390 if (iter->cur_ptr >= iter->end_ptr) {
2351 if (ret < 0)
2352 return ret;
2353 if (ret == 0) {
2354 ret = -EUCLEAN;
2355 goto release;
2356 }
2357 if (path->slots[0] == 0) {
2358 WARN_ON(IS_ENABLED(CONFIG_BTRFS_DEBUG));

--- 26 unchanged lines hidden (view full) ---

2385 if (btrfs_extent_flags(path->nodes[0], ei) & BTRFS_EXTENT_FLAG_DATA) {
2386 ret = -ENOTSUPP;
2387 goto release;
2388 }
2389 iter->cur_ptr = (u32)(iter->item_ptr + sizeof(*ei));
2390
2391 /* If there is no inline backref, go search for keyed backref */
2392 if (iter->cur_ptr >= iter->end_ptr) {
2391 ret = btrfs_next_item(fs_info->extent_root, path);
2393 ret = btrfs_next_item(extent_root, path);
2392
2393 /* No inline nor keyed ref */
2394 if (ret > 0) {
2395 ret = -ENOENT;
2396 goto release;
2397 }
2398 if (ret < 0)
2399 goto release;

--- 27 unchanged lines hidden (view full) ---

2427 *
2428 * Return 0 if we get next backref without problem.
2429 * Return >0 if there is no extra backref for this bytenr.
2430 * Return <0 if there is something wrong happened.
2431 */
2432int btrfs_backref_iter_next(struct btrfs_backref_iter *iter)
2433{
2434 struct extent_buffer *eb = btrfs_backref_get_eb(iter);
2394
2395 /* No inline nor keyed ref */
2396 if (ret > 0) {
2397 ret = -ENOENT;
2398 goto release;
2399 }
2400 if (ret < 0)
2401 goto release;

--- 27 unchanged lines hidden (view full) ---

2429 *
2430 * Return 0 if we get next backref without problem.
2431 * Return >0 if there is no extra backref for this bytenr.
2432 * Return <0 if there is something wrong happened.
2433 */
2434int btrfs_backref_iter_next(struct btrfs_backref_iter *iter)
2435{
2436 struct extent_buffer *eb = btrfs_backref_get_eb(iter);
2437 struct btrfs_root *extent_root;
2435 struct btrfs_path *path = iter->path;
2436 struct btrfs_extent_inline_ref *iref;
2437 int ret;
2438 u32 size;
2439
2440 if (btrfs_backref_iter_is_inline_ref(iter)) {
2441 /* We're still inside the inline refs */
2442 ASSERT(iter->cur_ptr < iter->end_ptr);

--- 14 unchanged lines hidden (view full) ---

2457 iter->cur_ptr += size;
2458 if (iter->cur_ptr < iter->end_ptr)
2459 return 0;
2460
2461 /* All inline items iterated, fall through */
2462 }
2463
2464 /* We're at keyed items, there is no inline item, go to the next one */
2438 struct btrfs_path *path = iter->path;
2439 struct btrfs_extent_inline_ref *iref;
2440 int ret;
2441 u32 size;
2442
2443 if (btrfs_backref_iter_is_inline_ref(iter)) {
2444 /* We're still inside the inline refs */
2445 ASSERT(iter->cur_ptr < iter->end_ptr);

--- 14 unchanged lines hidden (view full) ---

2460 iter->cur_ptr += size;
2461 if (iter->cur_ptr < iter->end_ptr)
2462 return 0;
2463
2464 /* All inline items iterated, fall through */
2465 }
2466
2467 /* We're at keyed items, there is no inline item, go to the next one */
2465 ret = btrfs_next_item(iter->fs_info->extent_root, iter->path);
2468 extent_root = btrfs_extent_root(iter->fs_info, iter->bytenr);
2469 ret = btrfs_next_item(extent_root, iter->path);
2466 if (ret)
2467 return ret;
2468
2469 btrfs_item_key_to_cpu(path->nodes[0], &iter->cur_key, path->slots[0]);
2470 if (iter->cur_key.objectid != iter->bytenr ||
2471 (iter->cur_key.type != BTRFS_TREE_BLOCK_REF_KEY &&
2472 iter->cur_key.type != BTRFS_SHARED_BLOCK_REF_KEY))
2473 return 1;

--- 658 unchanged lines hidden ---
2470 if (ret)
2471 return ret;
2472
2473 btrfs_item_key_to_cpu(path->nodes[0], &iter->cur_key, path->slots[0]);
2474 if (iter->cur_key.objectid != iter->bytenr ||
2475 (iter->cur_key.type != BTRFS_TREE_BLOCK_REF_KEY &&
2476 iter->cur_key.type != BTRFS_SHARED_BLOCK_REF_KEY))
2477 return 1;

--- 658 unchanged lines hidden ---