ctree.c (b9729ce014f6c22d4ca7fda97a7d8ea432af5f91) | ctree.c (bfb484d922a317183d77b3b6db77a2ff659384cc) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2007,2008 Oracle. All rights reserved. 4 */ 5 6#include <linux/sched.h> 7#include <linux/slab.h> 8#include <linux/rbtree.h> --- 2212 unchanged lines hidden (view full) --- 2221 if (path->reada == READA_BACK && objectid) { 2222 btrfs_node_key(node, &disk_key, nr); 2223 if (btrfs_disk_key_objectid(&disk_key) != objectid) 2224 break; 2225 } 2226 search = btrfs_node_blockptr(node, nr); 2227 if ((search <= target && target - search <= 65536) || 2228 (search > target && search - target <= 65536)) { | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2007,2008 Oracle. All rights reserved. 4 */ 5 6#include <linux/sched.h> 7#include <linux/slab.h> 8#include <linux/rbtree.h> --- 2212 unchanged lines hidden (view full) --- 2221 if (path->reada == READA_BACK && objectid) { 2222 btrfs_node_key(node, &disk_key, nr); 2223 if (btrfs_disk_key_objectid(&disk_key) != objectid) 2224 break; 2225 } 2226 search = btrfs_node_blockptr(node, nr); 2227 if ((search <= target && target - search <= 65536) || 2228 (search > target && search - target <= 65536)) { |
2229 readahead_tree_block(fs_info, search); | 2229 btrfs_readahead_node_child(node, nr); |
2230 nread += blocksize; 2231 } 2232 nscan++; 2233 if ((nread > 65536 || nscan > 32)) 2234 break; 2235 } 2236} 2237 | 2230 nread += blocksize; 2231 } 2232 nscan++; 2233 if ((nread > 65536 || nscan > 32)) 2234 break; 2235 } 2236} 2237 |
2238static noinline void reada_for_balance(struct btrfs_fs_info *fs_info, 2239 struct btrfs_path *path, int level) | 2238static noinline void reada_for_balance(struct btrfs_path *path, int level) |
2240{ | 2239{ |
2240 struct extent_buffer *parent; |
|
2241 int slot; 2242 int nritems; | 2241 int slot; 2242 int nritems; |
2243 struct extent_buffer *parent; 2244 struct extent_buffer *eb; 2245 u64 gen; 2246 u64 block1 = 0; 2247 u64 block2 = 0; | |
2248 2249 parent = path->nodes[level + 1]; 2250 if (!parent) 2251 return; 2252 2253 nritems = btrfs_header_nritems(parent); 2254 slot = path->slots[level + 1]; 2255 | 2243 2244 parent = path->nodes[level + 1]; 2245 if (!parent) 2246 return; 2247 2248 nritems = btrfs_header_nritems(parent); 2249 slot = path->slots[level + 1]; 2250 |
2256 if (slot > 0) { 2257 block1 = btrfs_node_blockptr(parent, slot - 1); 2258 gen = btrfs_node_ptr_generation(parent, slot - 1); 2259 eb = find_extent_buffer(fs_info, block1); 2260 /* 2261 * if we get -eagain from btrfs_buffer_uptodate, we 2262 * don't want to return eagain here. That will loop 2263 * forever 2264 */ 2265 if (eb && btrfs_buffer_uptodate(eb, gen, 1) != 0) 2266 block1 = 0; 2267 free_extent_buffer(eb); 2268 } 2269 if (slot + 1 < nritems) { 2270 block2 = btrfs_node_blockptr(parent, slot + 1); 2271 gen = btrfs_node_ptr_generation(parent, slot + 1); 2272 eb = find_extent_buffer(fs_info, block2); 2273 if (eb && btrfs_buffer_uptodate(eb, gen, 1) != 0) 2274 block2 = 0; 2275 free_extent_buffer(eb); 2276 } 2277 2278 if (block1) 2279 readahead_tree_block(fs_info, block1); 2280 if (block2) 2281 readahead_tree_block(fs_info, block2); | 2251 if (slot > 0) 2252 btrfs_readahead_node_child(parent, slot - 1); 2253 if (slot + 1 < nritems) 2254 btrfs_readahead_node_child(parent, slot + 1); |
2282} 2283 2284 2285/* 2286 * when we walk down the tree, it is usually safe to unlock the higher layers 2287 * in the tree. The exceptions are when our path goes through slot 0, because 2288 * operations on the tree might require changing key pointers higher up in the 2289 * tree. --- 159 unchanged lines hidden (view full) --- 2449 int sret; 2450 2451 if (*write_lock_level < level + 1) { 2452 *write_lock_level = level + 1; 2453 btrfs_release_path(p); 2454 goto again; 2455 } 2456 | 2255} 2256 2257 2258/* 2259 * when we walk down the tree, it is usually safe to unlock the higher layers 2260 * in the tree. The exceptions are when our path goes through slot 0, because 2261 * operations on the tree might require changing key pointers higher up in the 2262 * tree. --- 159 unchanged lines hidden (view full) --- 2422 int sret; 2423 2424 if (*write_lock_level < level + 1) { 2425 *write_lock_level = level + 1; 2426 btrfs_release_path(p); 2427 goto again; 2428 } 2429 |
2457 reada_for_balance(fs_info, p, level); | 2430 reada_for_balance(p, level); |
2458 sret = split_node(trans, root, p, level); 2459 2460 BUG_ON(sret > 0); 2461 if (sret) { 2462 ret = sret; 2463 goto done; 2464 } 2465 b = p->nodes[level]; 2466 } else if (ins_len < 0 && btrfs_header_nritems(b) < 2467 BTRFS_NODEPTRS_PER_BLOCK(fs_info) / 2) { 2468 int sret; 2469 2470 if (*write_lock_level < level + 1) { 2471 *write_lock_level = level + 1; 2472 btrfs_release_path(p); 2473 goto again; 2474 } 2475 | 2431 sret = split_node(trans, root, p, level); 2432 2433 BUG_ON(sret > 0); 2434 if (sret) { 2435 ret = sret; 2436 goto done; 2437 } 2438 b = p->nodes[level]; 2439 } else if (ins_len < 0 && btrfs_header_nritems(b) < 2440 BTRFS_NODEPTRS_PER_BLOCK(fs_info) / 2) { 2441 int sret; 2442 2443 if (*write_lock_level < level + 1) { 2444 *write_lock_level = level + 1; 2445 btrfs_release_path(p); 2446 goto again; 2447 } 2448 |
2476 reada_for_balance(fs_info, p, level); | 2449 reada_for_balance(p, level); |
2477 sret = balance_level(trans, root, p, level); 2478 2479 if (sret) { 2480 ret = sret; 2481 goto done; 2482 } 2483 b = p->nodes[level]; 2484 if (!b) { --- 3080 unchanged lines hidden --- | 2450 sret = balance_level(trans, root, p, level); 2451 2452 if (sret) { 2453 ret = sret; 2454 goto done; 2455 } 2456 b = p->nodes[level]; 2457 if (!b) { --- 3080 unchanged lines hidden --- |