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 --- |