blob: 49e2bbda2d7ec6ecb2144fa9419644ef752b2062 [file] [log] [blame]
David Sterbac1d7c512018-04-03 19:23:33 +02001// SPDX-License-Identifier: GPL-2.0
Chris Mason6cbd5572007-06-12 09:07:21 -04002/*
Chris Masond352ac62008-09-29 15:18:18 -04003 * Copyright (C) 2007,2008 Oracle. All rights reserved.
Chris Mason6cbd5572007-06-12 09:07:21 -04004 */
5
Chris Masona6b6e752007-10-15 16:22:39 -04006#include <linux/sched.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +09007#include <linux/slab.h>
Jan Schmidtbd989ba2012-05-16 17:18:50 +02008#include <linux/rbtree.h>
David Sterbaadf02122017-05-31 19:44:31 +02009#include <linux/mm.h>
Chris Masoneb60cea2007-02-02 09:18:22 -050010#include "ctree.h"
11#include "disk-io.h"
Chris Mason7f5c1512007-03-23 15:56:19 -040012#include "transaction.h"
Chris Mason5f39d392007-10-15 16:14:19 -040013#include "print-tree.h"
Chris Mason925baed2008-06-25 16:01:30 -040014#include "locking.h"
Nikolay Borisovde37aa52018-10-30 16:43:24 +020015#include "volumes.h"
Qu Wenruof616f5c2019-01-23 15:15:17 +080016#include "qgroup.h"
Filipe Mananaf3a84cc2021-03-11 14:31:07 +000017#include "tree-mod-log.h"
Chris Mason9a8dd152007-02-23 08:38:36 -050018
Chris Masone089f052007-03-16 16:20:31 -040019static int split_node(struct btrfs_trans_handle *trans, struct btrfs_root
20 *root, struct btrfs_path *path, int level);
Omar Sandoval310712b2017-01-17 23:24:37 -080021static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root *root,
22 const struct btrfs_key *ins_key, struct btrfs_path *path,
23 int data_size, int extend);
Chris Mason5f39d392007-10-15 16:14:19 -040024static int push_node_left(struct btrfs_trans_handle *trans,
Jeff Mahoney2ff7e612016-06-22 18:54:24 -040025 struct extent_buffer *dst,
Chris Mason971a1f62008-04-24 10:54:32 -040026 struct extent_buffer *src, int empty);
Chris Mason5f39d392007-10-15 16:14:19 -040027static int balance_node_right(struct btrfs_trans_handle *trans,
Chris Mason5f39d392007-10-15 16:14:19 -040028 struct extent_buffer *dst_buf,
29 struct extent_buffer *src_buf);
Tsutomu Itohafe5fea2013-04-16 05:18:22 +000030static void del_ptr(struct btrfs_root *root, struct btrfs_path *path,
31 int level, int slot);
Chris Masond97e63b2007-02-20 16:40:44 -050032
Johannes Thumshirnaf024ed2019-08-30 13:36:09 +020033static const struct btrfs_csums {
34 u16 size;
David Sterba59a0fcd2020-02-27 21:00:45 +010035 const char name[10];
36 const char driver[12];
Johannes Thumshirnaf024ed2019-08-30 13:36:09 +020037} btrfs_csums[] = {
38 [BTRFS_CSUM_TYPE_CRC32] = { .size = 4, .name = "crc32c" },
Johannes Thumshirn3951e7f2019-10-07 11:11:01 +020039 [BTRFS_CSUM_TYPE_XXHASH] = { .size = 8, .name = "xxhash64" },
Johannes Thumshirn3831bf02019-10-07 11:11:02 +020040 [BTRFS_CSUM_TYPE_SHA256] = { .size = 32, .name = "sha256" },
David Sterba352ae072019-10-07 11:11:02 +020041 [BTRFS_CSUM_TYPE_BLAKE2] = { .size = 32, .name = "blake2b",
42 .driver = "blake2b-256" },
Johannes Thumshirnaf024ed2019-08-30 13:36:09 +020043};
44
45int btrfs_super_csum_size(const struct btrfs_super_block *s)
46{
47 u16 t = btrfs_super_csum_type(s);
48 /*
49 * csum type is validated at mount time
50 */
51 return btrfs_csums[t].size;
52}
53
54const char *btrfs_super_csum_name(u16 csum_type)
55{
56 /* csum type is validated at mount time */
57 return btrfs_csums[csum_type].name;
58}
59
David Sterbab4e967b2019-10-08 18:41:33 +020060/*
61 * Return driver name if defined, otherwise the name that's also a valid driver
62 * name
63 */
64const char *btrfs_super_csum_driver(u16 csum_type)
65{
66 /* csum type is validated at mount time */
David Sterba59a0fcd2020-02-27 21:00:45 +010067 return btrfs_csums[csum_type].driver[0] ?
68 btrfs_csums[csum_type].driver :
David Sterbab4e967b2019-10-08 18:41:33 +020069 btrfs_csums[csum_type].name;
70}
71
David Sterba604997b2020-07-27 17:38:19 +020072size_t __attribute_const__ btrfs_get_num_csums(void)
David Sterbaf7cea562019-10-07 11:11:03 +020073{
74 return ARRAY_SIZE(btrfs_csums);
75}
76
Chris Mason2c90e5d2007-04-02 10:50:19 -040077struct btrfs_path *btrfs_alloc_path(void)
78{
Masahiro Yamadae2c89902016-09-13 04:35:52 +090079 return kmem_cache_zalloc(btrfs_path_cachep, GFP_NOFS);
Chris Mason2c90e5d2007-04-02 10:50:19 -040080}
81
Chris Masond352ac62008-09-29 15:18:18 -040082/* this also releases the path */
Chris Mason2c90e5d2007-04-02 10:50:19 -040083void btrfs_free_path(struct btrfs_path *p)
84{
Jesper Juhlff175d52010-12-25 21:22:30 +000085 if (!p)
86 return;
David Sterbab3b4aa72011-04-21 01:20:15 +020087 btrfs_release_path(p);
Chris Mason2c90e5d2007-04-02 10:50:19 -040088 kmem_cache_free(btrfs_path_cachep, p);
89}
90
Chris Masond352ac62008-09-29 15:18:18 -040091/*
92 * path release drops references on the extent buffers in the path
93 * and it drops any locks held by this path
94 *
95 * It is safe to call this on paths that no locks or extent buffers held.
96 */
David Sterbab3b4aa72011-04-21 01:20:15 +020097noinline void btrfs_release_path(struct btrfs_path *p)
Chris Masoneb60cea2007-02-02 09:18:22 -050098{
99 int i;
Chris Masona2135012008-06-25 16:01:30 -0400100
Chris Mason234b63a2007-03-13 10:46:10 -0400101 for (i = 0; i < BTRFS_MAX_LEVEL; i++) {
Chris Mason3f157a22008-06-25 16:01:31 -0400102 p->slots[i] = 0;
Chris Masoneb60cea2007-02-02 09:18:22 -0500103 if (!p->nodes[i])
Chris Mason925baed2008-06-25 16:01:30 -0400104 continue;
105 if (p->locks[i]) {
Chris Masonbd681512011-07-16 15:23:14 -0400106 btrfs_tree_unlock_rw(p->nodes[i], p->locks[i]);
Chris Mason925baed2008-06-25 16:01:30 -0400107 p->locks[i] = 0;
108 }
Chris Mason5f39d392007-10-15 16:14:19 -0400109 free_extent_buffer(p->nodes[i]);
Chris Mason3f157a22008-06-25 16:01:31 -0400110 p->nodes[i] = NULL;
Chris Masoneb60cea2007-02-02 09:18:22 -0500111 }
112}
113
Chris Masond352ac62008-09-29 15:18:18 -0400114/*
115 * safely gets a reference on the root node of a tree. A lock
116 * is not taken, so a concurrent writer may put a different node
117 * at the root of the tree. See btrfs_lock_root_node for the
118 * looping required.
119 *
120 * The extent buffer returned by this has a reference taken, so
121 * it won't disappear. It may stop being the root of the tree
122 * at any time because there are no locks held.
123 */
Chris Mason925baed2008-06-25 16:01:30 -0400124struct extent_buffer *btrfs_root_node(struct btrfs_root *root)
125{
126 struct extent_buffer *eb;
Chris Mason240f62c2011-03-23 14:54:42 -0400127
Josef Bacik3083ee22012-03-09 16:01:49 -0500128 while (1) {
129 rcu_read_lock();
130 eb = rcu_dereference(root->node);
131
132 /*
133 * RCU really hurts here, we could free up the root node because
Nicholas D Steeves01327612016-05-19 21:18:45 -0400134 * it was COWed but we may not get the new root node yet so do
Josef Bacik3083ee22012-03-09 16:01:49 -0500135 * the inc_not_zero dance and if it doesn't work then
136 * synchronize_rcu and try again.
137 */
138 if (atomic_inc_not_zero(&eb->refs)) {
139 rcu_read_unlock();
140 break;
141 }
142 rcu_read_unlock();
143 synchronize_rcu();
144 }
Chris Mason925baed2008-06-25 16:01:30 -0400145 return eb;
146}
147
Qu Wenruo92a7cc42020-05-15 14:01:40 +0800148/*
149 * Cowonly root (not-shareable trees, everything not subvolume or reloc roots),
150 * just get put onto a simple dirty list. Transaction walks this list to make
151 * sure they get properly updated on disk.
Chris Masond352ac62008-09-29 15:18:18 -0400152 */
Chris Mason0b86a832008-03-24 15:01:56 -0400153static void add_root_to_dirty_list(struct btrfs_root *root)
154{
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400155 struct btrfs_fs_info *fs_info = root->fs_info;
156
Josef Bacike7070be2014-12-16 08:54:43 -0800157 if (test_bit(BTRFS_ROOT_DIRTY, &root->state) ||
158 !test_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state))
159 return;
160
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400161 spin_lock(&fs_info->trans_lock);
Josef Bacike7070be2014-12-16 08:54:43 -0800162 if (!test_and_set_bit(BTRFS_ROOT_DIRTY, &root->state)) {
163 /* Want the extent tree to be the last on the list */
Misono Tomohiro4fd786e2018-08-06 14:25:24 +0900164 if (root->root_key.objectid == BTRFS_EXTENT_TREE_OBJECTID)
Josef Bacike7070be2014-12-16 08:54:43 -0800165 list_move_tail(&root->dirty_list,
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400166 &fs_info->dirty_cowonly_roots);
Josef Bacike7070be2014-12-16 08:54:43 -0800167 else
168 list_move(&root->dirty_list,
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400169 &fs_info->dirty_cowonly_roots);
Chris Mason0b86a832008-03-24 15:01:56 -0400170 }
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400171 spin_unlock(&fs_info->trans_lock);
Chris Mason0b86a832008-03-24 15:01:56 -0400172}
173
Chris Masond352ac62008-09-29 15:18:18 -0400174/*
175 * used by snapshot creation to make a copy of a root for a tree with
176 * a given objectid. The buffer with the new root node is returned in
177 * cow_ret, and this func returns zero on success or a negative error code.
178 */
Chris Masonbe20aa92007-12-17 20:14:01 -0500179int btrfs_copy_root(struct btrfs_trans_handle *trans,
180 struct btrfs_root *root,
181 struct extent_buffer *buf,
182 struct extent_buffer **cow_ret, u64 new_root_objectid)
183{
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400184 struct btrfs_fs_info *fs_info = root->fs_info;
Chris Masonbe20aa92007-12-17 20:14:01 -0500185 struct extent_buffer *cow;
Chris Masonbe20aa92007-12-17 20:14:01 -0500186 int ret = 0;
187 int level;
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400188 struct btrfs_disk_key disk_key;
Chris Masonbe20aa92007-12-17 20:14:01 -0500189
Qu Wenruo92a7cc42020-05-15 14:01:40 +0800190 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) &&
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400191 trans->transid != fs_info->running_transaction->transid);
Qu Wenruo92a7cc42020-05-15 14:01:40 +0800192 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) &&
Miao Xie27cdeb72014-04-02 19:51:05 +0800193 trans->transid != root->last_trans);
Chris Masonbe20aa92007-12-17 20:14:01 -0500194
195 level = btrfs_header_level(buf);
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400196 if (level == 0)
197 btrfs_item_key(buf, &disk_key, 0);
198 else
199 btrfs_node_key(buf, &disk_key, 0);
Zheng Yan31840ae2008-09-23 13:14:14 -0400200
David Sterba4d75f8a2014-06-15 01:54:12 +0200201 cow = btrfs_alloc_tree_block(trans, root, 0, new_root_objectid,
Josef Bacikcf6f34a2020-08-20 11:46:07 -0400202 &disk_key, level, buf->start, 0,
203 BTRFS_NESTING_NEW_ROOT);
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400204 if (IS_ERR(cow))
Chris Masonbe20aa92007-12-17 20:14:01 -0500205 return PTR_ERR(cow);
206
David Sterba58e80122016-11-08 18:30:31 +0100207 copy_extent_buffer_full(cow, buf);
Chris Masonbe20aa92007-12-17 20:14:01 -0500208 btrfs_set_header_bytenr(cow, cow->start);
209 btrfs_set_header_generation(cow, trans->transid);
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400210 btrfs_set_header_backref_rev(cow, BTRFS_MIXED_BACKREF_REV);
211 btrfs_clear_header_flag(cow, BTRFS_HEADER_FLAG_WRITTEN |
212 BTRFS_HEADER_FLAG_RELOC);
213 if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID)
214 btrfs_set_header_flag(cow, BTRFS_HEADER_FLAG_RELOC);
215 else
216 btrfs_set_header_owner(cow, new_root_objectid);
Chris Masonbe20aa92007-12-17 20:14:01 -0500217
Nikolay Borisovde37aa52018-10-30 16:43:24 +0200218 write_extent_buffer_fsid(cow, fs_info->fs_devices->metadata_uuid);
Yan Zheng2b820322008-11-17 21:11:30 -0500219
Chris Masonbe20aa92007-12-17 20:14:01 -0500220 WARN_ON(btrfs_header_generation(buf) > trans->transid);
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400221 if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID)
Josef Bacike339a6b2014-07-02 10:54:25 -0700222 ret = btrfs_inc_ref(trans, root, cow, 1);
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400223 else
Josef Bacike339a6b2014-07-02 10:54:25 -0700224 ret = btrfs_inc_ref(trans, root, cow, 0);
Josef Bacik867ed322021-01-14 14:02:46 -0500225 if (ret) {
Filipe Manana72c99252021-02-04 14:35:44 +0000226 btrfs_tree_unlock(cow);
227 free_extent_buffer(cow);
Josef Bacik867ed322021-01-14 14:02:46 -0500228 btrfs_abort_transaction(trans, ret);
Chris Masonbe20aa92007-12-17 20:14:01 -0500229 return ret;
Josef Bacik867ed322021-01-14 14:02:46 -0500230 }
Chris Masonbe20aa92007-12-17 20:14:01 -0500231
232 btrfs_mark_buffer_dirty(cow);
233 *cow_ret = cow;
234 return 0;
235}
236
Chris Masond352ac62008-09-29 15:18:18 -0400237/*
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400238 * check if the tree block can be shared by multiple trees
239 */
240int btrfs_block_can_be_shared(struct btrfs_root *root,
241 struct extent_buffer *buf)
242{
243 /*
Qu Wenruo92a7cc42020-05-15 14:01:40 +0800244 * Tree blocks not in shareable trees and tree roots are never shared.
245 * If a block was allocated after the last snapshot and the block was
246 * not allocated by tree relocation, we know the block is not shared.
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400247 */
Qu Wenruo92a7cc42020-05-15 14:01:40 +0800248 if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state) &&
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400249 buf != root->node && buf != root->commit_root &&
250 (btrfs_header_generation(buf) <=
251 btrfs_root_last_snapshot(&root->root_item) ||
252 btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC)))
253 return 1;
Nikolay Borisova79865c2018-06-21 09:45:00 +0300254
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400255 return 0;
256}
257
258static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,
259 struct btrfs_root *root,
260 struct extent_buffer *buf,
Yan, Zhengf0486c62010-05-16 10:46:25 -0400261 struct extent_buffer *cow,
262 int *last_ref)
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400263{
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400264 struct btrfs_fs_info *fs_info = root->fs_info;
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400265 u64 refs;
266 u64 owner;
267 u64 flags;
268 u64 new_flags = 0;
269 int ret;
270
271 /*
272 * Backrefs update rules:
273 *
274 * Always use full backrefs for extent pointers in tree block
275 * allocated by tree relocation.
276 *
277 * If a shared tree block is no longer referenced by its owner
278 * tree (btrfs_header_owner(buf) == root->root_key.objectid),
279 * use full backrefs for extent pointers in tree block.
280 *
281 * If a tree block is been relocating
282 * (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID),
283 * use full backrefs for extent pointers in tree block.
284 * The reason for this is some operations (such as drop tree)
285 * are only allowed for blocks use full backrefs.
286 */
287
288 if (btrfs_block_can_be_shared(root, buf)) {
Jeff Mahoney2ff7e612016-06-22 18:54:24 -0400289 ret = btrfs_lookup_extent_info(trans, fs_info, buf->start,
Josef Bacik3173a182013-03-07 14:22:04 -0500290 btrfs_header_level(buf), 1,
291 &refs, &flags);
Mark Fashehbe1a5562011-08-08 13:20:18 -0700292 if (ret)
293 return ret;
Mark Fashehe5df9572011-08-29 14:17:04 -0700294 if (refs == 0) {
295 ret = -EROFS;
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400296 btrfs_handle_fs_error(fs_info, ret, NULL);
Mark Fashehe5df9572011-08-29 14:17:04 -0700297 return ret;
298 }
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400299 } else {
300 refs = 1;
301 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID ||
302 btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
303 flags = BTRFS_BLOCK_FLAG_FULL_BACKREF;
304 else
305 flags = 0;
306 }
307
308 owner = btrfs_header_owner(buf);
309 BUG_ON(owner == BTRFS_TREE_RELOC_OBJECTID &&
310 !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF));
311
312 if (refs > 1) {
313 if ((owner == root->root_key.objectid ||
314 root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) &&
315 !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) {
Josef Bacike339a6b2014-07-02 10:54:25 -0700316 ret = btrfs_inc_ref(trans, root, buf, 1);
Jeff Mahoney692826b2017-11-21 13:58:49 -0500317 if (ret)
318 return ret;
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400319
320 if (root->root_key.objectid ==
321 BTRFS_TREE_RELOC_OBJECTID) {
Josef Bacike339a6b2014-07-02 10:54:25 -0700322 ret = btrfs_dec_ref(trans, root, buf, 0);
Jeff Mahoney692826b2017-11-21 13:58:49 -0500323 if (ret)
324 return ret;
Josef Bacike339a6b2014-07-02 10:54:25 -0700325 ret = btrfs_inc_ref(trans, root, cow, 1);
Jeff Mahoney692826b2017-11-21 13:58:49 -0500326 if (ret)
327 return ret;
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400328 }
329 new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
330 } else {
331
332 if (root->root_key.objectid ==
333 BTRFS_TREE_RELOC_OBJECTID)
Josef Bacike339a6b2014-07-02 10:54:25 -0700334 ret = btrfs_inc_ref(trans, root, cow, 1);
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400335 else
Josef Bacike339a6b2014-07-02 10:54:25 -0700336 ret = btrfs_inc_ref(trans, root, cow, 0);
Jeff Mahoney692826b2017-11-21 13:58:49 -0500337 if (ret)
338 return ret;
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400339 }
340 if (new_flags != 0) {
Josef Bacikb1c79e02013-05-09 13:49:30 -0400341 int level = btrfs_header_level(buf);
342
David Sterba42c9d0b2019-03-20 11:54:13 +0100343 ret = btrfs_set_disk_extent_flags(trans, buf,
Josef Bacikb1c79e02013-05-09 13:49:30 -0400344 new_flags, level, 0);
Mark Fashehbe1a5562011-08-08 13:20:18 -0700345 if (ret)
346 return ret;
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400347 }
348 } else {
349 if (flags & BTRFS_BLOCK_FLAG_FULL_BACKREF) {
350 if (root->root_key.objectid ==
351 BTRFS_TREE_RELOC_OBJECTID)
Josef Bacike339a6b2014-07-02 10:54:25 -0700352 ret = btrfs_inc_ref(trans, root, cow, 1);
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400353 else
Josef Bacike339a6b2014-07-02 10:54:25 -0700354 ret = btrfs_inc_ref(trans, root, cow, 0);
Jeff Mahoney692826b2017-11-21 13:58:49 -0500355 if (ret)
356 return ret;
Josef Bacike339a6b2014-07-02 10:54:25 -0700357 ret = btrfs_dec_ref(trans, root, buf, 1);
Jeff Mahoney692826b2017-11-21 13:58:49 -0500358 if (ret)
359 return ret;
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400360 }
David Sterba6a884d7d2019-03-20 14:30:02 +0100361 btrfs_clean_tree_block(buf);
Yan, Zhengf0486c62010-05-16 10:46:25 -0400362 *last_ref = 1;
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400363 }
364 return 0;
365}
366
367/*
Chris Masond3977122009-01-05 21:25:51 -0500368 * does the dirty work in cow of a single block. The parent block (if
369 * supplied) is updated to point to the new cow copy. The new buffer is marked
370 * dirty and returned locked. If you modify the block it needs to be marked
371 * dirty again.
Chris Masond352ac62008-09-29 15:18:18 -0400372 *
373 * search_start -- an allocation hint for the new block
374 *
Chris Masond3977122009-01-05 21:25:51 -0500375 * empty_size -- a hint that you plan on doing more cow. This is the size in
376 * bytes the allocator should try to find free next to the block it returns.
377 * This is just a hint and may be ignored by the allocator.
Chris Masond352ac62008-09-29 15:18:18 -0400378 */
Chris Masond3977122009-01-05 21:25:51 -0500379static noinline int __btrfs_cow_block(struct btrfs_trans_handle *trans,
Chris Mason5f39d392007-10-15 16:14:19 -0400380 struct btrfs_root *root,
381 struct extent_buffer *buf,
382 struct extent_buffer *parent, int parent_slot,
383 struct extent_buffer **cow_ret,
Josef Bacik9631e4c2020-08-20 11:46:03 -0400384 u64 search_start, u64 empty_size,
385 enum btrfs_lock_nesting nest)
Chris Mason6702ed42007-08-07 16:15:09 -0400386{
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400387 struct btrfs_fs_info *fs_info = root->fs_info;
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400388 struct btrfs_disk_key disk_key;
Chris Mason5f39d392007-10-15 16:14:19 -0400389 struct extent_buffer *cow;
Mark Fashehbe1a5562011-08-08 13:20:18 -0700390 int level, ret;
Yan, Zhengf0486c62010-05-16 10:46:25 -0400391 int last_ref = 0;
Chris Mason925baed2008-06-25 16:01:30 -0400392 int unlock_orig = 0;
Goldwyn Rodrigues0f5053e2016-09-22 14:11:34 -0500393 u64 parent_start = 0;
Chris Mason6702ed42007-08-07 16:15:09 -0400394
Chris Mason925baed2008-06-25 16:01:30 -0400395 if (*cow_ret == buf)
396 unlock_orig = 1;
397
Filipe Manana49d0c642021-09-22 10:36:45 +0100398 btrfs_assert_tree_write_locked(buf);
Chris Mason925baed2008-06-25 16:01:30 -0400399
Qu Wenruo92a7cc42020-05-15 14:01:40 +0800400 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) &&
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400401 trans->transid != fs_info->running_transaction->transid);
Qu Wenruo92a7cc42020-05-15 14:01:40 +0800402 WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) &&
Miao Xie27cdeb72014-04-02 19:51:05 +0800403 trans->transid != root->last_trans);
Chris Mason5f39d392007-10-15 16:14:19 -0400404
Chris Mason7bb86312007-12-11 09:25:06 -0500405 level = btrfs_header_level(buf);
Zheng Yan31840ae2008-09-23 13:14:14 -0400406
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400407 if (level == 0)
408 btrfs_item_key(buf, &disk_key, 0);
409 else
410 btrfs_node_key(buf, &disk_key, 0);
411
Goldwyn Rodrigues0f5053e2016-09-22 14:11:34 -0500412 if ((root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && parent)
413 parent_start = parent->start;
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400414
Filipe Manana79bd3712021-06-29 14:43:06 +0100415 cow = btrfs_alloc_tree_block(trans, root, parent_start,
416 root->root_key.objectid, &disk_key, level,
417 search_start, empty_size, nest);
Chris Mason6702ed42007-08-07 16:15:09 -0400418 if (IS_ERR(cow))
419 return PTR_ERR(cow);
420
Chris Masonb4ce94d2009-02-04 09:25:08 -0500421 /* cow is set to blocking by btrfs_init_new_buffer */
422
David Sterba58e80122016-11-08 18:30:31 +0100423 copy_extent_buffer_full(cow, buf);
Chris Masondb945352007-10-15 16:15:53 -0400424 btrfs_set_header_bytenr(cow, cow->start);
Chris Mason5f39d392007-10-15 16:14:19 -0400425 btrfs_set_header_generation(cow, trans->transid);
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400426 btrfs_set_header_backref_rev(cow, BTRFS_MIXED_BACKREF_REV);
427 btrfs_clear_header_flag(cow, BTRFS_HEADER_FLAG_WRITTEN |
428 BTRFS_HEADER_FLAG_RELOC);
429 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID)
430 btrfs_set_header_flag(cow, BTRFS_HEADER_FLAG_RELOC);
431 else
432 btrfs_set_header_owner(cow, root->root_key.objectid);
Chris Mason6702ed42007-08-07 16:15:09 -0400433
Nikolay Borisovde37aa52018-10-30 16:43:24 +0200434 write_extent_buffer_fsid(cow, fs_info->fs_devices->metadata_uuid);
Yan Zheng2b820322008-11-17 21:11:30 -0500435
Mark Fashehbe1a5562011-08-08 13:20:18 -0700436 ret = update_ref_for_cow(trans, root, buf, cow, &last_ref);
Mark Fashehb68dc2a2011-08-29 14:30:39 -0700437 if (ret) {
Josef Bacik572c83a2020-09-29 08:53:54 -0400438 btrfs_tree_unlock(cow);
439 free_extent_buffer(cow);
Jeff Mahoney66642832016-06-10 18:19:25 -0400440 btrfs_abort_transaction(trans, ret);
Mark Fashehb68dc2a2011-08-29 14:30:39 -0700441 return ret;
442 }
Zheng Yan1a40e232008-09-26 10:09:34 -0400443
Qu Wenruo92a7cc42020-05-15 14:01:40 +0800444 if (test_bit(BTRFS_ROOT_SHAREABLE, &root->state)) {
Josef Bacik83d4cfd2013-08-30 15:09:51 -0400445 ret = btrfs_reloc_cow_block(trans, root, buf, cow);
Zhaolei93314e32015-08-06 21:56:58 +0800446 if (ret) {
Josef Bacik572c83a2020-09-29 08:53:54 -0400447 btrfs_tree_unlock(cow);
448 free_extent_buffer(cow);
Jeff Mahoney66642832016-06-10 18:19:25 -0400449 btrfs_abort_transaction(trans, ret);
Josef Bacik83d4cfd2013-08-30 15:09:51 -0400450 return ret;
Zhaolei93314e32015-08-06 21:56:58 +0800451 }
Josef Bacik83d4cfd2013-08-30 15:09:51 -0400452 }
Yan, Zheng3fd0a552010-05-16 10:49:59 -0400453
Chris Mason6702ed42007-08-07 16:15:09 -0400454 if (buf == root->node) {
Chris Mason925baed2008-06-25 16:01:30 -0400455 WARN_ON(parent && parent != buf);
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400456 if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID ||
457 btrfs_header_backref_rev(buf) < BTRFS_MIXED_BACKREF_REV)
458 parent_start = buf->start;
Chris Mason925baed2008-06-25 16:01:30 -0400459
David Sterba67439da2019-10-08 13:28:47 +0200460 atomic_inc(&cow->refs);
Filipe Manana406808a2021-03-11 14:31:08 +0000461 ret = btrfs_tree_mod_log_insert_root(root->node, cow, true);
David Sterbad9d19a02018-03-05 16:35:29 +0100462 BUG_ON(ret < 0);
Chris Mason240f62c2011-03-23 14:54:42 -0400463 rcu_assign_pointer(root->node, cow);
Chris Mason925baed2008-06-25 16:01:30 -0400464
Yan, Zhengf0486c62010-05-16 10:46:25 -0400465 btrfs_free_tree_block(trans, root, buf, parent_start,
Jan Schmidt5581a512012-05-16 17:04:52 +0200466 last_ref);
Chris Mason5f39d392007-10-15 16:14:19 -0400467 free_extent_buffer(buf);
Chris Mason0b86a832008-03-24 15:01:56 -0400468 add_root_to_dirty_list(root);
Chris Mason6702ed42007-08-07 16:15:09 -0400469 } else {
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400470 WARN_ON(trans->transid != btrfs_header_generation(parent));
Filipe Mananaf3a84cc2021-03-11 14:31:07 +0000471 btrfs_tree_mod_log_insert_key(parent, parent_slot,
472 BTRFS_MOD_LOG_KEY_REPLACE, GFP_NOFS);
Chris Mason5f39d392007-10-15 16:14:19 -0400473 btrfs_set_node_blockptr(parent, parent_slot,
Chris Masondb945352007-10-15 16:15:53 -0400474 cow->start);
Chris Mason74493f72007-12-11 09:25:06 -0500475 btrfs_set_node_ptr_generation(parent, parent_slot,
476 trans->transid);
Chris Mason6702ed42007-08-07 16:15:09 -0400477 btrfs_mark_buffer_dirty(parent);
Filipe David Borba Manana5de865e2013-12-20 15:17:46 +0000478 if (last_ref) {
Filipe Mananaf3a84cc2021-03-11 14:31:07 +0000479 ret = btrfs_tree_mod_log_free_eb(buf);
Filipe David Borba Manana5de865e2013-12-20 15:17:46 +0000480 if (ret) {
Josef Bacik572c83a2020-09-29 08:53:54 -0400481 btrfs_tree_unlock(cow);
482 free_extent_buffer(cow);
Jeff Mahoney66642832016-06-10 18:19:25 -0400483 btrfs_abort_transaction(trans, ret);
Filipe David Borba Manana5de865e2013-12-20 15:17:46 +0000484 return ret;
485 }
486 }
Yan, Zhengf0486c62010-05-16 10:46:25 -0400487 btrfs_free_tree_block(trans, root, buf, parent_start,
Jan Schmidt5581a512012-05-16 17:04:52 +0200488 last_ref);
Chris Mason6702ed42007-08-07 16:15:09 -0400489 }
Chris Mason925baed2008-06-25 16:01:30 -0400490 if (unlock_orig)
491 btrfs_tree_unlock(buf);
Josef Bacik3083ee22012-03-09 16:01:49 -0500492 free_extent_buffer_stale(buf);
Chris Mason6702ed42007-08-07 16:15:09 -0400493 btrfs_mark_buffer_dirty(cow);
494 *cow_ret = cow;
495 return 0;
496}
497
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400498static inline int should_cow_block(struct btrfs_trans_handle *trans,
499 struct btrfs_root *root,
500 struct extent_buffer *buf)
501{
Jeff Mahoneyf5ee5c92016-06-21 09:52:41 -0400502 if (btrfs_is_testing(root->fs_info))
Josef Bacikfaa2dbf2014-05-07 17:06:09 -0400503 return 0;
David Sterbafccb84c2014-09-29 23:53:21 +0200504
David Sterbad1980132018-03-16 02:39:40 +0100505 /* Ensure we can see the FORCE_COW bit */
506 smp_mb__before_atomic();
Liu Bof1ebcc72011-11-14 20:48:06 -0500507
508 /*
509 * We do not need to cow a block if
510 * 1) this block is not created or changed in this transaction;
511 * 2) this block does not belong to TREE_RELOC tree;
512 * 3) the root is not forced COW.
513 *
514 * What is forced COW:
Nicholas D Steeves01327612016-05-19 21:18:45 -0400515 * when we create snapshot during committing the transaction,
Andrea Gelmini52042d82018-11-28 12:05:13 +0100516 * after we've finished copying src root, we must COW the shared
Liu Bof1ebcc72011-11-14 20:48:06 -0500517 * block to ensure the metadata consistency.
518 */
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400519 if (btrfs_header_generation(buf) == trans->transid &&
520 !btrfs_header_flag(buf, BTRFS_HEADER_FLAG_WRITTEN) &&
521 !(root->root_key.objectid != BTRFS_TREE_RELOC_OBJECTID &&
Liu Bof1ebcc72011-11-14 20:48:06 -0500522 btrfs_header_flag(buf, BTRFS_HEADER_FLAG_RELOC)) &&
Miao Xie27cdeb72014-04-02 19:51:05 +0800523 !test_bit(BTRFS_ROOT_FORCE_COW, &root->state))
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400524 return 0;
525 return 1;
526}
527
Chris Masond352ac62008-09-29 15:18:18 -0400528/*
529 * cows a single block, see __btrfs_cow_block for the real work.
Nicholas D Steeves01327612016-05-19 21:18:45 -0400530 * This version of it has extra checks so that a block isn't COWed more than
Chris Masond352ac62008-09-29 15:18:18 -0400531 * once per transaction, as long as it hasn't been written yet
532 */
Chris Masond3977122009-01-05 21:25:51 -0500533noinline int btrfs_cow_block(struct btrfs_trans_handle *trans,
Chris Mason5f39d392007-10-15 16:14:19 -0400534 struct btrfs_root *root, struct extent_buffer *buf,
535 struct extent_buffer *parent, int parent_slot,
Josef Bacik9631e4c2020-08-20 11:46:03 -0400536 struct extent_buffer **cow_ret,
537 enum btrfs_lock_nesting nest)
Chris Mason02217ed2007-03-02 16:08:05 -0500538{
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400539 struct btrfs_fs_info *fs_info = root->fs_info;
Chris Mason6702ed42007-08-07 16:15:09 -0400540 u64 search_start;
Chris Masonf510cfe2007-10-15 16:14:48 -0400541 int ret;
Chris Masondc17ff82008-01-08 15:46:30 -0500542
Josef Bacik83354f02018-11-30 11:52:13 -0500543 if (test_bit(BTRFS_ROOT_DELETING, &root->state))
544 btrfs_err(fs_info,
545 "COW'ing blocks on a fs root that's being dropped");
546
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400547 if (trans->transaction != fs_info->running_transaction)
Julia Lawall31b1a2b2012-11-03 10:58:34 +0000548 WARN(1, KERN_CRIT "trans %llu running %llu\n",
Geert Uytterhoevenc1c9ff72013-08-20 13:20:07 +0200549 trans->transid,
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400550 fs_info->running_transaction->transid);
Julia Lawall31b1a2b2012-11-03 10:58:34 +0000551
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400552 if (trans->transid != fs_info->generation)
Julia Lawall31b1a2b2012-11-03 10:58:34 +0000553 WARN(1, KERN_CRIT "trans %llu running %llu\n",
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400554 trans->transid, fs_info->generation);
Chris Masondc17ff82008-01-08 15:46:30 -0500555
Yan Zheng5d4f98a2009-06-10 10:45:14 -0400556 if (!should_cow_block(trans, root, buf)) {
Chris Mason02217ed2007-03-02 16:08:05 -0500557 *cow_ret = buf;
558 return 0;
559 }
Chris Masonc4876852009-02-04 09:24:25 -0500560
Byongho Leeee221842015-12-15 01:42:10 +0900561 search_start = buf->start & ~((u64)SZ_1G - 1);
Chris Masonb4ce94d2009-02-04 09:25:08 -0500562
Qu Wenruof616f5c2019-01-23 15:15:17 +0800563 /*
564 * Before CoWing this block for later modification, check if it's
565 * the subtree root and do the delayed subtree trace if needed.
566 *
567 * Also We don't care about the error, as it's handled internally.
568 */
569 btrfs_qgroup_trace_subtree_after_cow(trans, root, buf);
Chris Masonf510cfe2007-10-15 16:14:48 -0400570 ret = __btrfs_cow_block(trans, root, buf, parent,
Josef Bacik9631e4c2020-08-20 11:46:03 -0400571 parent_slot, cow_ret, search_start, 0, nest);
liubo1abe9b82011-03-24 11:18:59 +0000572
573 trace_btrfs_cow_block(root, buf, *cow_ret);
574
Chris Masonf510cfe2007-10-15 16:14:48 -0400575 return ret;
Chris Mason6702ed42007-08-07 16:15:09 -0400576}
Josef Bacikf75e2b72020-12-16 11:18:43 -0500577ALLOW_ERROR_INJECTION(btrfs_cow_block, ERRNO);
Chris Mason6702ed42007-08-07 16:15:09 -0400578
Chris Masond352ac62008-09-29 15:18:18 -0400579/*
580 * helper function for defrag to decide if two blocks pointed to by a
581 * node are actually close by
582 */
Chris Mason6b800532007-10-15 16:17:34 -0400583static int close_blocks(u64 blocknr, u64 other, u32 blocksize)
Chris Mason6702ed42007-08-07 16:15:09 -0400584{
Chris Mason6b800532007-10-15 16:17:34 -0400585 if (blocknr < other && other - (blocknr + blocksize) < 32768)
Chris Mason6702ed42007-08-07 16:15:09 -0400586 return 1;
Chris Mason6b800532007-10-15 16:17:34 -0400587 if (blocknr > other && blocknr - (other + blocksize) < 32768)
Chris Mason6702ed42007-08-07 16:15:09 -0400588 return 1;
Chris Mason02217ed2007-03-02 16:08:05 -0500589 return 0;
590}
591
David Sterbace6ef5a2020-06-08 16:06:07 +0200592#ifdef __LITTLE_ENDIAN
593
594/*
595 * Compare two keys, on little-endian the disk order is same as CPU order and
596 * we can avoid the conversion.
597 */
598static int comp_keys(const struct btrfs_disk_key *disk_key,
599 const struct btrfs_key *k2)
600{
601 const struct btrfs_key *k1 = (const struct btrfs_key *)disk_key;
602
603 return btrfs_comp_cpu_keys(k1, k2);
604}
605
606#else
607
Chris Mason081e9572007-11-06 10:26:24 -0500608/*
609 * compare two keys in a memcmp fashion
610 */
Omar Sandoval310712b2017-01-17 23:24:37 -0800611static int comp_keys(const struct btrfs_disk_key *disk,
612 const struct btrfs_key *k2)
Chris Mason081e9572007-11-06 10:26:24 -0500613{
614 struct btrfs_key k1;
615
616 btrfs_disk_key_to_cpu(&k1, disk);
617
Diego Calleja20736ab2009-07-24 11:06:52 -0400618 return btrfs_comp_cpu_keys(&k1, k2);
Chris Mason081e9572007-11-06 10:26:24 -0500619}
David Sterbace6ef5a2020-06-08 16:06:07 +0200620#endif
Chris Mason081e9572007-11-06 10:26:24 -0500621
Josef Bacikf3465ca2008-11-12 14:19:50 -0500622/*
623 * same as comp_keys only with two btrfs_key's
624 */
David Sterbae1f60a62019-10-01 19:57:39 +0200625int __pure btrfs_comp_cpu_keys(const struct btrfs_key *k1, const struct btrfs_key *k2)
Josef Bacikf3465ca2008-11-12 14:19:50 -0500626{
627 if (k1->objectid > k2->objectid)
628 return 1;
629 if (k1->objectid < k2->objectid)
630 return -1;
631 if (k1->type > k2->type)
632 return 1;
633 if (k1->type < k2->type)
634 return -1;
635 if (k1->offset > k2->offset)
636 return 1;
637 if (k1->offset < k2->offset)
638 return -1;
639 return 0;
640}
Chris Mason081e9572007-11-06 10:26:24 -0500641
Chris Masond352ac62008-09-29 15:18:18 -0400642/*
643 * this is used by the defrag code to go through all the
644 * leaves pointed to by a node and reallocate them so that
645 * disk order is close to key order
646 */
Chris Mason6702ed42007-08-07 16:15:09 -0400647int btrfs_realloc_node(struct btrfs_trans_handle *trans,
Chris Mason5f39d392007-10-15 16:14:19 -0400648 struct btrfs_root *root, struct extent_buffer *parent,
Eric Sandeende78b512013-01-31 18:21:12 +0000649 int start_slot, u64 *last_ret,
Chris Masona6b6e752007-10-15 16:22:39 -0400650 struct btrfs_key *progress)
Chris Mason6702ed42007-08-07 16:15:09 -0400651{
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400652 struct btrfs_fs_info *fs_info = root->fs_info;
Chris Mason6b800532007-10-15 16:17:34 -0400653 struct extent_buffer *cur;
Chris Mason6702ed42007-08-07 16:15:09 -0400654 u64 blocknr;
Chris Masone9d0b132007-08-10 14:06:19 -0400655 u64 search_start = *last_ret;
656 u64 last_block = 0;
Chris Mason6702ed42007-08-07 16:15:09 -0400657 u64 other;
658 u32 parent_nritems;
Chris Mason6702ed42007-08-07 16:15:09 -0400659 int end_slot;
660 int i;
661 int err = 0;
Chris Mason6b800532007-10-15 16:17:34 -0400662 u32 blocksize;
Chris Mason081e9572007-11-06 10:26:24 -0500663 int progress_passed = 0;
664 struct btrfs_disk_key disk_key;
Chris Mason6702ed42007-08-07 16:15:09 -0400665
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400666 WARN_ON(trans->transaction != fs_info->running_transaction);
667 WARN_ON(trans->transid != fs_info->generation);
Chris Mason86479a02007-09-10 19:58:16 -0400668
Chris Mason6b800532007-10-15 16:17:34 -0400669 parent_nritems = btrfs_header_nritems(parent);
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400670 blocksize = fs_info->nodesize;
Filipe Manana5dfe2be2015-02-23 19:48:52 +0000671 end_slot = parent_nritems - 1;
Chris Mason6702ed42007-08-07 16:15:09 -0400672
Filipe Manana5dfe2be2015-02-23 19:48:52 +0000673 if (parent_nritems <= 1)
Chris Mason6702ed42007-08-07 16:15:09 -0400674 return 0;
675
Filipe Manana5dfe2be2015-02-23 19:48:52 +0000676 for (i = start_slot; i <= end_slot; i++) {
Chris Mason6702ed42007-08-07 16:15:09 -0400677 int close = 1;
Chris Masona6b6e752007-10-15 16:22:39 -0400678
Chris Mason081e9572007-11-06 10:26:24 -0500679 btrfs_node_key(parent, &disk_key, i);
680 if (!progress_passed && comp_keys(&disk_key, progress) < 0)
681 continue;
682
683 progress_passed = 1;
Chris Mason6b800532007-10-15 16:17:34 -0400684 blocknr = btrfs_node_blockptr(parent, i);
Chris Masone9d0b132007-08-10 14:06:19 -0400685 if (last_block == 0)
686 last_block = blocknr;
Chris Mason5708b952007-10-25 15:43:18 -0400687
Chris Mason6702ed42007-08-07 16:15:09 -0400688 if (i > 0) {
Chris Mason6b800532007-10-15 16:17:34 -0400689 other = btrfs_node_blockptr(parent, i - 1);
690 close = close_blocks(blocknr, other, blocksize);
Chris Mason6702ed42007-08-07 16:15:09 -0400691 }
Filipe Manana5dfe2be2015-02-23 19:48:52 +0000692 if (!close && i < end_slot) {
Chris Mason6b800532007-10-15 16:17:34 -0400693 other = btrfs_node_blockptr(parent, i + 1);
694 close = close_blocks(blocknr, other, blocksize);
Chris Mason6702ed42007-08-07 16:15:09 -0400695 }
Chris Masone9d0b132007-08-10 14:06:19 -0400696 if (close) {
697 last_block = blocknr;
Chris Mason6702ed42007-08-07 16:15:09 -0400698 continue;
Chris Masone9d0b132007-08-10 14:06:19 -0400699 }
Chris Mason6702ed42007-08-07 16:15:09 -0400700
Josef Bacik206983b2020-11-05 10:45:10 -0500701 cur = btrfs_read_node_slot(parent, i);
702 if (IS_ERR(cur))
703 return PTR_ERR(cur);
Chris Masone9d0b132007-08-10 14:06:19 -0400704 if (search_start == 0)
Chris Mason6b800532007-10-15 16:17:34 -0400705 search_start = last_block;
Chris Masone9d0b132007-08-10 14:06:19 -0400706
Chris Masone7a84562008-06-25 16:01:31 -0400707 btrfs_tree_lock(cur);
Chris Mason6b800532007-10-15 16:17:34 -0400708 err = __btrfs_cow_block(trans, root, cur, parent, i,
Chris Masone7a84562008-06-25 16:01:31 -0400709 &cur, search_start,
Chris Mason6b800532007-10-15 16:17:34 -0400710 min(16 * blocksize,
Josef Bacik9631e4c2020-08-20 11:46:03 -0400711 (end_slot - i) * blocksize),
712 BTRFS_NESTING_COW);
Yan252c38f2007-08-29 09:11:44 -0400713 if (err) {
Chris Masone7a84562008-06-25 16:01:31 -0400714 btrfs_tree_unlock(cur);
Chris Mason6b800532007-10-15 16:17:34 -0400715 free_extent_buffer(cur);
Chris Mason6702ed42007-08-07 16:15:09 -0400716 break;
Yan252c38f2007-08-29 09:11:44 -0400717 }
Chris Masone7a84562008-06-25 16:01:31 -0400718 search_start = cur->start;
719 last_block = cur->start;
Chris Masonf2183bd2007-08-10 14:42:37 -0400720 *last_ret = search_start;
Chris Masone7a84562008-06-25 16:01:31 -0400721 btrfs_tree_unlock(cur);
722 free_extent_buffer(cur);
Chris Mason6702ed42007-08-07 16:15:09 -0400723 }
724 return err;
725}
726
Chris Mason74123bd2007-02-02 11:05:29 -0500727/*
Chris Mason5f39d392007-10-15 16:14:19 -0400728 * search for key in the extent_buffer. The items start at offset p,
Marcos Paulo de Souza67d5e282021-07-06 15:13:25 -0300729 * and they are item_size apart.
Chris Mason5f39d392007-10-15 16:14:19 -0400730 *
Chris Mason74123bd2007-02-02 11:05:29 -0500731 * the slot in the array is returned via slot, and it points to
732 * the place where you would insert key if it is not found in
733 * the array.
734 *
Marcos Paulo de Souza67d5e282021-07-06 15:13:25 -0300735 * Slot may point to total number of items if the key is bigger than
736 * all of the keys
Chris Mason74123bd2007-02-02 11:05:29 -0500737 */
Chris Masone02119d2008-09-05 16:13:11 -0400738static noinline int generic_bin_search(struct extent_buffer *eb,
Omar Sandoval310712b2017-01-17 23:24:37 -0800739 unsigned long p, int item_size,
Marcos Paulo de Souza67d5e282021-07-06 15:13:25 -0300740 const struct btrfs_key *key, int *slot)
Chris Masonbe0e5c02007-01-26 15:51:26 -0500741{
742 int low = 0;
Marcos Paulo de Souza67d5e282021-07-06 15:13:25 -0300743 int high = btrfs_header_nritems(eb);
Chris Masonbe0e5c02007-01-26 15:51:26 -0500744 int ret;
David Sterba5cd17f32020-04-29 23:23:37 +0200745 const int key_size = sizeof(struct btrfs_disk_key);
Chris Masonbe0e5c02007-01-26 15:51:26 -0500746
Liu Bo5e24e9a2016-06-23 16:32:45 -0700747 if (low > high) {
748 btrfs_err(eb->fs_info,
749 "%s: low (%d) > high (%d) eb %llu owner %llu level %d",
750 __func__, low, high, eb->start,
751 btrfs_header_owner(eb), btrfs_header_level(eb));
752 return -EINVAL;
753 }
754
Chris Masond3977122009-01-05 21:25:51 -0500755 while (low < high) {
David Sterba5cd17f32020-04-29 23:23:37 +0200756 unsigned long oip;
757 unsigned long offset;
758 struct btrfs_disk_key *tmp;
759 struct btrfs_disk_key unaligned;
760 int mid;
761
Chris Masonbe0e5c02007-01-26 15:51:26 -0500762 mid = (low + high) / 2;
Chris Mason5f39d392007-10-15 16:14:19 -0400763 offset = p + mid * item_size;
David Sterba5cd17f32020-04-29 23:23:37 +0200764 oip = offset_in_page(offset);
Chris Mason5f39d392007-10-15 16:14:19 -0400765
David Sterba5cd17f32020-04-29 23:23:37 +0200766 if (oip + key_size <= PAGE_SIZE) {
Qu Wenruo884b07d2020-12-02 14:48:04 +0800767 const unsigned long idx = get_eb_page_index(offset);
David Sterba5cd17f32020-04-29 23:23:37 +0200768 char *kaddr = page_address(eb->pages[idx]);
Chris Mason934d3752008-12-08 16:43:10 -0500769
Qu Wenruo884b07d2020-12-02 14:48:04 +0800770 oip = get_eb_offset_in_page(eb, offset);
David Sterba5cd17f32020-04-29 23:23:37 +0200771 tmp = (struct btrfs_disk_key *)(kaddr + oip);
Chris Mason5f39d392007-10-15 16:14:19 -0400772 } else {
David Sterba5cd17f32020-04-29 23:23:37 +0200773 read_extent_buffer(eb, &unaligned, offset, key_size);
774 tmp = &unaligned;
Chris Mason5f39d392007-10-15 16:14:19 -0400775 }
David Sterba5cd17f32020-04-29 23:23:37 +0200776
Chris Masonbe0e5c02007-01-26 15:51:26 -0500777 ret = comp_keys(tmp, key);
778
779 if (ret < 0)
780 low = mid + 1;
781 else if (ret > 0)
782 high = mid;
783 else {
784 *slot = mid;
785 return 0;
786 }
787 }
788 *slot = low;
789 return 1;
790}
791
Chris Mason97571fd2007-02-24 13:39:08 -0500792/*
793 * simple bin_search frontend that does the right thing for
794 * leaves vs nodes
795 */
Nikolay Borisova74b35e2017-12-08 16:27:43 +0200796int btrfs_bin_search(struct extent_buffer *eb, const struct btrfs_key *key,
Qu Wenruoe3b83362020-04-17 15:08:21 +0800797 int *slot)
Chris Masonbe0e5c02007-01-26 15:51:26 -0500798{
Qu Wenruoe3b83362020-04-17 15:08:21 +0800799 if (btrfs_header_level(eb) == 0)
Chris Mason5f39d392007-10-15 16:14:19 -0400800 return generic_bin_search(eb,
801 offsetof(struct btrfs_leaf, items),
Marcos Paulo de Souza67d5e282021-07-06 15:13:25 -0300802 sizeof(struct btrfs_item), key, slot);
Wang Sheng-Huif7757382012-03-30 15:14:27 +0800803 else
Chris Mason5f39d392007-10-15 16:14:19 -0400804 return generic_bin_search(eb,
805 offsetof(struct btrfs_node, ptrs),
Marcos Paulo de Souza67d5e282021-07-06 15:13:25 -0300806 sizeof(struct btrfs_key_ptr), key, slot);
Chris Masonbe0e5c02007-01-26 15:51:26 -0500807}
808
Yan, Zhengf0486c62010-05-16 10:46:25 -0400809static void root_add_used(struct btrfs_root *root, u32 size)
810{
811 spin_lock(&root->accounting_lock);
812 btrfs_set_root_used(&root->root_item,
813 btrfs_root_used(&root->root_item) + size);
814 spin_unlock(&root->accounting_lock);
815}
816
817static void root_sub_used(struct btrfs_root *root, u32 size)
818{
819 spin_lock(&root->accounting_lock);
820 btrfs_set_root_used(&root->root_item,
821 btrfs_root_used(&root->root_item) - size);
822 spin_unlock(&root->accounting_lock);
823}
824
Chris Masond352ac62008-09-29 15:18:18 -0400825/* given a node and slot number, this reads the blocks it points to. The
826 * extent buffer is returned with a reference taken (but unlocked).
Chris Masond352ac62008-09-29 15:18:18 -0400827 */
David Sterba4b231ae2019-08-21 19:16:27 +0200828struct extent_buffer *btrfs_read_node_slot(struct extent_buffer *parent,
829 int slot)
Chris Masonbb803952007-03-01 12:04:21 -0500830{
Chris Masonca7a79a2008-05-12 12:59:19 -0400831 int level = btrfs_header_level(parent);
Josef Bacik416bc652013-04-23 14:17:42 -0400832 struct extent_buffer *eb;
Qu Wenruo581c1762018-03-29 09:08:11 +0800833 struct btrfs_key first_key;
Josef Bacik416bc652013-04-23 14:17:42 -0400834
Liu Bofb770ae2016-07-05 12:10:14 -0700835 if (slot < 0 || slot >= btrfs_header_nritems(parent))
836 return ERR_PTR(-ENOENT);
Chris Masonca7a79a2008-05-12 12:59:19 -0400837
838 BUG_ON(level == 0);
839
Qu Wenruo581c1762018-03-29 09:08:11 +0800840 btrfs_node_key_to_cpu(parent, &first_key, slot);
David Sterbad0d20b02019-03-20 14:54:01 +0100841 eb = read_tree_block(parent->fs_info, btrfs_node_blockptr(parent, slot),
Josef Bacik1b7ec852020-11-05 10:45:18 -0500842 btrfs_header_owner(parent),
Qu Wenruo581c1762018-03-29 09:08:11 +0800843 btrfs_node_ptr_generation(parent, slot),
844 level - 1, &first_key);
Liu Bofb770ae2016-07-05 12:10:14 -0700845 if (!IS_ERR(eb) && !extent_buffer_uptodate(eb)) {
846 free_extent_buffer(eb);
847 eb = ERR_PTR(-EIO);
Josef Bacik416bc652013-04-23 14:17:42 -0400848 }
849
850 return eb;
Chris Masonbb803952007-03-01 12:04:21 -0500851}
852
Chris Masond352ac62008-09-29 15:18:18 -0400853/*
854 * node level balancing, used to make sure nodes are in proper order for
855 * item deletion. We balance from the top down, so we have to make sure
856 * that a deletion won't leave an node completely empty later on.
857 */
Chris Masone02119d2008-09-05 16:13:11 -0400858static noinline int balance_level(struct btrfs_trans_handle *trans,
Chris Mason98ed5172008-01-03 10:01:48 -0500859 struct btrfs_root *root,
860 struct btrfs_path *path, int level)
Chris Masonbb803952007-03-01 12:04:21 -0500861{
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400862 struct btrfs_fs_info *fs_info = root->fs_info;
Chris Mason5f39d392007-10-15 16:14:19 -0400863 struct extent_buffer *right = NULL;
864 struct extent_buffer *mid;
865 struct extent_buffer *left = NULL;
866 struct extent_buffer *parent = NULL;
Chris Masonbb803952007-03-01 12:04:21 -0500867 int ret = 0;
868 int wret;
869 int pslot;
Chris Masonbb803952007-03-01 12:04:21 -0500870 int orig_slot = path->slots[level];
Chris Mason79f95c82007-03-01 15:16:26 -0500871 u64 orig_ptr;
Chris Masonbb803952007-03-01 12:04:21 -0500872
Liu Bo98e6b1e2018-09-12 06:06:23 +0800873 ASSERT(level > 0);
Chris Masonbb803952007-03-01 12:04:21 -0500874
Chris Mason5f39d392007-10-15 16:14:19 -0400875 mid = path->nodes[level];
Chris Masonb4ce94d2009-02-04 09:25:08 -0500876
Josef Bacikac5887c2020-08-20 11:46:10 -0400877 WARN_ON(path->locks[level] != BTRFS_WRITE_LOCK);
Chris Mason7bb86312007-12-11 09:25:06 -0500878 WARN_ON(btrfs_header_generation(mid) != trans->transid);
879
Chris Mason1d4f8a02007-03-13 09:28:32 -0400880 orig_ptr = btrfs_node_blockptr(mid, orig_slot);
Chris Mason79f95c82007-03-01 15:16:26 -0500881
Li Zefana05a9bb2011-09-06 16:55:34 +0800882 if (level < BTRFS_MAX_LEVEL - 1) {
Chris Mason5f39d392007-10-15 16:14:19 -0400883 parent = path->nodes[level + 1];
Li Zefana05a9bb2011-09-06 16:55:34 +0800884 pslot = path->slots[level + 1];
885 }
Chris Masonbb803952007-03-01 12:04:21 -0500886
Chris Mason40689472007-03-17 14:29:23 -0400887 /*
888 * deal with the case where there is only one pointer in the root
889 * by promoting the node below to a root
890 */
Chris Mason5f39d392007-10-15 16:14:19 -0400891 if (!parent) {
892 struct extent_buffer *child;
Chris Masonbb803952007-03-01 12:04:21 -0500893
Chris Mason5f39d392007-10-15 16:14:19 -0400894 if (btrfs_header_nritems(mid) != 1)
Chris Masonbb803952007-03-01 12:04:21 -0500895 return 0;
896
897 /* promote the child to a root */
David Sterba4b231ae2019-08-21 19:16:27 +0200898 child = btrfs_read_node_slot(mid, 0);
Liu Bofb770ae2016-07-05 12:10:14 -0700899 if (IS_ERR(child)) {
900 ret = PTR_ERR(child);
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400901 btrfs_handle_fs_error(fs_info, ret, NULL);
Mark Fasheh305a26a2011-09-01 11:27:57 -0700902 goto enospc;
903 }
904
Chris Mason925baed2008-06-25 16:01:30 -0400905 btrfs_tree_lock(child);
Josef Bacik9631e4c2020-08-20 11:46:03 -0400906 ret = btrfs_cow_block(trans, root, child, mid, 0, &child,
907 BTRFS_NESTING_COW);
Yan, Zhengf0486c62010-05-16 10:46:25 -0400908 if (ret) {
909 btrfs_tree_unlock(child);
910 free_extent_buffer(child);
911 goto enospc;
912 }
Yan2f375ab2008-02-01 14:58:07 -0500913
Filipe Manana406808a2021-03-11 14:31:08 +0000914 ret = btrfs_tree_mod_log_insert_root(root->node, child, true);
David Sterbad9d19a02018-03-05 16:35:29 +0100915 BUG_ON(ret < 0);
Chris Mason240f62c2011-03-23 14:54:42 -0400916 rcu_assign_pointer(root->node, child);
Chris Mason925baed2008-06-25 16:01:30 -0400917
Chris Mason0b86a832008-03-24 15:01:56 -0400918 add_root_to_dirty_list(root);
Chris Mason925baed2008-06-25 16:01:30 -0400919 btrfs_tree_unlock(child);
Chris Masonb4ce94d2009-02-04 09:25:08 -0500920
Chris Mason925baed2008-06-25 16:01:30 -0400921 path->locks[level] = 0;
Chris Masonbb803952007-03-01 12:04:21 -0500922 path->nodes[level] = NULL;
David Sterba6a884d7d2019-03-20 14:30:02 +0100923 btrfs_clean_tree_block(mid);
Chris Mason925baed2008-06-25 16:01:30 -0400924 btrfs_tree_unlock(mid);
Chris Masonbb803952007-03-01 12:04:21 -0500925 /* once for the path */
Chris Mason5f39d392007-10-15 16:14:19 -0400926 free_extent_buffer(mid);
Yan, Zhengf0486c62010-05-16 10:46:25 -0400927
928 root_sub_used(root, mid->len);
Jan Schmidt5581a512012-05-16 17:04:52 +0200929 btrfs_free_tree_block(trans, root, mid, 0, 1);
Chris Masonbb803952007-03-01 12:04:21 -0500930 /* once for the root ptr */
Josef Bacik3083ee22012-03-09 16:01:49 -0500931 free_extent_buffer_stale(mid);
Yan, Zhengf0486c62010-05-16 10:46:25 -0400932 return 0;
Chris Masonbb803952007-03-01 12:04:21 -0500933 }
Chris Mason5f39d392007-10-15 16:14:19 -0400934 if (btrfs_header_nritems(mid) >
Jeff Mahoney0b246af2016-06-22 18:54:23 -0400935 BTRFS_NODEPTRS_PER_BLOCK(fs_info) / 4)
Chris Masonbb803952007-03-01 12:04:21 -0500936 return 0;
937
David Sterba4b231ae2019-08-21 19:16:27 +0200938 left = btrfs_read_node_slot(parent, pslot - 1);
Liu Bofb770ae2016-07-05 12:10:14 -0700939 if (IS_ERR(left))
940 left = NULL;
941
Chris Mason5f39d392007-10-15 16:14:19 -0400942 if (left) {
Josef Bacikbf774672020-08-20 11:46:04 -0400943 __btrfs_tree_lock(left, BTRFS_NESTING_LEFT);
Chris Mason5f39d392007-10-15 16:14:19 -0400944 wret = btrfs_cow_block(trans, root, left,
Josef Bacik9631e4c2020-08-20 11:46:03 -0400945 parent, pslot - 1, &left,
Josef Bacikbf59a5a2020-08-20 11:46:05 -0400946 BTRFS_NESTING_LEFT_COW);
Chris Mason54aa1f42007-06-22 14:16:25 -0400947 if (wret) {
948 ret = wret;
949 goto enospc;
950 }
Chris Mason2cc58cf2007-08-27 16:49:44 -0400951 }
Liu Bofb770ae2016-07-05 12:10:14 -0700952
David Sterba4b231ae2019-08-21 19:16:27 +0200953 right = btrfs_read_node_slot(parent, pslot + 1);
Liu Bofb770ae2016-07-05 12:10:14 -0700954 if (IS_ERR(right))
955 right = NULL;
956
Chris Mason5f39d392007-10-15 16:14:19 -0400957 if (right) {
Josef Bacikbf774672020-08-20 11:46:04 -0400958 __btrfs_tree_lock(right, BTRFS_NESTING_RIGHT);
Chris Mason5f39d392007-10-15 16:14:19 -0400959 wret = btrfs_cow_block(trans, root, right,
Josef Bacik9631e4c2020-08-20 11:46:03 -0400960 parent, pslot + 1, &right,
Josef Bacikbf59a5a2020-08-20 11:46:05 -0400961 BTRFS_NESTING_RIGHT_COW);
Chris Mason2cc58cf2007-08-27 16:49:44 -0400962 if (wret) {
963 ret = wret;
964 goto enospc;
965 }
966 }
967
968 /* first, try to make some room in the middle buffer */
Chris Mason5f39d392007-10-15 16:14:19 -0400969 if (left) {
970 orig_slot += btrfs_header_nritems(left);
David Sterbad30a6682019-03-20 14:16:45 +0100971 wret = push_node_left(trans, left, mid, 1);
Chris Mason79f95c82007-03-01 15:16:26 -0500972 if (wret < 0)
973 ret = wret;
Chris Masonbb803952007-03-01 12:04:21 -0500974 }
Chris Mason79f95c82007-03-01 15:16:26 -0500975
976 /*
977 * then try to empty the right most buffer into the middle
978 */
Chris Mason5f39d392007-10-15 16:14:19 -0400979 if (right) {
David Sterbad30a6682019-03-20 14:16:45 +0100980 wret = push_node_left(trans, mid, right, 1);
Chris Mason54aa1f42007-06-22 14:16:25 -0400981 if (wret < 0 && wret != -ENOSPC)
Chris Mason79f95c82007-03-01 15:16:26 -0500982 ret = wret;
Chris Mason5f39d392007-10-15 16:14:19 -0400983 if (btrfs_header_nritems(right) == 0) {
David Sterba6a884d7d2019-03-20 14:30:02 +0100984 btrfs_clean_tree_block(right);
Chris Mason925baed2008-06-25 16:01:30 -0400985 btrfs_tree_unlock(right);
Tsutomu Itohafe5fea2013-04-16 05:18:22 +0000986 del_ptr(root, path, level + 1, pslot + 1);
Yan, Zhengf0486c62010-05-16 10:46:25 -0400987 root_sub_used(root, right->len);
Jan Schmidt5581a512012-05-16 17:04:52 +0200988 btrfs_free_tree_block(trans, root, right, 0, 1);
Josef Bacik3083ee22012-03-09 16:01:49 -0500989 free_extent_buffer_stale(right);
Yan, Zhengf0486c62010-05-16 10:46:25 -0400990 right = NULL;
Chris Masonbb803952007-03-01 12:04:21 -0500991 } else {
Chris Mason5f39d392007-10-15 16:14:19 -0400992 struct btrfs_disk_key right_key;
993 btrfs_node_key(right, &right_key, 0);
Filipe Mananaf3a84cc2021-03-11 14:31:07 +0000994 ret = btrfs_tree_mod_log_insert_key(parent, pslot + 1,
995 BTRFS_MOD_LOG_KEY_REPLACE, GFP_NOFS);
David Sterba0e82bcf2018-03-05 16:16:54 +0100996 BUG_ON(ret < 0);
Chris Mason5f39d392007-10-15 16:14:19 -0400997 btrfs_set_node_key(parent, &right_key, pslot + 1);
998 btrfs_mark_buffer_dirty(parent);
Chris Masonbb803952007-03-01 12:04:21 -0500999 }
1000 }
Chris Mason5f39d392007-10-15 16:14:19 -04001001 if (btrfs_header_nritems(mid) == 1) {
Chris Mason79f95c82007-03-01 15:16:26 -05001002 /*
1003 * we're not allowed to leave a node with one item in the
1004 * tree during a delete. A deletion from lower in the tree
1005 * could try to delete the only pointer in this node.
1006 * So, pull some keys from the left.
1007 * There has to be a left pointer at this point because
1008 * otherwise we would have pulled some pointers from the
1009 * right
1010 */
Mark Fasheh305a26a2011-09-01 11:27:57 -07001011 if (!left) {
1012 ret = -EROFS;
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001013 btrfs_handle_fs_error(fs_info, ret, NULL);
Mark Fasheh305a26a2011-09-01 11:27:57 -07001014 goto enospc;
1015 }
David Sterba55d32ed2019-03-20 14:18:06 +01001016 wret = balance_node_right(trans, mid, left);
Chris Mason54aa1f42007-06-22 14:16:25 -04001017 if (wret < 0) {
Chris Mason79f95c82007-03-01 15:16:26 -05001018 ret = wret;
Chris Mason54aa1f42007-06-22 14:16:25 -04001019 goto enospc;
1020 }
Chris Masonbce4eae2008-04-24 14:42:46 -04001021 if (wret == 1) {
David Sterbad30a6682019-03-20 14:16:45 +01001022 wret = push_node_left(trans, left, mid, 1);
Chris Masonbce4eae2008-04-24 14:42:46 -04001023 if (wret < 0)
1024 ret = wret;
1025 }
Chris Mason79f95c82007-03-01 15:16:26 -05001026 BUG_ON(wret == 1);
1027 }
Chris Mason5f39d392007-10-15 16:14:19 -04001028 if (btrfs_header_nritems(mid) == 0) {
David Sterba6a884d7d2019-03-20 14:30:02 +01001029 btrfs_clean_tree_block(mid);
Chris Mason925baed2008-06-25 16:01:30 -04001030 btrfs_tree_unlock(mid);
Tsutomu Itohafe5fea2013-04-16 05:18:22 +00001031 del_ptr(root, path, level + 1, pslot);
Yan, Zhengf0486c62010-05-16 10:46:25 -04001032 root_sub_used(root, mid->len);
Jan Schmidt5581a512012-05-16 17:04:52 +02001033 btrfs_free_tree_block(trans, root, mid, 0, 1);
Josef Bacik3083ee22012-03-09 16:01:49 -05001034 free_extent_buffer_stale(mid);
Yan, Zhengf0486c62010-05-16 10:46:25 -04001035 mid = NULL;
Chris Mason79f95c82007-03-01 15:16:26 -05001036 } else {
1037 /* update the parent key to reflect our changes */
Chris Mason5f39d392007-10-15 16:14:19 -04001038 struct btrfs_disk_key mid_key;
1039 btrfs_node_key(mid, &mid_key, 0);
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00001040 ret = btrfs_tree_mod_log_insert_key(parent, pslot,
1041 BTRFS_MOD_LOG_KEY_REPLACE, GFP_NOFS);
David Sterba0e82bcf2018-03-05 16:16:54 +01001042 BUG_ON(ret < 0);
Chris Mason5f39d392007-10-15 16:14:19 -04001043 btrfs_set_node_key(parent, &mid_key, pslot);
1044 btrfs_mark_buffer_dirty(parent);
Chris Mason79f95c82007-03-01 15:16:26 -05001045 }
Chris Masonbb803952007-03-01 12:04:21 -05001046
Chris Mason79f95c82007-03-01 15:16:26 -05001047 /* update the path */
Chris Mason5f39d392007-10-15 16:14:19 -04001048 if (left) {
1049 if (btrfs_header_nritems(left) > orig_slot) {
David Sterba67439da2019-10-08 13:28:47 +02001050 atomic_inc(&left->refs);
Chris Mason925baed2008-06-25 16:01:30 -04001051 /* left was locked after cow */
Chris Mason5f39d392007-10-15 16:14:19 -04001052 path->nodes[level] = left;
Chris Masonbb803952007-03-01 12:04:21 -05001053 path->slots[level + 1] -= 1;
1054 path->slots[level] = orig_slot;
Chris Mason925baed2008-06-25 16:01:30 -04001055 if (mid) {
1056 btrfs_tree_unlock(mid);
Chris Mason5f39d392007-10-15 16:14:19 -04001057 free_extent_buffer(mid);
Chris Mason925baed2008-06-25 16:01:30 -04001058 }
Chris Masonbb803952007-03-01 12:04:21 -05001059 } else {
Chris Mason5f39d392007-10-15 16:14:19 -04001060 orig_slot -= btrfs_header_nritems(left);
Chris Masonbb803952007-03-01 12:04:21 -05001061 path->slots[level] = orig_slot;
1062 }
1063 }
Chris Mason79f95c82007-03-01 15:16:26 -05001064 /* double check we haven't messed things up */
Chris Masone20d96d2007-03-22 12:13:20 -04001065 if (orig_ptr !=
Chris Mason5f39d392007-10-15 16:14:19 -04001066 btrfs_node_blockptr(path->nodes[level], path->slots[level]))
Chris Mason79f95c82007-03-01 15:16:26 -05001067 BUG();
Chris Mason54aa1f42007-06-22 14:16:25 -04001068enospc:
Chris Mason925baed2008-06-25 16:01:30 -04001069 if (right) {
1070 btrfs_tree_unlock(right);
Chris Mason5f39d392007-10-15 16:14:19 -04001071 free_extent_buffer(right);
Chris Mason925baed2008-06-25 16:01:30 -04001072 }
1073 if (left) {
1074 if (path->nodes[level] != left)
1075 btrfs_tree_unlock(left);
Chris Mason5f39d392007-10-15 16:14:19 -04001076 free_extent_buffer(left);
Chris Mason925baed2008-06-25 16:01:30 -04001077 }
Chris Masonbb803952007-03-01 12:04:21 -05001078 return ret;
1079}
1080
Chris Masond352ac62008-09-29 15:18:18 -04001081/* Node balancing for insertion. Here we only split or push nodes around
1082 * when they are completely full. This is also done top down, so we
1083 * have to be pessimistic.
1084 */
Chris Masond3977122009-01-05 21:25:51 -05001085static noinline int push_nodes_for_insert(struct btrfs_trans_handle *trans,
Chris Mason98ed5172008-01-03 10:01:48 -05001086 struct btrfs_root *root,
1087 struct btrfs_path *path, int level)
Chris Masone66f7092007-04-20 13:16:02 -04001088{
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001089 struct btrfs_fs_info *fs_info = root->fs_info;
Chris Mason5f39d392007-10-15 16:14:19 -04001090 struct extent_buffer *right = NULL;
1091 struct extent_buffer *mid;
1092 struct extent_buffer *left = NULL;
1093 struct extent_buffer *parent = NULL;
Chris Masone66f7092007-04-20 13:16:02 -04001094 int ret = 0;
1095 int wret;
1096 int pslot;
1097 int orig_slot = path->slots[level];
Chris Masone66f7092007-04-20 13:16:02 -04001098
1099 if (level == 0)
1100 return 1;
1101
Chris Mason5f39d392007-10-15 16:14:19 -04001102 mid = path->nodes[level];
Chris Mason7bb86312007-12-11 09:25:06 -05001103 WARN_ON(btrfs_header_generation(mid) != trans->transid);
Chris Masone66f7092007-04-20 13:16:02 -04001104
Li Zefana05a9bb2011-09-06 16:55:34 +08001105 if (level < BTRFS_MAX_LEVEL - 1) {
Chris Mason5f39d392007-10-15 16:14:19 -04001106 parent = path->nodes[level + 1];
Li Zefana05a9bb2011-09-06 16:55:34 +08001107 pslot = path->slots[level + 1];
1108 }
Chris Masone66f7092007-04-20 13:16:02 -04001109
Chris Mason5f39d392007-10-15 16:14:19 -04001110 if (!parent)
Chris Masone66f7092007-04-20 13:16:02 -04001111 return 1;
Chris Masone66f7092007-04-20 13:16:02 -04001112
David Sterba4b231ae2019-08-21 19:16:27 +02001113 left = btrfs_read_node_slot(parent, pslot - 1);
Liu Bofb770ae2016-07-05 12:10:14 -07001114 if (IS_ERR(left))
1115 left = NULL;
Chris Masone66f7092007-04-20 13:16:02 -04001116
1117 /* first, try to make some room in the middle buffer */
Chris Mason5f39d392007-10-15 16:14:19 -04001118 if (left) {
Chris Masone66f7092007-04-20 13:16:02 -04001119 u32 left_nr;
Chris Mason925baed2008-06-25 16:01:30 -04001120
Josef Bacikbf774672020-08-20 11:46:04 -04001121 __btrfs_tree_lock(left, BTRFS_NESTING_LEFT);
Chris Masonb4ce94d2009-02-04 09:25:08 -05001122
Chris Mason5f39d392007-10-15 16:14:19 -04001123 left_nr = btrfs_header_nritems(left);
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001124 if (left_nr >= BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 1) {
Chris Mason33ade1f2007-04-20 13:48:57 -04001125 wret = 1;
1126 } else {
Chris Mason5f39d392007-10-15 16:14:19 -04001127 ret = btrfs_cow_block(trans, root, left, parent,
Josef Bacik9631e4c2020-08-20 11:46:03 -04001128 pslot - 1, &left,
Josef Bacikbf59a5a2020-08-20 11:46:05 -04001129 BTRFS_NESTING_LEFT_COW);
Chris Mason54aa1f42007-06-22 14:16:25 -04001130 if (ret)
1131 wret = 1;
1132 else {
David Sterbad30a6682019-03-20 14:16:45 +01001133 wret = push_node_left(trans, left, mid, 0);
Chris Mason54aa1f42007-06-22 14:16:25 -04001134 }
Chris Mason33ade1f2007-04-20 13:48:57 -04001135 }
Chris Masone66f7092007-04-20 13:16:02 -04001136 if (wret < 0)
1137 ret = wret;
1138 if (wret == 0) {
Chris Mason5f39d392007-10-15 16:14:19 -04001139 struct btrfs_disk_key disk_key;
Chris Masone66f7092007-04-20 13:16:02 -04001140 orig_slot += left_nr;
Chris Mason5f39d392007-10-15 16:14:19 -04001141 btrfs_node_key(mid, &disk_key, 0);
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00001142 ret = btrfs_tree_mod_log_insert_key(parent, pslot,
1143 BTRFS_MOD_LOG_KEY_REPLACE, GFP_NOFS);
David Sterba0e82bcf2018-03-05 16:16:54 +01001144 BUG_ON(ret < 0);
Chris Mason5f39d392007-10-15 16:14:19 -04001145 btrfs_set_node_key(parent, &disk_key, pslot);
1146 btrfs_mark_buffer_dirty(parent);
1147 if (btrfs_header_nritems(left) > orig_slot) {
1148 path->nodes[level] = left;
Chris Masone66f7092007-04-20 13:16:02 -04001149 path->slots[level + 1] -= 1;
1150 path->slots[level] = orig_slot;
Chris Mason925baed2008-06-25 16:01:30 -04001151 btrfs_tree_unlock(mid);
Chris Mason5f39d392007-10-15 16:14:19 -04001152 free_extent_buffer(mid);
Chris Masone66f7092007-04-20 13:16:02 -04001153 } else {
1154 orig_slot -=
Chris Mason5f39d392007-10-15 16:14:19 -04001155 btrfs_header_nritems(left);
Chris Masone66f7092007-04-20 13:16:02 -04001156 path->slots[level] = orig_slot;
Chris Mason925baed2008-06-25 16:01:30 -04001157 btrfs_tree_unlock(left);
Chris Mason5f39d392007-10-15 16:14:19 -04001158 free_extent_buffer(left);
Chris Masone66f7092007-04-20 13:16:02 -04001159 }
Chris Masone66f7092007-04-20 13:16:02 -04001160 return 0;
1161 }
Chris Mason925baed2008-06-25 16:01:30 -04001162 btrfs_tree_unlock(left);
Chris Mason5f39d392007-10-15 16:14:19 -04001163 free_extent_buffer(left);
Chris Masone66f7092007-04-20 13:16:02 -04001164 }
David Sterba4b231ae2019-08-21 19:16:27 +02001165 right = btrfs_read_node_slot(parent, pslot + 1);
Liu Bofb770ae2016-07-05 12:10:14 -07001166 if (IS_ERR(right))
1167 right = NULL;
Chris Masone66f7092007-04-20 13:16:02 -04001168
1169 /*
1170 * then try to empty the right most buffer into the middle
1171 */
Chris Mason5f39d392007-10-15 16:14:19 -04001172 if (right) {
Chris Mason33ade1f2007-04-20 13:48:57 -04001173 u32 right_nr;
Chris Masonb4ce94d2009-02-04 09:25:08 -05001174
Josef Bacikbf774672020-08-20 11:46:04 -04001175 __btrfs_tree_lock(right, BTRFS_NESTING_RIGHT);
Chris Masonb4ce94d2009-02-04 09:25:08 -05001176
Chris Mason5f39d392007-10-15 16:14:19 -04001177 right_nr = btrfs_header_nritems(right);
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001178 if (right_nr >= BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 1) {
Chris Mason33ade1f2007-04-20 13:48:57 -04001179 wret = 1;
1180 } else {
Chris Mason5f39d392007-10-15 16:14:19 -04001181 ret = btrfs_cow_block(trans, root, right,
1182 parent, pslot + 1,
Josef Bacikbf59a5a2020-08-20 11:46:05 -04001183 &right, BTRFS_NESTING_RIGHT_COW);
Chris Mason54aa1f42007-06-22 14:16:25 -04001184 if (ret)
1185 wret = 1;
1186 else {
David Sterba55d32ed2019-03-20 14:18:06 +01001187 wret = balance_node_right(trans, right, mid);
Chris Mason54aa1f42007-06-22 14:16:25 -04001188 }
Chris Mason33ade1f2007-04-20 13:48:57 -04001189 }
Chris Masone66f7092007-04-20 13:16:02 -04001190 if (wret < 0)
1191 ret = wret;
1192 if (wret == 0) {
Chris Mason5f39d392007-10-15 16:14:19 -04001193 struct btrfs_disk_key disk_key;
1194
1195 btrfs_node_key(right, &disk_key, 0);
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00001196 ret = btrfs_tree_mod_log_insert_key(parent, pslot + 1,
1197 BTRFS_MOD_LOG_KEY_REPLACE, GFP_NOFS);
David Sterba0e82bcf2018-03-05 16:16:54 +01001198 BUG_ON(ret < 0);
Chris Mason5f39d392007-10-15 16:14:19 -04001199 btrfs_set_node_key(parent, &disk_key, pslot + 1);
1200 btrfs_mark_buffer_dirty(parent);
1201
1202 if (btrfs_header_nritems(mid) <= orig_slot) {
1203 path->nodes[level] = right;
Chris Masone66f7092007-04-20 13:16:02 -04001204 path->slots[level + 1] += 1;
1205 path->slots[level] = orig_slot -
Chris Mason5f39d392007-10-15 16:14:19 -04001206 btrfs_header_nritems(mid);
Chris Mason925baed2008-06-25 16:01:30 -04001207 btrfs_tree_unlock(mid);
Chris Mason5f39d392007-10-15 16:14:19 -04001208 free_extent_buffer(mid);
Chris Masone66f7092007-04-20 13:16:02 -04001209 } else {
Chris Mason925baed2008-06-25 16:01:30 -04001210 btrfs_tree_unlock(right);
Chris Mason5f39d392007-10-15 16:14:19 -04001211 free_extent_buffer(right);
Chris Masone66f7092007-04-20 13:16:02 -04001212 }
Chris Masone66f7092007-04-20 13:16:02 -04001213 return 0;
1214 }
Chris Mason925baed2008-06-25 16:01:30 -04001215 btrfs_tree_unlock(right);
Chris Mason5f39d392007-10-15 16:14:19 -04001216 free_extent_buffer(right);
Chris Masone66f7092007-04-20 13:16:02 -04001217 }
Chris Masone66f7092007-04-20 13:16:02 -04001218 return 1;
1219}
1220
Chris Mason74123bd2007-02-02 11:05:29 -05001221/*
Chris Masond352ac62008-09-29 15:18:18 -04001222 * readahead one full node of leaves, finding things that are close
1223 * to the block in 'slot', and triggering ra on them.
Chris Mason3c69fae2007-08-07 15:52:22 -04001224 */
Jeff Mahoney2ff7e612016-06-22 18:54:24 -04001225static void reada_for_search(struct btrfs_fs_info *fs_info,
Chris Masonc8c42862009-04-03 10:14:18 -04001226 struct btrfs_path *path,
1227 int level, int slot, u64 objectid)
Chris Mason3c69fae2007-08-07 15:52:22 -04001228{
Chris Mason5f39d392007-10-15 16:14:19 -04001229 struct extent_buffer *node;
Chris Mason01f46652007-12-21 16:24:26 -05001230 struct btrfs_disk_key disk_key;
Chris Mason3c69fae2007-08-07 15:52:22 -04001231 u32 nritems;
Chris Mason3c69fae2007-08-07 15:52:22 -04001232 u64 search;
Chris Masona7175312009-01-22 09:23:10 -05001233 u64 target;
Chris Mason6b800532007-10-15 16:17:34 -04001234 u64 nread = 0;
Filipe Mananaace75062021-03-31 11:56:21 +01001235 u64 nread_max;
Chris Mason6b800532007-10-15 16:17:34 -04001236 u32 nr;
1237 u32 blocksize;
1238 u32 nscan = 0;
Chris Masondb945352007-10-15 16:15:53 -04001239
Filipe Mananaace75062021-03-31 11:56:21 +01001240 if (level != 1 && path->reada != READA_FORWARD_ALWAYS)
Chris Mason3c69fae2007-08-07 15:52:22 -04001241 return;
1242
Chris Mason6702ed42007-08-07 16:15:09 -04001243 if (!path->nodes[level])
1244 return;
1245
Chris Mason5f39d392007-10-15 16:14:19 -04001246 node = path->nodes[level];
Chris Mason925baed2008-06-25 16:01:30 -04001247
Filipe Mananaace75062021-03-31 11:56:21 +01001248 /*
1249 * Since the time between visiting leaves is much shorter than the time
1250 * between visiting nodes, limit read ahead of nodes to 1, to avoid too
1251 * much IO at once (possibly random).
1252 */
1253 if (path->reada == READA_FORWARD_ALWAYS) {
1254 if (level > 1)
1255 nread_max = node->fs_info->nodesize;
1256 else
1257 nread_max = SZ_128K;
1258 } else {
1259 nread_max = SZ_64K;
1260 }
1261
Chris Mason3c69fae2007-08-07 15:52:22 -04001262 search = btrfs_node_blockptr(node, slot);
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001263 blocksize = fs_info->nodesize;
Filipe Manana069a2e32021-07-20 16:03:03 +01001264 if (path->reada != READA_FORWARD_ALWAYS) {
1265 struct extent_buffer *eb;
1266
1267 eb = find_extent_buffer(fs_info, search);
1268 if (eb) {
1269 free_extent_buffer(eb);
1270 return;
1271 }
Chris Mason3c69fae2007-08-07 15:52:22 -04001272 }
1273
Chris Masona7175312009-01-22 09:23:10 -05001274 target = search;
Chris Mason6b800532007-10-15 16:17:34 -04001275
Chris Mason5f39d392007-10-15 16:14:19 -04001276 nritems = btrfs_header_nritems(node);
Chris Mason6b800532007-10-15 16:17:34 -04001277 nr = slot;
Josef Bacik25b8b932011-06-08 14:36:54 -04001278
Chris Masond3977122009-01-05 21:25:51 -05001279 while (1) {
David Sterbae4058b52015-11-27 16:31:35 +01001280 if (path->reada == READA_BACK) {
Chris Mason6b800532007-10-15 16:17:34 -04001281 if (nr == 0)
1282 break;
1283 nr--;
Filipe Mananaace75062021-03-31 11:56:21 +01001284 } else if (path->reada == READA_FORWARD ||
1285 path->reada == READA_FORWARD_ALWAYS) {
Chris Mason6b800532007-10-15 16:17:34 -04001286 nr++;
1287 if (nr >= nritems)
1288 break;
Chris Mason3c69fae2007-08-07 15:52:22 -04001289 }
David Sterbae4058b52015-11-27 16:31:35 +01001290 if (path->reada == READA_BACK && objectid) {
Chris Mason01f46652007-12-21 16:24:26 -05001291 btrfs_node_key(node, &disk_key, nr);
1292 if (btrfs_disk_key_objectid(&disk_key) != objectid)
1293 break;
1294 }
Chris Mason6b800532007-10-15 16:17:34 -04001295 search = btrfs_node_blockptr(node, nr);
Filipe Mananaace75062021-03-31 11:56:21 +01001296 if (path->reada == READA_FORWARD_ALWAYS ||
1297 (search <= target && target - search <= 65536) ||
Chris Masona7175312009-01-22 09:23:10 -05001298 (search > target && search - target <= 65536)) {
Josef Bacikbfb484d2020-11-05 10:45:09 -05001299 btrfs_readahead_node_child(node, nr);
Chris Mason6b800532007-10-15 16:17:34 -04001300 nread += blocksize;
1301 }
1302 nscan++;
Filipe Mananaace75062021-03-31 11:56:21 +01001303 if (nread > nread_max || nscan > 32)
Chris Mason6b800532007-10-15 16:17:34 -04001304 break;
Chris Mason3c69fae2007-08-07 15:52:22 -04001305 }
1306}
Chris Mason925baed2008-06-25 16:01:30 -04001307
Josef Bacikbfb484d2020-11-05 10:45:09 -05001308static noinline void reada_for_balance(struct btrfs_path *path, int level)
Chris Masonb4ce94d2009-02-04 09:25:08 -05001309{
Josef Bacikbfb484d2020-11-05 10:45:09 -05001310 struct extent_buffer *parent;
Chris Masonb4ce94d2009-02-04 09:25:08 -05001311 int slot;
1312 int nritems;
Chris Masonb4ce94d2009-02-04 09:25:08 -05001313
Chris Mason8c594ea2009-04-20 15:50:10 -04001314 parent = path->nodes[level + 1];
Chris Masonb4ce94d2009-02-04 09:25:08 -05001315 if (!parent)
Josef Bacik0b088512013-06-17 14:23:02 -04001316 return;
Chris Masonb4ce94d2009-02-04 09:25:08 -05001317
1318 nritems = btrfs_header_nritems(parent);
Chris Mason8c594ea2009-04-20 15:50:10 -04001319 slot = path->slots[level + 1];
Chris Masonb4ce94d2009-02-04 09:25:08 -05001320
Josef Bacikbfb484d2020-11-05 10:45:09 -05001321 if (slot > 0)
1322 btrfs_readahead_node_child(parent, slot - 1);
1323 if (slot + 1 < nritems)
1324 btrfs_readahead_node_child(parent, slot + 1);
Chris Masonb4ce94d2009-02-04 09:25:08 -05001325}
1326
1327
1328/*
Chris Masond3977122009-01-05 21:25:51 -05001329 * when we walk down the tree, it is usually safe to unlock the higher layers
1330 * in the tree. The exceptions are when our path goes through slot 0, because
1331 * operations on the tree might require changing key pointers higher up in the
1332 * tree.
Chris Masond352ac62008-09-29 15:18:18 -04001333 *
Chris Masond3977122009-01-05 21:25:51 -05001334 * callers might also have set path->keep_locks, which tells this code to keep
1335 * the lock if the path points to the last slot in the block. This is part of
1336 * walking through the tree, and selecting the next slot in the higher block.
Chris Masond352ac62008-09-29 15:18:18 -04001337 *
Chris Masond3977122009-01-05 21:25:51 -05001338 * lowest_unlock sets the lowest level in the tree we're allowed to unlock. so
1339 * if lowest_unlock is 1, level 0 won't be unlocked
Chris Masond352ac62008-09-29 15:18:18 -04001340 */
Chris Masone02119d2008-09-05 16:13:11 -04001341static noinline void unlock_up(struct btrfs_path *path, int level,
Chris Masonf7c79f32012-03-19 15:54:38 -04001342 int lowest_unlock, int min_write_lock_level,
1343 int *write_lock_level)
Chris Mason925baed2008-06-25 16:01:30 -04001344{
1345 int i;
1346 int skip_level = level;
Chris Mason051e1b92008-06-25 16:01:30 -04001347 int no_skips = 0;
Chris Mason925baed2008-06-25 16:01:30 -04001348 struct extent_buffer *t;
1349
1350 for (i = level; i < BTRFS_MAX_LEVEL; i++) {
1351 if (!path->nodes[i])
1352 break;
1353 if (!path->locks[i])
1354 break;
Chris Mason051e1b92008-06-25 16:01:30 -04001355 if (!no_skips && path->slots[i] == 0) {
Chris Mason925baed2008-06-25 16:01:30 -04001356 skip_level = i + 1;
1357 continue;
1358 }
Chris Mason051e1b92008-06-25 16:01:30 -04001359 if (!no_skips && path->keep_locks) {
Chris Mason925baed2008-06-25 16:01:30 -04001360 u32 nritems;
1361 t = path->nodes[i];
1362 nritems = btrfs_header_nritems(t);
Chris Mason051e1b92008-06-25 16:01:30 -04001363 if (nritems < 1 || path->slots[i] >= nritems - 1) {
Chris Mason925baed2008-06-25 16:01:30 -04001364 skip_level = i + 1;
1365 continue;
1366 }
1367 }
Chris Mason051e1b92008-06-25 16:01:30 -04001368 if (skip_level < i && i >= lowest_unlock)
1369 no_skips = 1;
1370
Chris Mason925baed2008-06-25 16:01:30 -04001371 t = path->nodes[i];
Liu Bod80bb3f2018-05-18 11:00:24 +08001372 if (i >= lowest_unlock && i > skip_level) {
Chris Masonbd681512011-07-16 15:23:14 -04001373 btrfs_tree_unlock_rw(t, path->locks[i]);
Chris Mason925baed2008-06-25 16:01:30 -04001374 path->locks[i] = 0;
Chris Masonf7c79f32012-03-19 15:54:38 -04001375 if (write_lock_level &&
1376 i > min_write_lock_level &&
1377 i <= *write_lock_level) {
1378 *write_lock_level = i - 1;
1379 }
Chris Mason925baed2008-06-25 16:01:30 -04001380 }
1381 }
1382}
1383
Chris Mason3c69fae2007-08-07 15:52:22 -04001384/*
Chris Masonc8c42862009-04-03 10:14:18 -04001385 * helper function for btrfs_search_slot. The goal is to find a block
1386 * in cache without setting the path to blocking. If we find the block
1387 * we return zero and the path is unchanged.
1388 *
1389 * If we can't find the block, we set the path blocking and do some
1390 * reada. -EAGAIN is returned and the search must be repeated.
1391 */
1392static int
Liu Bod07b8522017-01-30 12:23:42 -08001393read_block_for_search(struct btrfs_root *root, struct btrfs_path *p,
1394 struct extent_buffer **eb_ret, int level, int slot,
David Sterbacda79c52017-02-10 18:44:32 +01001395 const struct btrfs_key *key)
Chris Masonc8c42862009-04-03 10:14:18 -04001396{
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001397 struct btrfs_fs_info *fs_info = root->fs_info;
Chris Masonc8c42862009-04-03 10:14:18 -04001398 u64 blocknr;
1399 u64 gen;
Chris Masonc8c42862009-04-03 10:14:18 -04001400 struct extent_buffer *tmp;
Qu Wenruo581c1762018-03-29 09:08:11 +08001401 struct btrfs_key first_key;
Chris Mason76a05b32009-05-14 13:24:30 -04001402 int ret;
Qu Wenruo581c1762018-03-29 09:08:11 +08001403 int parent_level;
Chris Masonc8c42862009-04-03 10:14:18 -04001404
Nikolay Borisov213ff4b2020-05-27 13:10:59 +03001405 blocknr = btrfs_node_blockptr(*eb_ret, slot);
1406 gen = btrfs_node_ptr_generation(*eb_ret, slot);
1407 parent_level = btrfs_header_level(*eb_ret);
1408 btrfs_node_key_to_cpu(*eb_ret, &first_key, slot);
Chris Masonc8c42862009-04-03 10:14:18 -04001409
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001410 tmp = find_extent_buffer(fs_info, blocknr);
Chris Masoncb449212010-10-24 11:01:27 -04001411 if (tmp) {
Filipe Mananaace75062021-03-31 11:56:21 +01001412 if (p->reada == READA_FORWARD_ALWAYS)
1413 reada_for_search(fs_info, p, level, slot, key->objectid);
1414
Chris Masonb9fab912012-05-06 07:23:47 -04001415 /* first we do an atomic uptodate check */
Josef Bacikbdf7c002013-06-17 13:44:48 -04001416 if (btrfs_buffer_uptodate(tmp, gen, 1) > 0) {
Qu Wenruo448de472019-03-12 17:10:40 +08001417 /*
1418 * Do extra check for first_key, eb can be stale due to
1419 * being cached, read from scrub, or have multiple
1420 * parents (shared tree blocks).
1421 */
David Sterbae064d5e2019-03-20 14:58:13 +01001422 if (btrfs_verify_level_key(tmp,
Qu Wenruo448de472019-03-12 17:10:40 +08001423 parent_level - 1, &first_key, gen)) {
1424 free_extent_buffer(tmp);
1425 return -EUCLEAN;
1426 }
Josef Bacikbdf7c002013-06-17 13:44:48 -04001427 *eb_ret = tmp;
1428 return 0;
Chris Masoncb449212010-10-24 11:01:27 -04001429 }
Josef Bacikbdf7c002013-06-17 13:44:48 -04001430
Josef Bacikbdf7c002013-06-17 13:44:48 -04001431 /* now we're allowed to do a blocking uptodate check */
Qu Wenruo581c1762018-03-29 09:08:11 +08001432 ret = btrfs_read_buffer(tmp, gen, parent_level - 1, &first_key);
Josef Bacikbdf7c002013-06-17 13:44:48 -04001433 if (!ret) {
1434 *eb_ret = tmp;
1435 return 0;
1436 }
1437 free_extent_buffer(tmp);
1438 btrfs_release_path(p);
1439 return -EIO;
Chris Masonc8c42862009-04-03 10:14:18 -04001440 }
1441
1442 /*
1443 * reduce lock contention at high levels
1444 * of the btree by dropping locks before
Chris Mason76a05b32009-05-14 13:24:30 -04001445 * we read. Don't release the lock on the current
1446 * level because we need to walk this node to figure
1447 * out which blocks to read.
Chris Masonc8c42862009-04-03 10:14:18 -04001448 */
Chris Mason8c594ea2009-04-20 15:50:10 -04001449 btrfs_unlock_up_safe(p, level + 1);
Chris Mason8c594ea2009-04-20 15:50:10 -04001450
David Sterbae4058b52015-11-27 16:31:35 +01001451 if (p->reada != READA_NONE)
Jeff Mahoney2ff7e612016-06-22 18:54:24 -04001452 reada_for_search(fs_info, p, level, slot, key->objectid);
Chris Masonc8c42862009-04-03 10:14:18 -04001453
Chris Mason76a05b32009-05-14 13:24:30 -04001454 ret = -EAGAIN;
Josef Bacik1b7ec852020-11-05 10:45:18 -05001455 tmp = read_tree_block(fs_info, blocknr, root->root_key.objectid,
1456 gen, parent_level - 1, &first_key);
Liu Bo64c043d2015-05-25 17:30:15 +08001457 if (!IS_ERR(tmp)) {
Chris Mason76a05b32009-05-14 13:24:30 -04001458 /*
1459 * If the read above didn't mark this buffer up to date,
1460 * it will never end up being up to date. Set ret to EIO now
1461 * and give up so that our caller doesn't loop forever
1462 * on our EAGAINs.
1463 */
Liu Boe6a1d6f2018-05-18 11:00:20 +08001464 if (!extent_buffer_uptodate(tmp))
Chris Mason76a05b32009-05-14 13:24:30 -04001465 ret = -EIO;
Chris Masonc8c42862009-04-03 10:14:18 -04001466 free_extent_buffer(tmp);
Liu Boc871b0f2016-06-06 12:01:23 -07001467 } else {
1468 ret = PTR_ERR(tmp);
Chris Mason76a05b32009-05-14 13:24:30 -04001469 }
Liu Bo02a33072018-05-16 01:37:36 +08001470
1471 btrfs_release_path(p);
Chris Mason76a05b32009-05-14 13:24:30 -04001472 return ret;
Chris Masonc8c42862009-04-03 10:14:18 -04001473}
1474
1475/*
1476 * helper function for btrfs_search_slot. This does all of the checks
1477 * for node-level blocks and does any balancing required based on
1478 * the ins_len.
1479 *
1480 * If no extra work was required, zero is returned. If we had to
1481 * drop the path, -EAGAIN is returned and btrfs_search_slot must
1482 * start over
1483 */
1484static int
1485setup_nodes_for_search(struct btrfs_trans_handle *trans,
1486 struct btrfs_root *root, struct btrfs_path *p,
Chris Masonbd681512011-07-16 15:23:14 -04001487 struct extent_buffer *b, int level, int ins_len,
1488 int *write_lock_level)
Chris Masonc8c42862009-04-03 10:14:18 -04001489{
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001490 struct btrfs_fs_info *fs_info = root->fs_info;
Nikolay Borisov95b982d2020-11-13 09:29:40 +02001491 int ret = 0;
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001492
Chris Masonc8c42862009-04-03 10:14:18 -04001493 if ((p->search_for_split || ins_len > 0) && btrfs_header_nritems(b) >=
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001494 BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 3) {
Chris Masonc8c42862009-04-03 10:14:18 -04001495
Chris Masonbd681512011-07-16 15:23:14 -04001496 if (*write_lock_level < level + 1) {
1497 *write_lock_level = level + 1;
1498 btrfs_release_path(p);
Nikolay Borisov95b982d2020-11-13 09:29:40 +02001499 return -EAGAIN;
Chris Masonbd681512011-07-16 15:23:14 -04001500 }
1501
Josef Bacikbfb484d2020-11-05 10:45:09 -05001502 reada_for_balance(p, level);
Nikolay Borisov95b982d2020-11-13 09:29:40 +02001503 ret = split_node(trans, root, p, level);
Chris Masonc8c42862009-04-03 10:14:18 -04001504
Chris Masonc8c42862009-04-03 10:14:18 -04001505 b = p->nodes[level];
1506 } else if (ins_len < 0 && btrfs_header_nritems(b) <
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001507 BTRFS_NODEPTRS_PER_BLOCK(fs_info) / 2) {
Chris Masonc8c42862009-04-03 10:14:18 -04001508
Chris Masonbd681512011-07-16 15:23:14 -04001509 if (*write_lock_level < level + 1) {
1510 *write_lock_level = level + 1;
1511 btrfs_release_path(p);
Nikolay Borisov95b982d2020-11-13 09:29:40 +02001512 return -EAGAIN;
Chris Masonbd681512011-07-16 15:23:14 -04001513 }
1514
Josef Bacikbfb484d2020-11-05 10:45:09 -05001515 reada_for_balance(p, level);
Nikolay Borisov95b982d2020-11-13 09:29:40 +02001516 ret = balance_level(trans, root, p, level);
1517 if (ret)
1518 return ret;
Chris Masonc8c42862009-04-03 10:14:18 -04001519
Chris Masonc8c42862009-04-03 10:14:18 -04001520 b = p->nodes[level];
1521 if (!b) {
David Sterbab3b4aa72011-04-21 01:20:15 +02001522 btrfs_release_path(p);
Nikolay Borisov95b982d2020-11-13 09:29:40 +02001523 return -EAGAIN;
Chris Masonc8c42862009-04-03 10:14:18 -04001524 }
1525 BUG_ON(btrfs_header_nritems(b) == 1);
1526 }
Chris Masonc8c42862009-04-03 10:14:18 -04001527 return ret;
1528}
1529
David Sterba381cf652015-01-02 18:45:16 +01001530int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *path,
Kelley Nielsene33d5c32013-11-04 19:33:33 -08001531 u64 iobjectid, u64 ioff, u8 key_type,
1532 struct btrfs_key *found_key)
1533{
1534 int ret;
1535 struct btrfs_key key;
1536 struct extent_buffer *eb;
David Sterba381cf652015-01-02 18:45:16 +01001537
1538 ASSERT(path);
David Sterba1d4c08e2015-01-02 19:36:14 +01001539 ASSERT(found_key);
Kelley Nielsene33d5c32013-11-04 19:33:33 -08001540
1541 key.type = key_type;
1542 key.objectid = iobjectid;
1543 key.offset = ioff;
1544
1545 ret = btrfs_search_slot(NULL, fs_root, &key, path, 0, 0);
David Sterba1d4c08e2015-01-02 19:36:14 +01001546 if (ret < 0)
Kelley Nielsene33d5c32013-11-04 19:33:33 -08001547 return ret;
1548
1549 eb = path->nodes[0];
1550 if (ret && path->slots[0] >= btrfs_header_nritems(eb)) {
1551 ret = btrfs_next_leaf(fs_root, path);
1552 if (ret)
1553 return ret;
1554 eb = path->nodes[0];
1555 }
1556
1557 btrfs_item_key_to_cpu(eb, found_key, path->slots[0]);
1558 if (found_key->type != key.type ||
1559 found_key->objectid != key.objectid)
1560 return 1;
1561
1562 return 0;
1563}
1564
Liu Bo1fc28d82018-05-18 11:00:21 +08001565static struct extent_buffer *btrfs_search_slot_get_root(struct btrfs_root *root,
1566 struct btrfs_path *p,
1567 int write_lock_level)
1568{
1569 struct btrfs_fs_info *fs_info = root->fs_info;
1570 struct extent_buffer *b;
1571 int root_lock;
1572 int level = 0;
1573
1574 /* We try very hard to do read locks on the root */
1575 root_lock = BTRFS_READ_LOCK;
1576
1577 if (p->search_commit_root) {
Filipe Mananabe6821f2018-12-11 10:19:45 +00001578 /*
1579 * The commit roots are read only so we always do read locks,
1580 * and we always must hold the commit_root_sem when doing
1581 * searches on them, the only exception is send where we don't
1582 * want to block transaction commits for a long time, so
1583 * we need to clone the commit root in order to avoid races
1584 * with transaction commits that create a snapshot of one of
1585 * the roots used by a send operation.
1586 */
1587 if (p->need_commit_sem) {
Liu Bo1fc28d82018-05-18 11:00:21 +08001588 down_read(&fs_info->commit_root_sem);
Filipe Mananabe6821f2018-12-11 10:19:45 +00001589 b = btrfs_clone_extent_buffer(root->commit_root);
Liu Bo1fc28d82018-05-18 11:00:21 +08001590 up_read(&fs_info->commit_root_sem);
Filipe Mananabe6821f2018-12-11 10:19:45 +00001591 if (!b)
1592 return ERR_PTR(-ENOMEM);
1593
1594 } else {
1595 b = root->commit_root;
David Sterba67439da2019-10-08 13:28:47 +02001596 atomic_inc(&b->refs);
Filipe Mananabe6821f2018-12-11 10:19:45 +00001597 }
1598 level = btrfs_header_level(b);
Liu Bof9ddfd02018-05-29 21:27:06 +08001599 /*
1600 * Ensure that all callers have set skip_locking when
1601 * p->search_commit_root = 1.
1602 */
1603 ASSERT(p->skip_locking == 1);
Liu Bo1fc28d82018-05-18 11:00:21 +08001604
1605 goto out;
1606 }
1607
1608 if (p->skip_locking) {
1609 b = btrfs_root_node(root);
1610 level = btrfs_header_level(b);
1611 goto out;
1612 }
1613
1614 /*
Liu Bo662c6532018-05-18 11:00:23 +08001615 * If the level is set to maximum, we can skip trying to get the read
1616 * lock.
Liu Bo1fc28d82018-05-18 11:00:21 +08001617 */
Liu Bo662c6532018-05-18 11:00:23 +08001618 if (write_lock_level < BTRFS_MAX_LEVEL) {
1619 /*
1620 * We don't know the level of the root node until we actually
1621 * have it read locked
1622 */
Josef Bacik1bb96592020-11-06 16:27:33 -05001623 b = btrfs_read_lock_root_node(root);
Liu Bo662c6532018-05-18 11:00:23 +08001624 level = btrfs_header_level(b);
1625 if (level > write_lock_level)
1626 goto out;
Liu Bo1fc28d82018-05-18 11:00:21 +08001627
Liu Bo662c6532018-05-18 11:00:23 +08001628 /* Whoops, must trade for write lock */
1629 btrfs_tree_read_unlock(b);
1630 free_extent_buffer(b);
1631 }
1632
Liu Bo1fc28d82018-05-18 11:00:21 +08001633 b = btrfs_lock_root_node(root);
1634 root_lock = BTRFS_WRITE_LOCK;
1635
1636 /* The level might have changed, check again */
1637 level = btrfs_header_level(b);
1638
1639out:
1640 p->nodes[level] = b;
1641 if (!p->skip_locking)
1642 p->locks[level] = root_lock;
1643 /*
1644 * Callers are responsible for dropping b's references.
1645 */
1646 return b;
1647}
1648
1649
Chris Masonc8c42862009-04-03 10:14:18 -04001650/*
Nikolay Borisov4271ece2017-12-13 09:38:14 +02001651 * btrfs_search_slot - look for a key in a tree and perform necessary
1652 * modifications to preserve tree invariants.
Chris Mason74123bd2007-02-02 11:05:29 -05001653 *
Nikolay Borisov4271ece2017-12-13 09:38:14 +02001654 * @trans: Handle of transaction, used when modifying the tree
1655 * @p: Holds all btree nodes along the search path
1656 * @root: The root node of the tree
1657 * @key: The key we are looking for
ethanwu9a664972020-12-01 17:25:12 +08001658 * @ins_len: Indicates purpose of search:
1659 * >0 for inserts it's size of item inserted (*)
1660 * <0 for deletions
1661 * 0 for plain searches, not modifying the tree
1662 *
1663 * (*) If size of item inserted doesn't include
1664 * sizeof(struct btrfs_item), then p->search_for_extension must
1665 * be set.
Nikolay Borisov4271ece2017-12-13 09:38:14 +02001666 * @cow: boolean should CoW operations be performed. Must always be 1
1667 * when modifying the tree.
Chris Mason97571fd2007-02-24 13:39:08 -05001668 *
Nikolay Borisov4271ece2017-12-13 09:38:14 +02001669 * If @ins_len > 0, nodes and leaves will be split as we walk down the tree.
1670 * If @ins_len < 0, nodes will be merged as we walk down the tree (if possible)
1671 *
1672 * If @key is found, 0 is returned and you can find the item in the leaf level
1673 * of the path (level 0)
1674 *
1675 * If @key isn't found, 1 is returned and the leaf level of the path (level 0)
1676 * points to the slot where it should be inserted
1677 *
1678 * If an error is encountered while searching the tree a negative error number
1679 * is returned
Chris Mason74123bd2007-02-02 11:05:29 -05001680 */
Omar Sandoval310712b2017-01-17 23:24:37 -08001681int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root *root,
1682 const struct btrfs_key *key, struct btrfs_path *p,
1683 int ins_len, int cow)
Chris Masonbe0e5c02007-01-26 15:51:26 -05001684{
Chris Mason5f39d392007-10-15 16:14:19 -04001685 struct extent_buffer *b;
Chris Masonbe0e5c02007-01-26 15:51:26 -05001686 int slot;
1687 int ret;
Yan Zheng33c66f42009-07-22 09:59:00 -04001688 int err;
Chris Masonbe0e5c02007-01-26 15:51:26 -05001689 int level;
Chris Mason925baed2008-06-25 16:01:30 -04001690 int lowest_unlock = 1;
Chris Masonbd681512011-07-16 15:23:14 -04001691 /* everything at write_lock_level or lower must be write locked */
1692 int write_lock_level = 0;
Chris Mason9f3a7422007-08-07 15:52:19 -04001693 u8 lowest_level = 0;
Chris Masonf7c79f32012-03-19 15:54:38 -04001694 int min_write_lock_level;
Filipe David Borba Mananad7396f02013-08-30 15:46:43 +01001695 int prev_cmp;
Chris Mason9f3a7422007-08-07 15:52:19 -04001696
Chris Mason6702ed42007-08-07 16:15:09 -04001697 lowest_level = p->lowest_level;
Chris Mason323ac952008-10-01 19:05:46 -04001698 WARN_ON(lowest_level && ins_len > 0);
Chris Mason22b0ebd2007-03-30 08:47:31 -04001699 WARN_ON(p->nodes[0] != NULL);
Filipe David Borba Mananaeb653de2013-12-23 11:53:02 +00001700 BUG_ON(!cow && ins_len);
Josef Bacik25179202008-10-29 14:49:05 -04001701
Chris Masonbd681512011-07-16 15:23:14 -04001702 if (ins_len < 0) {
Chris Mason925baed2008-06-25 16:01:30 -04001703 lowest_unlock = 2;
Chris Mason65b51a02008-08-01 15:11:20 -04001704
Chris Masonbd681512011-07-16 15:23:14 -04001705 /* when we are removing items, we might have to go up to level
1706 * two as we update tree pointers Make sure we keep write
1707 * for those levels as well
1708 */
1709 write_lock_level = 2;
1710 } else if (ins_len > 0) {
1711 /*
1712 * for inserting items, make sure we have a write lock on
1713 * level 1 so we can update keys
1714 */
1715 write_lock_level = 1;
1716 }
1717
1718 if (!cow)
1719 write_lock_level = -1;
1720
Josef Bacik09a2a8f92013-04-05 16:51:15 -04001721 if (cow && (p->keep_locks || p->lowest_level))
Chris Masonbd681512011-07-16 15:23:14 -04001722 write_lock_level = BTRFS_MAX_LEVEL;
1723
Chris Masonf7c79f32012-03-19 15:54:38 -04001724 min_write_lock_level = write_lock_level;
1725
Chris Masonbb803952007-03-01 12:04:21 -05001726again:
Filipe David Borba Mananad7396f02013-08-30 15:46:43 +01001727 prev_cmp = -1;
Liu Bo1fc28d82018-05-18 11:00:21 +08001728 b = btrfs_search_slot_get_root(root, p, write_lock_level);
Filipe Mananabe6821f2018-12-11 10:19:45 +00001729 if (IS_ERR(b)) {
1730 ret = PTR_ERR(b);
1731 goto done;
1732 }
Chris Mason925baed2008-06-25 16:01:30 -04001733
Chris Masoneb60cea2007-02-02 09:18:22 -05001734 while (b) {
Qu Wenruof624d972019-09-10 15:40:17 +08001735 int dec = 0;
1736
Chris Mason5f39d392007-10-15 16:14:19 -04001737 level = btrfs_header_level(b);
Chris Mason65b51a02008-08-01 15:11:20 -04001738
Chris Mason02217ed2007-03-02 16:08:05 -05001739 if (cow) {
Nikolay Borisov9ea2c7c2017-12-12 11:14:49 +02001740 bool last_level = (level == (BTRFS_MAX_LEVEL - 1));
1741
Chris Masonc8c42862009-04-03 10:14:18 -04001742 /*
1743 * if we don't really need to cow this block
1744 * then we don't want to set the path blocking,
1745 * so we test it here
1746 */
Josef Bacik5963ffca2021-05-20 11:21:31 -04001747 if (!should_cow_block(trans, root, b))
Chris Mason65b51a02008-08-01 15:11:20 -04001748 goto cow_done;
Yan Zheng5d4f98a2009-06-10 10:45:14 -04001749
Chris Masonbd681512011-07-16 15:23:14 -04001750 /*
1751 * must have write locks on this node and the
1752 * parent
1753 */
Josef Bacik5124e002012-11-07 13:44:13 -05001754 if (level > write_lock_level ||
1755 (level + 1 > write_lock_level &&
1756 level + 1 < BTRFS_MAX_LEVEL &&
1757 p->nodes[level + 1])) {
Chris Masonbd681512011-07-16 15:23:14 -04001758 write_lock_level = level + 1;
1759 btrfs_release_path(p);
1760 goto again;
1761 }
1762
Nikolay Borisov9ea2c7c2017-12-12 11:14:49 +02001763 if (last_level)
1764 err = btrfs_cow_block(trans, root, b, NULL, 0,
Josef Bacik9631e4c2020-08-20 11:46:03 -04001765 &b,
1766 BTRFS_NESTING_COW);
Nikolay Borisov9ea2c7c2017-12-12 11:14:49 +02001767 else
1768 err = btrfs_cow_block(trans, root, b,
1769 p->nodes[level + 1],
Josef Bacik9631e4c2020-08-20 11:46:03 -04001770 p->slots[level + 1], &b,
1771 BTRFS_NESTING_COW);
Yan Zheng33c66f42009-07-22 09:59:00 -04001772 if (err) {
Yan Zheng33c66f42009-07-22 09:59:00 -04001773 ret = err;
Chris Mason65b51a02008-08-01 15:11:20 -04001774 goto done;
Chris Mason54aa1f42007-06-22 14:16:25 -04001775 }
Chris Mason02217ed2007-03-02 16:08:05 -05001776 }
Chris Mason65b51a02008-08-01 15:11:20 -04001777cow_done:
Chris Masoneb60cea2007-02-02 09:18:22 -05001778 p->nodes[level] = b;
Liu Bo52398342018-08-22 05:54:37 +08001779 /*
1780 * Leave path with blocking locks to avoid massive
1781 * lock context switch, this is made on purpose.
1782 */
Chris Masonb4ce94d2009-02-04 09:25:08 -05001783
1784 /*
1785 * we have a lock on b and as long as we aren't changing
1786 * the tree, there is no way to for the items in b to change.
1787 * It is safe to drop the lock on our parent before we
1788 * go through the expensive btree search on b.
1789 *
Filipe David Borba Mananaeb653de2013-12-23 11:53:02 +00001790 * If we're inserting or deleting (ins_len != 0), then we might
1791 * be changing slot zero, which may require changing the parent.
1792 * So, we can't drop the lock until after we know which slot
1793 * we're operating on.
Chris Masonb4ce94d2009-02-04 09:25:08 -05001794 */
Filipe David Borba Mananaeb653de2013-12-23 11:53:02 +00001795 if (!ins_len && !p->keep_locks) {
1796 int u = level + 1;
1797
1798 if (u < BTRFS_MAX_LEVEL && p->locks[u]) {
1799 btrfs_tree_unlock_rw(p->nodes[u], p->locks[u]);
1800 p->locks[u] = 0;
1801 }
1802 }
Chris Masonb4ce94d2009-02-04 09:25:08 -05001803
Nikolay Borisov995e9a12020-05-27 13:10:53 +03001804 /*
1805 * If btrfs_bin_search returns an exact match (prev_cmp == 0)
1806 * we can safely assume the target key will always be in slot 0
1807 * on lower levels due to the invariants BTRFS' btree provides,
1808 * namely that a btrfs_key_ptr entry always points to the
1809 * lowest key in the child node, thus we can skip searching
1810 * lower levels
1811 */
1812 if (prev_cmp == 0) {
1813 slot = 0;
1814 ret = 0;
1815 } else {
1816 ret = btrfs_bin_search(b, key, &slot);
1817 prev_cmp = ret;
1818 if (ret < 0)
1819 goto done;
1820 }
Chris Masonb4ce94d2009-02-04 09:25:08 -05001821
Qu Wenruof624d972019-09-10 15:40:17 +08001822 if (level == 0) {
Chris Masonbe0e5c02007-01-26 15:51:26 -05001823 p->slots[level] = slot;
ethanwu9a664972020-12-01 17:25:12 +08001824 /*
1825 * Item key already exists. In this case, if we are
1826 * allowed to insert the item (for example, in dir_item
1827 * case, item key collision is allowed), it will be
1828 * merged with the original item. Only the item size
1829 * grows, no new btrfs item will be added. If
1830 * search_for_extension is not set, ins_len already
1831 * accounts the size btrfs_item, deduct it here so leaf
1832 * space check will be correct.
1833 */
1834 if (ret == 0 && ins_len > 0 && !p->search_for_extension) {
1835 ASSERT(ins_len >= sizeof(struct btrfs_item));
1836 ins_len -= sizeof(struct btrfs_item);
1837 }
Yan Zheng87b29b22008-12-17 10:21:48 -05001838 if (ins_len > 0 &&
David Sterbae902baa2019-03-20 14:36:46 +01001839 btrfs_leaf_free_space(b) < ins_len) {
Chris Masonbd681512011-07-16 15:23:14 -04001840 if (write_lock_level < 1) {
1841 write_lock_level = 1;
1842 btrfs_release_path(p);
1843 goto again;
1844 }
1845
Yan Zheng33c66f42009-07-22 09:59:00 -04001846 err = split_leaf(trans, root, key,
1847 p, ins_len, ret == 0);
Chris Masonb4ce94d2009-02-04 09:25:08 -05001848
Yan Zheng33c66f42009-07-22 09:59:00 -04001849 BUG_ON(err > 0);
1850 if (err) {
1851 ret = err;
Chris Mason65b51a02008-08-01 15:11:20 -04001852 goto done;
1853 }
Chris Mason5c680ed2007-02-22 11:39:13 -05001854 }
Chris Mason459931e2008-12-10 09:10:46 -05001855 if (!p->search_for_split)
Chris Masonf7c79f32012-03-19 15:54:38 -04001856 unlock_up(p, level, lowest_unlock,
Liu Bo4b6f8e92018-08-14 10:46:53 +08001857 min_write_lock_level, NULL);
Chris Mason65b51a02008-08-01 15:11:20 -04001858 goto done;
Chris Masonbe0e5c02007-01-26 15:51:26 -05001859 }
Qu Wenruof624d972019-09-10 15:40:17 +08001860 if (ret && slot > 0) {
1861 dec = 1;
1862 slot--;
1863 }
1864 p->slots[level] = slot;
1865 err = setup_nodes_for_search(trans, root, p, b, level, ins_len,
1866 &write_lock_level);
1867 if (err == -EAGAIN)
1868 goto again;
1869 if (err) {
1870 ret = err;
1871 goto done;
1872 }
1873 b = p->nodes[level];
1874 slot = p->slots[level];
1875
1876 /*
1877 * Slot 0 is special, if we change the key we have to update
1878 * the parent pointer which means we must have a write lock on
1879 * the parent
1880 */
1881 if (slot == 0 && ins_len && write_lock_level < level + 1) {
1882 write_lock_level = level + 1;
1883 btrfs_release_path(p);
1884 goto again;
1885 }
1886
1887 unlock_up(p, level, lowest_unlock, min_write_lock_level,
1888 &write_lock_level);
1889
1890 if (level == lowest_level) {
1891 if (dec)
1892 p->slots[level]++;
1893 goto done;
1894 }
1895
1896 err = read_block_for_search(root, p, &b, level, slot, key);
1897 if (err == -EAGAIN)
1898 goto again;
1899 if (err) {
1900 ret = err;
1901 goto done;
1902 }
1903
1904 if (!p->skip_locking) {
1905 level = btrfs_header_level(b);
1906 if (level <= write_lock_level) {
Josef Bacikac5887c2020-08-20 11:46:10 -04001907 btrfs_tree_lock(b);
Qu Wenruof624d972019-09-10 15:40:17 +08001908 p->locks[level] = BTRFS_WRITE_LOCK;
1909 } else {
Josef Bacikfe596ca2020-11-06 16:27:34 -05001910 btrfs_tree_read_lock(b);
Qu Wenruof624d972019-09-10 15:40:17 +08001911 p->locks[level] = BTRFS_READ_LOCK;
1912 }
1913 p->nodes[level] = b;
1914 }
Chris Masonbe0e5c02007-01-26 15:51:26 -05001915 }
Chris Mason65b51a02008-08-01 15:11:20 -04001916 ret = 1;
1917done:
Filipe Manana5f5bc6b2014-11-09 08:38:39 +00001918 if (ret < 0 && !p->skip_release_on_error)
David Sterbab3b4aa72011-04-21 01:20:15 +02001919 btrfs_release_path(p);
Chris Mason65b51a02008-08-01 15:11:20 -04001920 return ret;
Chris Masonbe0e5c02007-01-26 15:51:26 -05001921}
Josef Bacikf75e2b72020-12-16 11:18:43 -05001922ALLOW_ERROR_INJECTION(btrfs_search_slot, ERRNO);
Chris Masonbe0e5c02007-01-26 15:51:26 -05001923
Chris Mason74123bd2007-02-02 11:05:29 -05001924/*
Jan Schmidt5d9e75c42012-05-16 18:25:47 +02001925 * Like btrfs_search_slot, this looks for a key in the given tree. It uses the
1926 * current state of the tree together with the operations recorded in the tree
1927 * modification log to search for the key in a previous version of this tree, as
1928 * denoted by the time_seq parameter.
1929 *
1930 * Naturally, there is no support for insert, delete or cow operations.
1931 *
1932 * The resulting path and return value will be set up as if we called
1933 * btrfs_search_slot at that point in time with ins_len and cow both set to 0.
1934 */
Omar Sandoval310712b2017-01-17 23:24:37 -08001935int btrfs_search_old_slot(struct btrfs_root *root, const struct btrfs_key *key,
Jan Schmidt5d9e75c42012-05-16 18:25:47 +02001936 struct btrfs_path *p, u64 time_seq)
1937{
Jeff Mahoney0b246af2016-06-22 18:54:23 -04001938 struct btrfs_fs_info *fs_info = root->fs_info;
Jan Schmidt5d9e75c42012-05-16 18:25:47 +02001939 struct extent_buffer *b;
1940 int slot;
1941 int ret;
1942 int err;
1943 int level;
1944 int lowest_unlock = 1;
1945 u8 lowest_level = 0;
1946
1947 lowest_level = p->lowest_level;
1948 WARN_ON(p->nodes[0] != NULL);
1949
1950 if (p->search_commit_root) {
1951 BUG_ON(time_seq);
1952 return btrfs_search_slot(NULL, root, key, p, 0, 0);
1953 }
1954
1955again:
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00001956 b = btrfs_get_old_root(root, time_seq);
Nikolay Borisov315bed42018-09-13 11:35:10 +03001957 if (!b) {
1958 ret = -EIO;
1959 goto done;
1960 }
Jan Schmidt5d9e75c42012-05-16 18:25:47 +02001961 level = btrfs_header_level(b);
Jan Schmidt5d9e75c42012-05-16 18:25:47 +02001962 p->locks[level] = BTRFS_READ_LOCK;
1963
1964 while (b) {
Qu Wenruoabe93392019-09-10 15:40:18 +08001965 int dec = 0;
1966
Jan Schmidt5d9e75c42012-05-16 18:25:47 +02001967 level = btrfs_header_level(b);
1968 p->nodes[level] = b;
Jan Schmidt5d9e75c42012-05-16 18:25:47 +02001969
1970 /*
1971 * we have a lock on b and as long as we aren't changing
1972 * the tree, there is no way to for the items in b to change.
1973 * It is safe to drop the lock on our parent before we
1974 * go through the expensive btree search on b.
1975 */
1976 btrfs_unlock_up_safe(p, level + 1);
1977
Nikolay Borisov995e9a12020-05-27 13:10:53 +03001978 ret = btrfs_bin_search(b, key, &slot);
Filipe Mananacbca7d52019-02-18 16:57:26 +00001979 if (ret < 0)
1980 goto done;
Jan Schmidt5d9e75c42012-05-16 18:25:47 +02001981
Qu Wenruoabe93392019-09-10 15:40:18 +08001982 if (level == 0) {
Jan Schmidt5d9e75c42012-05-16 18:25:47 +02001983 p->slots[level] = slot;
1984 unlock_up(p, level, lowest_unlock, 0, NULL);
1985 goto done;
1986 }
Qu Wenruoabe93392019-09-10 15:40:18 +08001987
1988 if (ret && slot > 0) {
1989 dec = 1;
1990 slot--;
1991 }
1992 p->slots[level] = slot;
1993 unlock_up(p, level, lowest_unlock, 0, NULL);
1994
1995 if (level == lowest_level) {
1996 if (dec)
1997 p->slots[level]++;
1998 goto done;
1999 }
2000
2001 err = read_block_for_search(root, p, &b, level, slot, key);
2002 if (err == -EAGAIN)
2003 goto again;
2004 if (err) {
2005 ret = err;
2006 goto done;
2007 }
2008
2009 level = btrfs_header_level(b);
Josef Bacikac5887c2020-08-20 11:46:10 -04002010 btrfs_tree_read_lock(b);
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00002011 b = btrfs_tree_mod_log_rewind(fs_info, p, b, time_seq);
Qu Wenruoabe93392019-09-10 15:40:18 +08002012 if (!b) {
2013 ret = -ENOMEM;
2014 goto done;
2015 }
2016 p->locks[level] = BTRFS_READ_LOCK;
2017 p->nodes[level] = b;
Jan Schmidt5d9e75c42012-05-16 18:25:47 +02002018 }
2019 ret = 1;
2020done:
Jan Schmidt5d9e75c42012-05-16 18:25:47 +02002021 if (ret < 0)
2022 btrfs_release_path(p);
2023
2024 return ret;
2025}
2026
2027/*
Arne Jansen2f38b3e2011-09-13 11:18:10 +02002028 * helper to use instead of search slot if no exact match is needed but
2029 * instead the next or previous item should be returned.
2030 * When find_higher is true, the next higher item is returned, the next lower
2031 * otherwise.
2032 * When return_any and find_higher are both true, and no higher item is found,
2033 * return the next lower instead.
2034 * When return_any is true and find_higher is false, and no lower item is found,
2035 * return the next higher instead.
2036 * It returns 0 if any item is found, 1 if none is found (tree empty), and
2037 * < 0 on error
2038 */
2039int btrfs_search_slot_for_read(struct btrfs_root *root,
Omar Sandoval310712b2017-01-17 23:24:37 -08002040 const struct btrfs_key *key,
2041 struct btrfs_path *p, int find_higher,
2042 int return_any)
Arne Jansen2f38b3e2011-09-13 11:18:10 +02002043{
2044 int ret;
2045 struct extent_buffer *leaf;
2046
2047again:
2048 ret = btrfs_search_slot(NULL, root, key, p, 0, 0);
2049 if (ret <= 0)
2050 return ret;
2051 /*
2052 * a return value of 1 means the path is at the position where the
2053 * item should be inserted. Normally this is the next bigger item,
2054 * but in case the previous item is the last in a leaf, path points
2055 * to the first free slot in the previous leaf, i.e. at an invalid
2056 * item.
2057 */
2058 leaf = p->nodes[0];
2059
2060 if (find_higher) {
2061 if (p->slots[0] >= btrfs_header_nritems(leaf)) {
2062 ret = btrfs_next_leaf(root, p);
2063 if (ret <= 0)
2064 return ret;
2065 if (!return_any)
2066 return 1;
2067 /*
2068 * no higher item found, return the next
2069 * lower instead
2070 */
2071 return_any = 0;
2072 find_higher = 0;
2073 btrfs_release_path(p);
2074 goto again;
2075 }
2076 } else {
Arne Jansene6793762011-09-13 11:18:10 +02002077 if (p->slots[0] == 0) {
2078 ret = btrfs_prev_leaf(root, p);
2079 if (ret < 0)
2080 return ret;
2081 if (!ret) {
Filipe David Borba Manana23c6bf62014-01-11 21:28:54 +00002082 leaf = p->nodes[0];
2083 if (p->slots[0] == btrfs_header_nritems(leaf))
2084 p->slots[0]--;
Arne Jansene6793762011-09-13 11:18:10 +02002085 return 0;
Arne Jansen2f38b3e2011-09-13 11:18:10 +02002086 }
Arne Jansene6793762011-09-13 11:18:10 +02002087 if (!return_any)
2088 return 1;
2089 /*
2090 * no lower item found, return the next
2091 * higher instead
2092 */
2093 return_any = 0;
2094 find_higher = 1;
2095 btrfs_release_path(p);
2096 goto again;
2097 } else {
Arne Jansen2f38b3e2011-09-13 11:18:10 +02002098 --p->slots[0];
2099 }
2100 }
2101 return 0;
2102}
2103
2104/*
Marcos Paulo de Souza0ff40a92021-07-29 05:22:16 -03002105 * Execute search and call btrfs_previous_item to traverse backwards if the item
2106 * was not found.
2107 *
2108 * Return 0 if found, 1 if not found and < 0 if error.
2109 */
2110int btrfs_search_backwards(struct btrfs_root *root, struct btrfs_key *key,
2111 struct btrfs_path *path)
2112{
2113 int ret;
2114
2115 ret = btrfs_search_slot(NULL, root, key, path, 0, 0);
2116 if (ret > 0)
2117 ret = btrfs_previous_item(root, path, key->objectid, key->type);
2118
2119 if (ret == 0)
2120 btrfs_item_key_to_cpu(path->nodes[0], key, path->slots[0]);
2121
2122 return ret;
2123}
2124
2125/*
Chris Mason74123bd2007-02-02 11:05:29 -05002126 * adjust the pointers going up the tree, starting at level
2127 * making sure the right key of each node is points to 'key'.
2128 * This is used after shifting pointers to the left, so it stops
2129 * fixing up pointers when a given leaf/node is not in slot 0 of the
2130 * higher levels
Chris Masonaa5d6be2007-02-28 16:35:06 -05002131 *
Chris Mason74123bd2007-02-02 11:05:29 -05002132 */
Nikolay Borisovb167fa92018-06-20 15:48:47 +03002133static void fixup_low_keys(struct btrfs_path *path,
Jeff Mahoney143bede2012-03-01 14:56:26 +01002134 struct btrfs_disk_key *key, int level)
Chris Masonbe0e5c02007-01-26 15:51:26 -05002135{
2136 int i;
Chris Mason5f39d392007-10-15 16:14:19 -04002137 struct extent_buffer *t;
David Sterba0e82bcf2018-03-05 16:16:54 +01002138 int ret;
Chris Mason5f39d392007-10-15 16:14:19 -04002139
Chris Mason234b63a2007-03-13 10:46:10 -04002140 for (i = level; i < BTRFS_MAX_LEVEL; i++) {
Chris Masonbe0e5c02007-01-26 15:51:26 -05002141 int tslot = path->slots[i];
David Sterba0e82bcf2018-03-05 16:16:54 +01002142
Chris Masoneb60cea2007-02-02 09:18:22 -05002143 if (!path->nodes[i])
Chris Masonbe0e5c02007-01-26 15:51:26 -05002144 break;
Chris Mason5f39d392007-10-15 16:14:19 -04002145 t = path->nodes[i];
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00002146 ret = btrfs_tree_mod_log_insert_key(t, tslot,
2147 BTRFS_MOD_LOG_KEY_REPLACE, GFP_ATOMIC);
David Sterba0e82bcf2018-03-05 16:16:54 +01002148 BUG_ON(ret < 0);
Chris Mason5f39d392007-10-15 16:14:19 -04002149 btrfs_set_node_key(t, key, tslot);
Chris Masond6025572007-03-30 14:27:56 -04002150 btrfs_mark_buffer_dirty(path->nodes[i]);
Chris Masonbe0e5c02007-01-26 15:51:26 -05002151 if (tslot != 0)
2152 break;
2153 }
2154}
2155
Chris Mason74123bd2007-02-02 11:05:29 -05002156/*
Zheng Yan31840ae2008-09-23 13:14:14 -04002157 * update item key.
2158 *
2159 * This function isn't completely safe. It's the caller's responsibility
2160 * that the new key won't break the order
2161 */
Daniel Dresslerb7a03652014-11-12 13:43:09 +09002162void btrfs_set_item_key_safe(struct btrfs_fs_info *fs_info,
2163 struct btrfs_path *path,
Omar Sandoval310712b2017-01-17 23:24:37 -08002164 const struct btrfs_key *new_key)
Zheng Yan31840ae2008-09-23 13:14:14 -04002165{
2166 struct btrfs_disk_key disk_key;
2167 struct extent_buffer *eb;
2168 int slot;
2169
2170 eb = path->nodes[0];
2171 slot = path->slots[0];
2172 if (slot > 0) {
2173 btrfs_item_key(eb, &disk_key, slot - 1);
Qu Wenruo7c15d412019-04-25 08:55:53 +08002174 if (unlikely(comp_keys(&disk_key, new_key) >= 0)) {
2175 btrfs_crit(fs_info,
2176 "slot %u key (%llu %u %llu) new key (%llu %u %llu)",
2177 slot, btrfs_disk_key_objectid(&disk_key),
2178 btrfs_disk_key_type(&disk_key),
2179 btrfs_disk_key_offset(&disk_key),
2180 new_key->objectid, new_key->type,
2181 new_key->offset);
2182 btrfs_print_leaf(eb);
2183 BUG();
2184 }
Zheng Yan31840ae2008-09-23 13:14:14 -04002185 }
2186 if (slot < btrfs_header_nritems(eb) - 1) {
2187 btrfs_item_key(eb, &disk_key, slot + 1);
Qu Wenruo7c15d412019-04-25 08:55:53 +08002188 if (unlikely(comp_keys(&disk_key, new_key) <= 0)) {
2189 btrfs_crit(fs_info,
2190 "slot %u key (%llu %u %llu) new key (%llu %u %llu)",
2191 slot, btrfs_disk_key_objectid(&disk_key),
2192 btrfs_disk_key_type(&disk_key),
2193 btrfs_disk_key_offset(&disk_key),
2194 new_key->objectid, new_key->type,
2195 new_key->offset);
2196 btrfs_print_leaf(eb);
2197 BUG();
2198 }
Zheng Yan31840ae2008-09-23 13:14:14 -04002199 }
2200
2201 btrfs_cpu_key_to_disk(&disk_key, new_key);
2202 btrfs_set_item_key(eb, &disk_key, slot);
2203 btrfs_mark_buffer_dirty(eb);
2204 if (slot == 0)
Nikolay Borisovb167fa92018-06-20 15:48:47 +03002205 fixup_low_keys(path, &disk_key, 1);
Zheng Yan31840ae2008-09-23 13:14:14 -04002206}
2207
2208/*
Qu Wenruod16c7022020-08-19 14:35:50 +08002209 * Check key order of two sibling extent buffers.
2210 *
2211 * Return true if something is wrong.
2212 * Return false if everything is fine.
2213 *
2214 * Tree-checker only works inside one tree block, thus the following
2215 * corruption can not be detected by tree-checker:
2216 *
2217 * Leaf @left | Leaf @right
2218 * --------------------------------------------------------------
2219 * | 1 | 2 | 3 | 4 | 5 | f6 | | 7 | 8 |
2220 *
2221 * Key f6 in leaf @left itself is valid, but not valid when the next
2222 * key in leaf @right is 7.
2223 * This can only be checked at tree block merge time.
2224 * And since tree checker has ensured all key order in each tree block
2225 * is correct, we only need to bother the last key of @left and the first
2226 * key of @right.
2227 */
2228static bool check_sibling_keys(struct extent_buffer *left,
2229 struct extent_buffer *right)
2230{
2231 struct btrfs_key left_last;
2232 struct btrfs_key right_first;
2233 int level = btrfs_header_level(left);
2234 int nr_left = btrfs_header_nritems(left);
2235 int nr_right = btrfs_header_nritems(right);
2236
2237 /* No key to check in one of the tree blocks */
2238 if (!nr_left || !nr_right)
2239 return false;
2240
2241 if (level) {
2242 btrfs_node_key_to_cpu(left, &left_last, nr_left - 1);
2243 btrfs_node_key_to_cpu(right, &right_first, 0);
2244 } else {
2245 btrfs_item_key_to_cpu(left, &left_last, nr_left - 1);
2246 btrfs_item_key_to_cpu(right, &right_first, 0);
2247 }
2248
2249 if (btrfs_comp_cpu_keys(&left_last, &right_first) >= 0) {
2250 btrfs_crit(left->fs_info,
2251"bad key order, sibling blocks, left last (%llu %u %llu) right first (%llu %u %llu)",
2252 left_last.objectid, left_last.type,
2253 left_last.offset, right_first.objectid,
2254 right_first.type, right_first.offset);
2255 return true;
2256 }
2257 return false;
2258}
2259
2260/*
Chris Mason74123bd2007-02-02 11:05:29 -05002261 * try to push data from one node into the next node left in the
Chris Mason79f95c82007-03-01 15:16:26 -05002262 * tree.
Chris Masonaa5d6be2007-02-28 16:35:06 -05002263 *
2264 * returns 0 if some ptrs were pushed left, < 0 if there was some horrible
2265 * error, and > 0 if there was no room in the left hand block.
Chris Mason74123bd2007-02-02 11:05:29 -05002266 */
Chris Mason98ed5172008-01-03 10:01:48 -05002267static int push_node_left(struct btrfs_trans_handle *trans,
Jeff Mahoney2ff7e612016-06-22 18:54:24 -04002268 struct extent_buffer *dst,
Chris Mason971a1f62008-04-24 10:54:32 -04002269 struct extent_buffer *src, int empty)
Chris Masonbe0e5c02007-01-26 15:51:26 -05002270{
David Sterbad30a6682019-03-20 14:16:45 +01002271 struct btrfs_fs_info *fs_info = trans->fs_info;
Chris Masonbe0e5c02007-01-26 15:51:26 -05002272 int push_items = 0;
Chris Masonbb803952007-03-01 12:04:21 -05002273 int src_nritems;
2274 int dst_nritems;
Chris Masonaa5d6be2007-02-28 16:35:06 -05002275 int ret = 0;
Chris Masonbe0e5c02007-01-26 15:51:26 -05002276
Chris Mason5f39d392007-10-15 16:14:19 -04002277 src_nritems = btrfs_header_nritems(src);
2278 dst_nritems = btrfs_header_nritems(dst);
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002279 push_items = BTRFS_NODEPTRS_PER_BLOCK(fs_info) - dst_nritems;
Chris Mason7bb86312007-12-11 09:25:06 -05002280 WARN_ON(btrfs_header_generation(src) != trans->transid);
2281 WARN_ON(btrfs_header_generation(dst) != trans->transid);
Chris Mason54aa1f42007-06-22 14:16:25 -04002282
Chris Masonbce4eae2008-04-24 14:42:46 -04002283 if (!empty && src_nritems <= 8)
Chris Mason971a1f62008-04-24 10:54:32 -04002284 return 1;
2285
Chris Masond3977122009-01-05 21:25:51 -05002286 if (push_items <= 0)
Chris Masonbe0e5c02007-01-26 15:51:26 -05002287 return 1;
2288
Chris Masonbce4eae2008-04-24 14:42:46 -04002289 if (empty) {
Chris Mason971a1f62008-04-24 10:54:32 -04002290 push_items = min(src_nritems, push_items);
Chris Masonbce4eae2008-04-24 14:42:46 -04002291 if (push_items < src_nritems) {
2292 /* leave at least 8 pointers in the node if
2293 * we aren't going to empty it
2294 */
2295 if (src_nritems - push_items < 8) {
2296 if (push_items <= 8)
2297 return 1;
2298 push_items -= 8;
2299 }
2300 }
2301 } else
2302 push_items = min(src_nritems - 8, push_items);
Chris Mason79f95c82007-03-01 15:16:26 -05002303
Qu Wenruod16c7022020-08-19 14:35:50 +08002304 /* dst is the left eb, src is the middle eb */
2305 if (check_sibling_keys(dst, src)) {
2306 ret = -EUCLEAN;
2307 btrfs_abort_transaction(trans, ret);
2308 return ret;
2309 }
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00002310 ret = btrfs_tree_mod_log_eb_copy(dst, src, dst_nritems, 0, push_items);
Filipe David Borba Manana5de865e2013-12-20 15:17:46 +00002311 if (ret) {
Jeff Mahoney66642832016-06-10 18:19:25 -04002312 btrfs_abort_transaction(trans, ret);
Filipe David Borba Manana5de865e2013-12-20 15:17:46 +00002313 return ret;
2314 }
Chris Mason5f39d392007-10-15 16:14:19 -04002315 copy_extent_buffer(dst, src,
2316 btrfs_node_key_ptr_offset(dst_nritems),
2317 btrfs_node_key_ptr_offset(0),
Chris Masond3977122009-01-05 21:25:51 -05002318 push_items * sizeof(struct btrfs_key_ptr));
Chris Mason5f39d392007-10-15 16:14:19 -04002319
Chris Masonbb803952007-03-01 12:04:21 -05002320 if (push_items < src_nritems) {
Jan Schmidt57911b82012-10-19 09:22:03 +02002321 /*
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00002322 * Don't call btrfs_tree_mod_log_insert_move() here, key removal
2323 * was already fully logged by btrfs_tree_mod_log_eb_copy() above.
Jan Schmidt57911b82012-10-19 09:22:03 +02002324 */
Chris Mason5f39d392007-10-15 16:14:19 -04002325 memmove_extent_buffer(src, btrfs_node_key_ptr_offset(0),
2326 btrfs_node_key_ptr_offset(push_items),
2327 (src_nritems - push_items) *
2328 sizeof(struct btrfs_key_ptr));
Chris Masonbb803952007-03-01 12:04:21 -05002329 }
Chris Mason5f39d392007-10-15 16:14:19 -04002330 btrfs_set_header_nritems(src, src_nritems - push_items);
2331 btrfs_set_header_nritems(dst, dst_nritems + push_items);
2332 btrfs_mark_buffer_dirty(src);
2333 btrfs_mark_buffer_dirty(dst);
Zheng Yan31840ae2008-09-23 13:14:14 -04002334
Chris Masonbb803952007-03-01 12:04:21 -05002335 return ret;
Chris Masonbe0e5c02007-01-26 15:51:26 -05002336}
2337
Chris Mason97571fd2007-02-24 13:39:08 -05002338/*
Chris Mason79f95c82007-03-01 15:16:26 -05002339 * try to push data from one node into the next node right in the
2340 * tree.
2341 *
2342 * returns 0 if some ptrs were pushed, < 0 if there was some horrible
2343 * error, and > 0 if there was no room in the right hand block.
2344 *
2345 * this will only push up to 1/2 the contents of the left node over
2346 */
Chris Mason5f39d392007-10-15 16:14:19 -04002347static int balance_node_right(struct btrfs_trans_handle *trans,
Chris Mason5f39d392007-10-15 16:14:19 -04002348 struct extent_buffer *dst,
2349 struct extent_buffer *src)
Chris Mason79f95c82007-03-01 15:16:26 -05002350{
David Sterba55d32ed2019-03-20 14:18:06 +01002351 struct btrfs_fs_info *fs_info = trans->fs_info;
Chris Mason79f95c82007-03-01 15:16:26 -05002352 int push_items = 0;
2353 int max_push;
2354 int src_nritems;
2355 int dst_nritems;
2356 int ret = 0;
Chris Mason79f95c82007-03-01 15:16:26 -05002357
Chris Mason7bb86312007-12-11 09:25:06 -05002358 WARN_ON(btrfs_header_generation(src) != trans->transid);
2359 WARN_ON(btrfs_header_generation(dst) != trans->transid);
2360
Chris Mason5f39d392007-10-15 16:14:19 -04002361 src_nritems = btrfs_header_nritems(src);
2362 dst_nritems = btrfs_header_nritems(dst);
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002363 push_items = BTRFS_NODEPTRS_PER_BLOCK(fs_info) - dst_nritems;
Chris Masond3977122009-01-05 21:25:51 -05002364 if (push_items <= 0)
Chris Mason79f95c82007-03-01 15:16:26 -05002365 return 1;
Chris Masonbce4eae2008-04-24 14:42:46 -04002366
Chris Masond3977122009-01-05 21:25:51 -05002367 if (src_nritems < 4)
Chris Masonbce4eae2008-04-24 14:42:46 -04002368 return 1;
Chris Mason79f95c82007-03-01 15:16:26 -05002369
2370 max_push = src_nritems / 2 + 1;
2371 /* don't try to empty the node */
Chris Masond3977122009-01-05 21:25:51 -05002372 if (max_push >= src_nritems)
Chris Mason79f95c82007-03-01 15:16:26 -05002373 return 1;
Yan252c38f2007-08-29 09:11:44 -04002374
Chris Mason79f95c82007-03-01 15:16:26 -05002375 if (max_push < push_items)
2376 push_items = max_push;
2377
Qu Wenruod16c7022020-08-19 14:35:50 +08002378 /* dst is the right eb, src is the middle eb */
2379 if (check_sibling_keys(src, dst)) {
2380 ret = -EUCLEAN;
2381 btrfs_abort_transaction(trans, ret);
2382 return ret;
2383 }
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00002384 ret = btrfs_tree_mod_log_insert_move(dst, push_items, 0, dst_nritems);
David Sterbabf1d3422018-03-05 15:47:39 +01002385 BUG_ON(ret < 0);
Chris Mason5f39d392007-10-15 16:14:19 -04002386 memmove_extent_buffer(dst, btrfs_node_key_ptr_offset(push_items),
2387 btrfs_node_key_ptr_offset(0),
2388 (dst_nritems) *
2389 sizeof(struct btrfs_key_ptr));
Chris Masond6025572007-03-30 14:27:56 -04002390
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00002391 ret = btrfs_tree_mod_log_eb_copy(dst, src, 0, src_nritems - push_items,
2392 push_items);
Filipe David Borba Manana5de865e2013-12-20 15:17:46 +00002393 if (ret) {
Jeff Mahoney66642832016-06-10 18:19:25 -04002394 btrfs_abort_transaction(trans, ret);
Filipe David Borba Manana5de865e2013-12-20 15:17:46 +00002395 return ret;
2396 }
Chris Mason5f39d392007-10-15 16:14:19 -04002397 copy_extent_buffer(dst, src,
2398 btrfs_node_key_ptr_offset(0),
2399 btrfs_node_key_ptr_offset(src_nritems - push_items),
Chris Masond3977122009-01-05 21:25:51 -05002400 push_items * sizeof(struct btrfs_key_ptr));
Chris Mason79f95c82007-03-01 15:16:26 -05002401
Chris Mason5f39d392007-10-15 16:14:19 -04002402 btrfs_set_header_nritems(src, src_nritems - push_items);
2403 btrfs_set_header_nritems(dst, dst_nritems + push_items);
Chris Mason79f95c82007-03-01 15:16:26 -05002404
Chris Mason5f39d392007-10-15 16:14:19 -04002405 btrfs_mark_buffer_dirty(src);
2406 btrfs_mark_buffer_dirty(dst);
Zheng Yan31840ae2008-09-23 13:14:14 -04002407
Chris Mason79f95c82007-03-01 15:16:26 -05002408 return ret;
2409}
2410
2411/*
Chris Mason97571fd2007-02-24 13:39:08 -05002412 * helper function to insert a new root level in the tree.
2413 * A new node is allocated, and a single item is inserted to
2414 * point to the existing root
Chris Masonaa5d6be2007-02-28 16:35:06 -05002415 *
2416 * returns zero on success or < 0 on failure.
Chris Mason97571fd2007-02-24 13:39:08 -05002417 */
Chris Masond3977122009-01-05 21:25:51 -05002418static noinline int insert_new_root(struct btrfs_trans_handle *trans,
Chris Mason5f39d392007-10-15 16:14:19 -04002419 struct btrfs_root *root,
Liu Bofdd99c72013-05-22 12:06:51 +00002420 struct btrfs_path *path, int level)
Chris Mason5c680ed2007-02-22 11:39:13 -05002421{
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002422 struct btrfs_fs_info *fs_info = root->fs_info;
Chris Mason7bb86312007-12-11 09:25:06 -05002423 u64 lower_gen;
Chris Mason5f39d392007-10-15 16:14:19 -04002424 struct extent_buffer *lower;
2425 struct extent_buffer *c;
Chris Mason925baed2008-06-25 16:01:30 -04002426 struct extent_buffer *old;
Chris Mason5f39d392007-10-15 16:14:19 -04002427 struct btrfs_disk_key lower_key;
David Sterbad9d19a02018-03-05 16:35:29 +01002428 int ret;
Chris Mason5c680ed2007-02-22 11:39:13 -05002429
2430 BUG_ON(path->nodes[level]);
2431 BUG_ON(path->nodes[level-1] != root->node);
2432
Chris Mason7bb86312007-12-11 09:25:06 -05002433 lower = path->nodes[level-1];
2434 if (level == 1)
2435 btrfs_item_key(lower, &lower_key, 0);
2436 else
2437 btrfs_node_key(lower, &lower_key, 0);
2438
Filipe Manana79bd3712021-06-29 14:43:06 +01002439 c = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
2440 &lower_key, level, root->node->start, 0,
2441 BTRFS_NESTING_NEW_ROOT);
Chris Mason5f39d392007-10-15 16:14:19 -04002442 if (IS_ERR(c))
2443 return PTR_ERR(c);
Chris Mason925baed2008-06-25 16:01:30 -04002444
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002445 root_add_used(root, fs_info->nodesize);
Yan, Zhengf0486c62010-05-16 10:46:25 -04002446
Chris Mason5f39d392007-10-15 16:14:19 -04002447 btrfs_set_header_nritems(c, 1);
Chris Mason5f39d392007-10-15 16:14:19 -04002448 btrfs_set_node_key(c, &lower_key, 0);
Chris Masondb945352007-10-15 16:15:53 -04002449 btrfs_set_node_blockptr(c, 0, lower->start);
Chris Mason7bb86312007-12-11 09:25:06 -05002450 lower_gen = btrfs_header_generation(lower);
Zheng Yan31840ae2008-09-23 13:14:14 -04002451 WARN_ON(lower_gen != trans->transid);
Chris Mason7bb86312007-12-11 09:25:06 -05002452
2453 btrfs_set_node_ptr_generation(c, 0, lower_gen);
Chris Mason5f39d392007-10-15 16:14:19 -04002454
2455 btrfs_mark_buffer_dirty(c);
Chris Masond5719762007-03-23 10:01:08 -04002456
Chris Mason925baed2008-06-25 16:01:30 -04002457 old = root->node;
Filipe Manana406808a2021-03-11 14:31:08 +00002458 ret = btrfs_tree_mod_log_insert_root(root->node, c, false);
David Sterbad9d19a02018-03-05 16:35:29 +01002459 BUG_ON(ret < 0);
Chris Mason240f62c2011-03-23 14:54:42 -04002460 rcu_assign_pointer(root->node, c);
Chris Mason925baed2008-06-25 16:01:30 -04002461
2462 /* the super has an extra ref to root->node */
2463 free_extent_buffer(old);
2464
Chris Mason0b86a832008-03-24 15:01:56 -04002465 add_root_to_dirty_list(root);
David Sterba67439da2019-10-08 13:28:47 +02002466 atomic_inc(&c->refs);
Chris Mason5f39d392007-10-15 16:14:19 -04002467 path->nodes[level] = c;
Josef Bacikac5887c2020-08-20 11:46:10 -04002468 path->locks[level] = BTRFS_WRITE_LOCK;
Chris Mason5c680ed2007-02-22 11:39:13 -05002469 path->slots[level] = 0;
2470 return 0;
2471}
2472
Chris Mason74123bd2007-02-02 11:05:29 -05002473/*
2474 * worker function to insert a single pointer in a node.
2475 * the node should have enough room for the pointer already
Chris Mason97571fd2007-02-24 13:39:08 -05002476 *
Chris Mason74123bd2007-02-02 11:05:29 -05002477 * slot and level indicate where you want the key to go, and
2478 * blocknr is the block the key points to.
2479 */
Jeff Mahoney143bede2012-03-01 14:56:26 +01002480static void insert_ptr(struct btrfs_trans_handle *trans,
David Sterba6ad3cf62019-03-20 14:32:45 +01002481 struct btrfs_path *path,
Jeff Mahoney143bede2012-03-01 14:56:26 +01002482 struct btrfs_disk_key *key, u64 bytenr,
Jan Schmidtc3e06962012-06-21 11:01:06 +02002483 int slot, int level)
Chris Mason74123bd2007-02-02 11:05:29 -05002484{
Chris Mason5f39d392007-10-15 16:14:19 -04002485 struct extent_buffer *lower;
Chris Mason74123bd2007-02-02 11:05:29 -05002486 int nritems;
Jan Schmidtf3ea38d2012-05-26 11:45:21 +02002487 int ret;
Chris Mason5c680ed2007-02-22 11:39:13 -05002488
2489 BUG_ON(!path->nodes[level]);
Filipe Manana49d0c642021-09-22 10:36:45 +01002490 btrfs_assert_tree_write_locked(path->nodes[level]);
Chris Mason5f39d392007-10-15 16:14:19 -04002491 lower = path->nodes[level];
2492 nritems = btrfs_header_nritems(lower);
Stoyan Gaydarovc2934982009-04-02 17:05:11 -04002493 BUG_ON(slot > nritems);
David Sterba6ad3cf62019-03-20 14:32:45 +01002494 BUG_ON(nritems == BTRFS_NODEPTRS_PER_BLOCK(trans->fs_info));
Chris Mason74123bd2007-02-02 11:05:29 -05002495 if (slot != nritems) {
David Sterbabf1d3422018-03-05 15:47:39 +01002496 if (level) {
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00002497 ret = btrfs_tree_mod_log_insert_move(lower, slot + 1,
2498 slot, nritems - slot);
David Sterbabf1d3422018-03-05 15:47:39 +01002499 BUG_ON(ret < 0);
2500 }
Chris Mason5f39d392007-10-15 16:14:19 -04002501 memmove_extent_buffer(lower,
2502 btrfs_node_key_ptr_offset(slot + 1),
2503 btrfs_node_key_ptr_offset(slot),
Chris Masond6025572007-03-30 14:27:56 -04002504 (nritems - slot) * sizeof(struct btrfs_key_ptr));
Chris Mason74123bd2007-02-02 11:05:29 -05002505 }
Jan Schmidtc3e06962012-06-21 11:01:06 +02002506 if (level) {
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00002507 ret = btrfs_tree_mod_log_insert_key(lower, slot,
2508 BTRFS_MOD_LOG_KEY_ADD, GFP_NOFS);
Jan Schmidtf3ea38d2012-05-26 11:45:21 +02002509 BUG_ON(ret < 0);
2510 }
Chris Mason5f39d392007-10-15 16:14:19 -04002511 btrfs_set_node_key(lower, key, slot);
Chris Masondb945352007-10-15 16:15:53 -04002512 btrfs_set_node_blockptr(lower, slot, bytenr);
Chris Mason74493f72007-12-11 09:25:06 -05002513 WARN_ON(trans->transid == 0);
2514 btrfs_set_node_ptr_generation(lower, slot, trans->transid);
Chris Mason5f39d392007-10-15 16:14:19 -04002515 btrfs_set_header_nritems(lower, nritems + 1);
2516 btrfs_mark_buffer_dirty(lower);
Chris Mason74123bd2007-02-02 11:05:29 -05002517}
2518
Chris Mason97571fd2007-02-24 13:39:08 -05002519/*
2520 * split the node at the specified level in path in two.
2521 * The path is corrected to point to the appropriate node after the split
2522 *
2523 * Before splitting this tries to make some room in the node by pushing
2524 * left and right, if either one works, it returns right away.
Chris Masonaa5d6be2007-02-28 16:35:06 -05002525 *
2526 * returns 0 on success and < 0 on failure
Chris Mason97571fd2007-02-24 13:39:08 -05002527 */
Chris Masone02119d2008-09-05 16:13:11 -04002528static noinline int split_node(struct btrfs_trans_handle *trans,
2529 struct btrfs_root *root,
2530 struct btrfs_path *path, int level)
Chris Masonbe0e5c02007-01-26 15:51:26 -05002531{
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002532 struct btrfs_fs_info *fs_info = root->fs_info;
Chris Mason5f39d392007-10-15 16:14:19 -04002533 struct extent_buffer *c;
2534 struct extent_buffer *split;
2535 struct btrfs_disk_key disk_key;
Chris Masonbe0e5c02007-01-26 15:51:26 -05002536 int mid;
Chris Mason5c680ed2007-02-22 11:39:13 -05002537 int ret;
Chris Mason7518a232007-03-12 12:01:18 -04002538 u32 c_nritems;
Chris Masonbe0e5c02007-01-26 15:51:26 -05002539
Chris Mason5f39d392007-10-15 16:14:19 -04002540 c = path->nodes[level];
Chris Mason7bb86312007-12-11 09:25:06 -05002541 WARN_ON(btrfs_header_generation(c) != trans->transid);
Chris Mason5f39d392007-10-15 16:14:19 -04002542 if (c == root->node) {
Jan Schmidtd9abbf12013-03-20 13:49:48 +00002543 /*
Jan Schmidt90f8d622013-04-13 13:19:53 +00002544 * trying to split the root, lets make a new one
2545 *
Liu Bofdd99c72013-05-22 12:06:51 +00002546 * tree mod log: We don't log_removal old root in
Jan Schmidt90f8d622013-04-13 13:19:53 +00002547 * insert_new_root, because that root buffer will be kept as a
2548 * normal node. We are going to log removal of half of the
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00002549 * elements below with btrfs_tree_mod_log_eb_copy(). We're
2550 * holding a tree lock on the buffer, which is why we cannot
2551 * race with other tree_mod_log users.
Jan Schmidtd9abbf12013-03-20 13:49:48 +00002552 */
Liu Bofdd99c72013-05-22 12:06:51 +00002553 ret = insert_new_root(trans, root, path, level + 1);
Chris Mason5c680ed2007-02-22 11:39:13 -05002554 if (ret)
2555 return ret;
Chris Masonb3612422009-05-13 19:12:15 -04002556 } else {
Chris Masone66f7092007-04-20 13:16:02 -04002557 ret = push_nodes_for_insert(trans, root, path, level);
Chris Mason5f39d392007-10-15 16:14:19 -04002558 c = path->nodes[level];
2559 if (!ret && btrfs_header_nritems(c) <
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002560 BTRFS_NODEPTRS_PER_BLOCK(fs_info) - 3)
Chris Masone66f7092007-04-20 13:16:02 -04002561 return 0;
Chris Mason54aa1f42007-06-22 14:16:25 -04002562 if (ret < 0)
2563 return ret;
Chris Masonbe0e5c02007-01-26 15:51:26 -05002564 }
Chris Masone66f7092007-04-20 13:16:02 -04002565
Chris Mason5f39d392007-10-15 16:14:19 -04002566 c_nritems = btrfs_header_nritems(c);
Yan Zheng5d4f98a2009-06-10 10:45:14 -04002567 mid = (c_nritems + 1) / 2;
2568 btrfs_node_key(c, &disk_key, mid);
Chris Mason7bb86312007-12-11 09:25:06 -05002569
Filipe Manana79bd3712021-06-29 14:43:06 +01002570 split = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
2571 &disk_key, level, c->start, 0,
2572 BTRFS_NESTING_SPLIT);
Chris Mason5f39d392007-10-15 16:14:19 -04002573 if (IS_ERR(split))
2574 return PTR_ERR(split);
Chris Mason54aa1f42007-06-22 14:16:25 -04002575
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002576 root_add_used(root, fs_info->nodesize);
Nikolay Borisovbc877d22018-06-18 14:13:19 +03002577 ASSERT(btrfs_header_level(c) == level);
Chris Mason5f39d392007-10-15 16:14:19 -04002578
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00002579 ret = btrfs_tree_mod_log_eb_copy(split, c, 0, mid, c_nritems - mid);
Filipe David Borba Manana5de865e2013-12-20 15:17:46 +00002580 if (ret) {
Jeff Mahoney66642832016-06-10 18:19:25 -04002581 btrfs_abort_transaction(trans, ret);
Filipe David Borba Manana5de865e2013-12-20 15:17:46 +00002582 return ret;
2583 }
Chris Mason5f39d392007-10-15 16:14:19 -04002584 copy_extent_buffer(split, c,
2585 btrfs_node_key_ptr_offset(0),
2586 btrfs_node_key_ptr_offset(mid),
2587 (c_nritems - mid) * sizeof(struct btrfs_key_ptr));
2588 btrfs_set_header_nritems(split, c_nritems - mid);
2589 btrfs_set_header_nritems(c, mid);
Chris Masonaa5d6be2007-02-28 16:35:06 -05002590
Chris Mason5f39d392007-10-15 16:14:19 -04002591 btrfs_mark_buffer_dirty(c);
2592 btrfs_mark_buffer_dirty(split);
2593
David Sterba6ad3cf62019-03-20 14:32:45 +01002594 insert_ptr(trans, path, &disk_key, split->start,
Jan Schmidtc3e06962012-06-21 11:01:06 +02002595 path->slots[level + 1] + 1, level + 1);
Chris Masonaa5d6be2007-02-28 16:35:06 -05002596
Chris Mason5de08d72007-02-24 06:24:44 -05002597 if (path->slots[level] >= mid) {
Chris Mason5c680ed2007-02-22 11:39:13 -05002598 path->slots[level] -= mid;
Chris Mason925baed2008-06-25 16:01:30 -04002599 btrfs_tree_unlock(c);
Chris Mason5f39d392007-10-15 16:14:19 -04002600 free_extent_buffer(c);
2601 path->nodes[level] = split;
Chris Mason5c680ed2007-02-22 11:39:13 -05002602 path->slots[level + 1] += 1;
2603 } else {
Chris Mason925baed2008-06-25 16:01:30 -04002604 btrfs_tree_unlock(split);
Chris Mason5f39d392007-10-15 16:14:19 -04002605 free_extent_buffer(split);
Chris Masonbe0e5c02007-01-26 15:51:26 -05002606 }
Nikolay Borisovd5286a922020-11-12 13:24:02 +02002607 return 0;
Chris Masonbe0e5c02007-01-26 15:51:26 -05002608}
2609
Chris Mason74123bd2007-02-02 11:05:29 -05002610/*
2611 * how many bytes are required to store the items in a leaf. start
2612 * and nr indicate which items in the leaf to check. This totals up the
2613 * space used both by the item structs and the item data
2614 */
Chris Mason5f39d392007-10-15 16:14:19 -04002615static int leaf_space_used(struct extent_buffer *l, int start, int nr)
Chris Masonbe0e5c02007-01-26 15:51:26 -05002616{
Josef Bacik41be1f32012-10-15 13:43:18 -04002617 struct btrfs_item *start_item;
2618 struct btrfs_item *end_item;
Chris Masonbe0e5c02007-01-26 15:51:26 -05002619 int data_len;
Chris Mason5f39d392007-10-15 16:14:19 -04002620 int nritems = btrfs_header_nritems(l);
Chris Masond4dbff92007-04-04 14:08:15 -04002621 int end = min(nritems, start + nr) - 1;
Chris Masonbe0e5c02007-01-26 15:51:26 -05002622
2623 if (!nr)
2624 return 0;
Ross Kirkdd3cc162013-09-16 15:58:09 +01002625 start_item = btrfs_item_nr(start);
2626 end_item = btrfs_item_nr(end);
David Sterbaa31356b2020-04-29 22:56:01 +02002627 data_len = btrfs_item_offset(l, start_item) +
2628 btrfs_item_size(l, start_item);
2629 data_len = data_len - btrfs_item_offset(l, end_item);
Chris Mason0783fcf2007-03-12 20:12:07 -04002630 data_len += sizeof(struct btrfs_item) * nr;
Chris Masond4dbff92007-04-04 14:08:15 -04002631 WARN_ON(data_len < 0);
Chris Masonbe0e5c02007-01-26 15:51:26 -05002632 return data_len;
2633}
2634
Chris Mason74123bd2007-02-02 11:05:29 -05002635/*
Chris Masond4dbff92007-04-04 14:08:15 -04002636 * The space between the end of the leaf items and
2637 * the start of the leaf data. IOW, how much room
2638 * the leaf has left for both items and data
2639 */
David Sterbae902baa2019-03-20 14:36:46 +01002640noinline int btrfs_leaf_free_space(struct extent_buffer *leaf)
Chris Masond4dbff92007-04-04 14:08:15 -04002641{
David Sterbae902baa2019-03-20 14:36:46 +01002642 struct btrfs_fs_info *fs_info = leaf->fs_info;
Chris Mason5f39d392007-10-15 16:14:19 -04002643 int nritems = btrfs_header_nritems(leaf);
2644 int ret;
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002645
2646 ret = BTRFS_LEAF_DATA_SIZE(fs_info) - leaf_space_used(leaf, 0, nritems);
Chris Mason5f39d392007-10-15 16:14:19 -04002647 if (ret < 0) {
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002648 btrfs_crit(fs_info,
2649 "leaf free space ret %d, leaf data size %lu, used %d nritems %d",
2650 ret,
2651 (unsigned long) BTRFS_LEAF_DATA_SIZE(fs_info),
2652 leaf_space_used(leaf, 0, nritems), nritems);
Chris Mason5f39d392007-10-15 16:14:19 -04002653 }
2654 return ret;
Chris Masond4dbff92007-04-04 14:08:15 -04002655}
2656
Chris Mason99d8f832010-07-07 10:51:48 -04002657/*
2658 * min slot controls the lowest index we're willing to push to the
2659 * right. We'll push up to and including min_slot, but no lower
2660 */
David Sterbaf72f0012019-03-20 14:39:45 +01002661static noinline int __push_leaf_right(struct btrfs_path *path,
Chris Mason44871b12009-03-13 10:04:31 -04002662 int data_size, int empty,
2663 struct extent_buffer *right,
Chris Mason99d8f832010-07-07 10:51:48 -04002664 int free_space, u32 left_nritems,
2665 u32 min_slot)
Chris Mason00ec4c52007-02-24 12:47:20 -05002666{
David Sterbaf72f0012019-03-20 14:39:45 +01002667 struct btrfs_fs_info *fs_info = right->fs_info;
Chris Mason5f39d392007-10-15 16:14:19 -04002668 struct extent_buffer *left = path->nodes[0];
Chris Mason44871b12009-03-13 10:04:31 -04002669 struct extent_buffer *upper = path->nodes[1];
Chris Masoncfed81a2012-03-03 07:40:03 -05002670 struct btrfs_map_token token;
Chris Mason5f39d392007-10-15 16:14:19 -04002671 struct btrfs_disk_key disk_key;
Chris Mason00ec4c52007-02-24 12:47:20 -05002672 int slot;
Chris Mason34a38212007-11-07 13:31:03 -05002673 u32 i;
Chris Mason00ec4c52007-02-24 12:47:20 -05002674 int push_space = 0;
2675 int push_items = 0;
Chris Mason0783fcf2007-03-12 20:12:07 -04002676 struct btrfs_item *item;
Chris Mason34a38212007-11-07 13:31:03 -05002677 u32 nr;
Chris Mason7518a232007-03-12 12:01:18 -04002678 u32 right_nritems;
Chris Mason5f39d392007-10-15 16:14:19 -04002679 u32 data_end;
Chris Masondb945352007-10-15 16:15:53 -04002680 u32 this_item_size;
Chris Mason00ec4c52007-02-24 12:47:20 -05002681
Chris Mason34a38212007-11-07 13:31:03 -05002682 if (empty)
2683 nr = 0;
2684 else
Chris Mason99d8f832010-07-07 10:51:48 -04002685 nr = max_t(u32, 1, min_slot);
Chris Mason34a38212007-11-07 13:31:03 -05002686
Zheng Yan31840ae2008-09-23 13:14:14 -04002687 if (path->slots[0] >= left_nritems)
Yan Zheng87b29b22008-12-17 10:21:48 -05002688 push_space += data_size;
Zheng Yan31840ae2008-09-23 13:14:14 -04002689
Chris Mason44871b12009-03-13 10:04:31 -04002690 slot = path->slots[1];
Chris Mason34a38212007-11-07 13:31:03 -05002691 i = left_nritems - 1;
2692 while (i >= nr) {
Ross Kirkdd3cc162013-09-16 15:58:09 +01002693 item = btrfs_item_nr(i);
Chris Masondb945352007-10-15 16:15:53 -04002694
Zheng Yan31840ae2008-09-23 13:14:14 -04002695 if (!empty && push_items > 0) {
2696 if (path->slots[0] > i)
2697 break;
2698 if (path->slots[0] == i) {
David Sterbae902baa2019-03-20 14:36:46 +01002699 int space = btrfs_leaf_free_space(left);
2700
Zheng Yan31840ae2008-09-23 13:14:14 -04002701 if (space + push_space * 2 > free_space)
2702 break;
2703 }
2704 }
2705
Chris Mason00ec4c52007-02-24 12:47:20 -05002706 if (path->slots[0] == i)
Yan Zheng87b29b22008-12-17 10:21:48 -05002707 push_space += data_size;
Chris Masondb945352007-10-15 16:15:53 -04002708
Chris Masondb945352007-10-15 16:15:53 -04002709 this_item_size = btrfs_item_size(left, item);
2710 if (this_item_size + sizeof(*item) + push_space > free_space)
Chris Mason00ec4c52007-02-24 12:47:20 -05002711 break;
Zheng Yan31840ae2008-09-23 13:14:14 -04002712
Chris Mason00ec4c52007-02-24 12:47:20 -05002713 push_items++;
Chris Masondb945352007-10-15 16:15:53 -04002714 push_space += this_item_size + sizeof(*item);
Chris Mason34a38212007-11-07 13:31:03 -05002715 if (i == 0)
2716 break;
2717 i--;
Chris Masondb945352007-10-15 16:15:53 -04002718 }
Chris Mason5f39d392007-10-15 16:14:19 -04002719
Chris Mason925baed2008-06-25 16:01:30 -04002720 if (push_items == 0)
2721 goto out_unlock;
Chris Mason5f39d392007-10-15 16:14:19 -04002722
Julia Lawall6c1500f2012-11-03 20:30:18 +00002723 WARN_ON(!empty && push_items == left_nritems);
Chris Mason5f39d392007-10-15 16:14:19 -04002724
Chris Mason00ec4c52007-02-24 12:47:20 -05002725 /* push left to right */
Chris Mason5f39d392007-10-15 16:14:19 -04002726 right_nritems = btrfs_header_nritems(right);
Chris Mason34a38212007-11-07 13:31:03 -05002727
Chris Mason5f39d392007-10-15 16:14:19 -04002728 push_space = btrfs_item_end_nr(left, left_nritems - push_items);
David Sterba8f881e82019-03-20 11:33:10 +01002729 push_space -= leaf_data_end(left);
Chris Mason5f39d392007-10-15 16:14:19 -04002730
Chris Mason00ec4c52007-02-24 12:47:20 -05002731 /* make room in the right data area */
David Sterba8f881e82019-03-20 11:33:10 +01002732 data_end = leaf_data_end(right);
Chris Mason5f39d392007-10-15 16:14:19 -04002733 memmove_extent_buffer(right,
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03002734 BTRFS_LEAF_DATA_OFFSET + data_end - push_space,
2735 BTRFS_LEAF_DATA_OFFSET + data_end,
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002736 BTRFS_LEAF_DATA_SIZE(fs_info) - data_end);
Chris Mason5f39d392007-10-15 16:14:19 -04002737
Chris Mason00ec4c52007-02-24 12:47:20 -05002738 /* copy from the left data area */
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03002739 copy_extent_buffer(right, left, BTRFS_LEAF_DATA_OFFSET +
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002740 BTRFS_LEAF_DATA_SIZE(fs_info) - push_space,
David Sterba8f881e82019-03-20 11:33:10 +01002741 BTRFS_LEAF_DATA_OFFSET + leaf_data_end(left),
Chris Masond6025572007-03-30 14:27:56 -04002742 push_space);
Chris Mason5f39d392007-10-15 16:14:19 -04002743
2744 memmove_extent_buffer(right, btrfs_item_nr_offset(push_items),
2745 btrfs_item_nr_offset(0),
2746 right_nritems * sizeof(struct btrfs_item));
2747
Chris Mason00ec4c52007-02-24 12:47:20 -05002748 /* copy the items from left to right */
Chris Mason5f39d392007-10-15 16:14:19 -04002749 copy_extent_buffer(right, left, btrfs_item_nr_offset(0),
2750 btrfs_item_nr_offset(left_nritems - push_items),
2751 push_items * sizeof(struct btrfs_item));
Chris Mason00ec4c52007-02-24 12:47:20 -05002752
2753 /* update the item pointers */
David Sterbac82f8232019-08-09 17:48:21 +02002754 btrfs_init_map_token(&token, right);
Chris Mason7518a232007-03-12 12:01:18 -04002755 right_nritems += push_items;
Chris Mason5f39d392007-10-15 16:14:19 -04002756 btrfs_set_header_nritems(right, right_nritems);
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002757 push_space = BTRFS_LEAF_DATA_SIZE(fs_info);
Chris Mason7518a232007-03-12 12:01:18 -04002758 for (i = 0; i < right_nritems; i++) {
Ross Kirkdd3cc162013-09-16 15:58:09 +01002759 item = btrfs_item_nr(i);
David Sterbacc4c13d2020-04-29 02:15:56 +02002760 push_space -= btrfs_token_item_size(&token, item);
2761 btrfs_set_token_item_offset(&token, item, push_space);
Chris Masondb945352007-10-15 16:15:53 -04002762 }
2763
Chris Mason7518a232007-03-12 12:01:18 -04002764 left_nritems -= push_items;
Chris Mason5f39d392007-10-15 16:14:19 -04002765 btrfs_set_header_nritems(left, left_nritems);
Chris Mason00ec4c52007-02-24 12:47:20 -05002766
Chris Mason34a38212007-11-07 13:31:03 -05002767 if (left_nritems)
2768 btrfs_mark_buffer_dirty(left);
Yan, Zhengf0486c62010-05-16 10:46:25 -04002769 else
David Sterba6a884d7d2019-03-20 14:30:02 +01002770 btrfs_clean_tree_block(left);
Yan, Zhengf0486c62010-05-16 10:46:25 -04002771
Chris Mason5f39d392007-10-15 16:14:19 -04002772 btrfs_mark_buffer_dirty(right);
Chris Masona429e512007-04-18 16:15:28 -04002773
Chris Mason5f39d392007-10-15 16:14:19 -04002774 btrfs_item_key(right, &disk_key, 0);
2775 btrfs_set_node_key(upper, &disk_key, slot + 1);
Chris Masond6025572007-03-30 14:27:56 -04002776 btrfs_mark_buffer_dirty(upper);
Chris Mason02217ed2007-03-02 16:08:05 -05002777
Chris Mason00ec4c52007-02-24 12:47:20 -05002778 /* then fixup the leaf pointer in the path */
Chris Mason7518a232007-03-12 12:01:18 -04002779 if (path->slots[0] >= left_nritems) {
2780 path->slots[0] -= left_nritems;
Chris Mason925baed2008-06-25 16:01:30 -04002781 if (btrfs_header_nritems(path->nodes[0]) == 0)
David Sterba6a884d7d2019-03-20 14:30:02 +01002782 btrfs_clean_tree_block(path->nodes[0]);
Chris Mason925baed2008-06-25 16:01:30 -04002783 btrfs_tree_unlock(path->nodes[0]);
Chris Mason5f39d392007-10-15 16:14:19 -04002784 free_extent_buffer(path->nodes[0]);
2785 path->nodes[0] = right;
Chris Mason00ec4c52007-02-24 12:47:20 -05002786 path->slots[1] += 1;
2787 } else {
Chris Mason925baed2008-06-25 16:01:30 -04002788 btrfs_tree_unlock(right);
Chris Mason5f39d392007-10-15 16:14:19 -04002789 free_extent_buffer(right);
Chris Mason00ec4c52007-02-24 12:47:20 -05002790 }
2791 return 0;
Chris Mason925baed2008-06-25 16:01:30 -04002792
2793out_unlock:
2794 btrfs_tree_unlock(right);
2795 free_extent_buffer(right);
2796 return 1;
Chris Mason00ec4c52007-02-24 12:47:20 -05002797}
Chris Mason925baed2008-06-25 16:01:30 -04002798
Chris Mason00ec4c52007-02-24 12:47:20 -05002799/*
Chris Mason44871b12009-03-13 10:04:31 -04002800 * push some data in the path leaf to the right, trying to free up at
2801 * least data_size bytes. returns zero if the push worked, nonzero otherwise
2802 *
2803 * returns 1 if the push failed because the other node didn't have enough
2804 * room, 0 if everything worked out and < 0 if there were major errors.
Chris Mason99d8f832010-07-07 10:51:48 -04002805 *
2806 * this will push starting from min_slot to the end of the leaf. It won't
2807 * push any slot lower than min_slot
Chris Mason44871b12009-03-13 10:04:31 -04002808 */
2809static int push_leaf_right(struct btrfs_trans_handle *trans, struct btrfs_root
Chris Mason99d8f832010-07-07 10:51:48 -04002810 *root, struct btrfs_path *path,
2811 int min_data_size, int data_size,
2812 int empty, u32 min_slot)
Chris Mason44871b12009-03-13 10:04:31 -04002813{
2814 struct extent_buffer *left = path->nodes[0];
2815 struct extent_buffer *right;
2816 struct extent_buffer *upper;
2817 int slot;
2818 int free_space;
2819 u32 left_nritems;
2820 int ret;
2821
2822 if (!path->nodes[1])
2823 return 1;
2824
2825 slot = path->slots[1];
2826 upper = path->nodes[1];
2827 if (slot >= btrfs_header_nritems(upper) - 1)
2828 return 1;
2829
Filipe Manana49d0c642021-09-22 10:36:45 +01002830 btrfs_assert_tree_write_locked(path->nodes[1]);
Chris Mason44871b12009-03-13 10:04:31 -04002831
David Sterba4b231ae2019-08-21 19:16:27 +02002832 right = btrfs_read_node_slot(upper, slot + 1);
Liu Bofb770ae2016-07-05 12:10:14 -07002833 /*
2834 * slot + 1 is not valid or we fail to read the right node,
2835 * no big deal, just return.
2836 */
2837 if (IS_ERR(right))
Tsutomu Itoh91ca3382011-01-05 02:32:22 +00002838 return 1;
2839
Josef Bacikbf774672020-08-20 11:46:04 -04002840 __btrfs_tree_lock(right, BTRFS_NESTING_RIGHT);
Chris Mason44871b12009-03-13 10:04:31 -04002841
David Sterbae902baa2019-03-20 14:36:46 +01002842 free_space = btrfs_leaf_free_space(right);
Chris Mason44871b12009-03-13 10:04:31 -04002843 if (free_space < data_size)
2844 goto out_unlock;
2845
2846 /* cow and double check */
2847 ret = btrfs_cow_block(trans, root, right, upper,
Josef Bacikbf59a5a2020-08-20 11:46:05 -04002848 slot + 1, &right, BTRFS_NESTING_RIGHT_COW);
Chris Mason44871b12009-03-13 10:04:31 -04002849 if (ret)
2850 goto out_unlock;
2851
David Sterbae902baa2019-03-20 14:36:46 +01002852 free_space = btrfs_leaf_free_space(right);
Chris Mason44871b12009-03-13 10:04:31 -04002853 if (free_space < data_size)
2854 goto out_unlock;
2855
2856 left_nritems = btrfs_header_nritems(left);
2857 if (left_nritems == 0)
2858 goto out_unlock;
2859
Qu Wenruod16c7022020-08-19 14:35:50 +08002860 if (check_sibling_keys(left, right)) {
2861 ret = -EUCLEAN;
2862 btrfs_tree_unlock(right);
2863 free_extent_buffer(right);
2864 return ret;
2865 }
Filipe David Borba Manana2ef1fed2013-12-04 22:17:39 +00002866 if (path->slots[0] == left_nritems && !empty) {
2867 /* Key greater than all keys in the leaf, right neighbor has
2868 * enough room for it and we're not emptying our leaf to delete
2869 * it, therefore use right neighbor to insert the new item and
Andrea Gelmini52042d82018-11-28 12:05:13 +01002870 * no need to touch/dirty our left leaf. */
Filipe David Borba Manana2ef1fed2013-12-04 22:17:39 +00002871 btrfs_tree_unlock(left);
2872 free_extent_buffer(left);
2873 path->nodes[0] = right;
2874 path->slots[0] = 0;
2875 path->slots[1]++;
2876 return 0;
2877 }
2878
David Sterbaf72f0012019-03-20 14:39:45 +01002879 return __push_leaf_right(path, min_data_size, empty,
Chris Mason99d8f832010-07-07 10:51:48 -04002880 right, free_space, left_nritems, min_slot);
Chris Mason44871b12009-03-13 10:04:31 -04002881out_unlock:
2882 btrfs_tree_unlock(right);
2883 free_extent_buffer(right);
2884 return 1;
2885}
2886
2887/*
Chris Mason74123bd2007-02-02 11:05:29 -05002888 * push some data in the path leaf to the left, trying to free up at
2889 * least data_size bytes. returns zero if the push worked, nonzero otherwise
Chris Mason99d8f832010-07-07 10:51:48 -04002890 *
2891 * max_slot can put a limit on how far into the leaf we'll push items. The
2892 * item at 'max_slot' won't be touched. Use (u32)-1 to make us do all the
2893 * items
Chris Mason74123bd2007-02-02 11:05:29 -05002894 */
David Sterba8087c192019-03-20 14:40:41 +01002895static noinline int __push_leaf_left(struct btrfs_path *path, int data_size,
Chris Mason44871b12009-03-13 10:04:31 -04002896 int empty, struct extent_buffer *left,
Chris Mason99d8f832010-07-07 10:51:48 -04002897 int free_space, u32 right_nritems,
2898 u32 max_slot)
Chris Masonbe0e5c02007-01-26 15:51:26 -05002899{
David Sterba8087c192019-03-20 14:40:41 +01002900 struct btrfs_fs_info *fs_info = left->fs_info;
Chris Mason5f39d392007-10-15 16:14:19 -04002901 struct btrfs_disk_key disk_key;
2902 struct extent_buffer *right = path->nodes[0];
Chris Masonbe0e5c02007-01-26 15:51:26 -05002903 int i;
Chris Masonbe0e5c02007-01-26 15:51:26 -05002904 int push_space = 0;
2905 int push_items = 0;
Chris Mason0783fcf2007-03-12 20:12:07 -04002906 struct btrfs_item *item;
Chris Mason7518a232007-03-12 12:01:18 -04002907 u32 old_left_nritems;
Chris Mason34a38212007-11-07 13:31:03 -05002908 u32 nr;
Chris Masonaa5d6be2007-02-28 16:35:06 -05002909 int ret = 0;
Chris Masondb945352007-10-15 16:15:53 -04002910 u32 this_item_size;
2911 u32 old_left_item_size;
Chris Masoncfed81a2012-03-03 07:40:03 -05002912 struct btrfs_map_token token;
2913
Chris Mason34a38212007-11-07 13:31:03 -05002914 if (empty)
Chris Mason99d8f832010-07-07 10:51:48 -04002915 nr = min(right_nritems, max_slot);
Chris Mason34a38212007-11-07 13:31:03 -05002916 else
Chris Mason99d8f832010-07-07 10:51:48 -04002917 nr = min(right_nritems - 1, max_slot);
Chris Mason34a38212007-11-07 13:31:03 -05002918
2919 for (i = 0; i < nr; i++) {
Ross Kirkdd3cc162013-09-16 15:58:09 +01002920 item = btrfs_item_nr(i);
Chris Masondb945352007-10-15 16:15:53 -04002921
Zheng Yan31840ae2008-09-23 13:14:14 -04002922 if (!empty && push_items > 0) {
2923 if (path->slots[0] < i)
2924 break;
2925 if (path->slots[0] == i) {
David Sterbae902baa2019-03-20 14:36:46 +01002926 int space = btrfs_leaf_free_space(right);
2927
Zheng Yan31840ae2008-09-23 13:14:14 -04002928 if (space + push_space * 2 > free_space)
2929 break;
2930 }
2931 }
2932
Chris Masonbe0e5c02007-01-26 15:51:26 -05002933 if (path->slots[0] == i)
Yan Zheng87b29b22008-12-17 10:21:48 -05002934 push_space += data_size;
Chris Masondb945352007-10-15 16:15:53 -04002935
2936 this_item_size = btrfs_item_size(right, item);
2937 if (this_item_size + sizeof(*item) + push_space > free_space)
Chris Masonbe0e5c02007-01-26 15:51:26 -05002938 break;
Chris Masondb945352007-10-15 16:15:53 -04002939
Chris Masonbe0e5c02007-01-26 15:51:26 -05002940 push_items++;
Chris Masondb945352007-10-15 16:15:53 -04002941 push_space += this_item_size + sizeof(*item);
Chris Masonbe0e5c02007-01-26 15:51:26 -05002942 }
Chris Masondb945352007-10-15 16:15:53 -04002943
Chris Masonbe0e5c02007-01-26 15:51:26 -05002944 if (push_items == 0) {
Chris Mason925baed2008-06-25 16:01:30 -04002945 ret = 1;
2946 goto out;
Chris Masonbe0e5c02007-01-26 15:51:26 -05002947 }
Dulshani Gunawardhanafae7f212013-10-31 10:30:08 +05302948 WARN_ON(!empty && push_items == btrfs_header_nritems(right));
Chris Mason5f39d392007-10-15 16:14:19 -04002949
Chris Masonbe0e5c02007-01-26 15:51:26 -05002950 /* push data from right to left */
Chris Mason5f39d392007-10-15 16:14:19 -04002951 copy_extent_buffer(left, right,
2952 btrfs_item_nr_offset(btrfs_header_nritems(left)),
2953 btrfs_item_nr_offset(0),
2954 push_items * sizeof(struct btrfs_item));
2955
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002956 push_space = BTRFS_LEAF_DATA_SIZE(fs_info) -
Chris Masond3977122009-01-05 21:25:51 -05002957 btrfs_item_offset_nr(right, push_items - 1);
Chris Mason5f39d392007-10-15 16:14:19 -04002958
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03002959 copy_extent_buffer(left, right, BTRFS_LEAF_DATA_OFFSET +
David Sterba8f881e82019-03-20 11:33:10 +01002960 leaf_data_end(left) - push_space,
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03002961 BTRFS_LEAF_DATA_OFFSET +
Chris Mason5f39d392007-10-15 16:14:19 -04002962 btrfs_item_offset_nr(right, push_items - 1),
Chris Masond6025572007-03-30 14:27:56 -04002963 push_space);
Chris Mason5f39d392007-10-15 16:14:19 -04002964 old_left_nritems = btrfs_header_nritems(left);
Yan Zheng87b29b22008-12-17 10:21:48 -05002965 BUG_ON(old_left_nritems <= 0);
Chris Masoneb60cea2007-02-02 09:18:22 -05002966
David Sterbac82f8232019-08-09 17:48:21 +02002967 btrfs_init_map_token(&token, left);
Chris Masondb945352007-10-15 16:15:53 -04002968 old_left_item_size = btrfs_item_offset_nr(left, old_left_nritems - 1);
Chris Mason0783fcf2007-03-12 20:12:07 -04002969 for (i = old_left_nritems; i < old_left_nritems + push_items; i++) {
Chris Mason5f39d392007-10-15 16:14:19 -04002970 u32 ioff;
Chris Masondb945352007-10-15 16:15:53 -04002971
Ross Kirkdd3cc162013-09-16 15:58:09 +01002972 item = btrfs_item_nr(i);
Chris Masondb945352007-10-15 16:15:53 -04002973
David Sterbacc4c13d2020-04-29 02:15:56 +02002974 ioff = btrfs_token_item_offset(&token, item);
2975 btrfs_set_token_item_offset(&token, item,
2976 ioff - (BTRFS_LEAF_DATA_SIZE(fs_info) - old_left_item_size));
Chris Masonbe0e5c02007-01-26 15:51:26 -05002977 }
Chris Mason5f39d392007-10-15 16:14:19 -04002978 btrfs_set_header_nritems(left, old_left_nritems + push_items);
Chris Masonbe0e5c02007-01-26 15:51:26 -05002979
2980 /* fixup right node */
Julia Lawall31b1a2b2012-11-03 10:58:34 +00002981 if (push_items > right_nritems)
2982 WARN(1, KERN_CRIT "push items %d nr %u\n", push_items,
Chris Masond3977122009-01-05 21:25:51 -05002983 right_nritems);
Chris Mason5f39d392007-10-15 16:14:19 -04002984
Chris Mason34a38212007-11-07 13:31:03 -05002985 if (push_items < right_nritems) {
2986 push_space = btrfs_item_offset_nr(right, push_items - 1) -
David Sterba8f881e82019-03-20 11:33:10 +01002987 leaf_data_end(right);
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03002988 memmove_extent_buffer(right, BTRFS_LEAF_DATA_OFFSET +
Jeff Mahoney0b246af2016-06-22 18:54:23 -04002989 BTRFS_LEAF_DATA_SIZE(fs_info) - push_space,
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03002990 BTRFS_LEAF_DATA_OFFSET +
David Sterba8f881e82019-03-20 11:33:10 +01002991 leaf_data_end(right), push_space);
Chris Mason34a38212007-11-07 13:31:03 -05002992
2993 memmove_extent_buffer(right, btrfs_item_nr_offset(0),
Chris Mason5f39d392007-10-15 16:14:19 -04002994 btrfs_item_nr_offset(push_items),
2995 (btrfs_header_nritems(right) - push_items) *
2996 sizeof(struct btrfs_item));
Chris Mason34a38212007-11-07 13:31:03 -05002997 }
David Sterbac82f8232019-08-09 17:48:21 +02002998
2999 btrfs_init_map_token(&token, right);
Yaneef1c492007-11-26 10:58:13 -05003000 right_nritems -= push_items;
3001 btrfs_set_header_nritems(right, right_nritems);
Jeff Mahoney0b246af2016-06-22 18:54:23 -04003002 push_space = BTRFS_LEAF_DATA_SIZE(fs_info);
Chris Mason5f39d392007-10-15 16:14:19 -04003003 for (i = 0; i < right_nritems; i++) {
Ross Kirkdd3cc162013-09-16 15:58:09 +01003004 item = btrfs_item_nr(i);
Chris Masondb945352007-10-15 16:15:53 -04003005
David Sterbacc4c13d2020-04-29 02:15:56 +02003006 push_space = push_space - btrfs_token_item_size(&token, item);
3007 btrfs_set_token_item_offset(&token, item, push_space);
Chris Masondb945352007-10-15 16:15:53 -04003008 }
Chris Masoneb60cea2007-02-02 09:18:22 -05003009
Chris Mason5f39d392007-10-15 16:14:19 -04003010 btrfs_mark_buffer_dirty(left);
Chris Mason34a38212007-11-07 13:31:03 -05003011 if (right_nritems)
3012 btrfs_mark_buffer_dirty(right);
Yan, Zhengf0486c62010-05-16 10:46:25 -04003013 else
David Sterba6a884d7d2019-03-20 14:30:02 +01003014 btrfs_clean_tree_block(right);
Chris Mason098f59c2007-05-11 11:33:21 -04003015
Chris Mason5f39d392007-10-15 16:14:19 -04003016 btrfs_item_key(right, &disk_key, 0);
Nikolay Borisovb167fa92018-06-20 15:48:47 +03003017 fixup_low_keys(path, &disk_key, 1);
Chris Masonbe0e5c02007-01-26 15:51:26 -05003018
3019 /* then fixup the leaf pointer in the path */
3020 if (path->slots[0] < push_items) {
3021 path->slots[0] += old_left_nritems;
Chris Mason925baed2008-06-25 16:01:30 -04003022 btrfs_tree_unlock(path->nodes[0]);
Chris Mason5f39d392007-10-15 16:14:19 -04003023 free_extent_buffer(path->nodes[0]);
3024 path->nodes[0] = left;
Chris Masonbe0e5c02007-01-26 15:51:26 -05003025 path->slots[1] -= 1;
3026 } else {
Chris Mason925baed2008-06-25 16:01:30 -04003027 btrfs_tree_unlock(left);
Chris Mason5f39d392007-10-15 16:14:19 -04003028 free_extent_buffer(left);
Chris Masonbe0e5c02007-01-26 15:51:26 -05003029 path->slots[0] -= push_items;
3030 }
Chris Masoneb60cea2007-02-02 09:18:22 -05003031 BUG_ON(path->slots[0] < 0);
Chris Masonaa5d6be2007-02-28 16:35:06 -05003032 return ret;
Chris Mason925baed2008-06-25 16:01:30 -04003033out:
3034 btrfs_tree_unlock(left);
3035 free_extent_buffer(left);
3036 return ret;
Chris Masonbe0e5c02007-01-26 15:51:26 -05003037}
3038
Chris Mason74123bd2007-02-02 11:05:29 -05003039/*
Chris Mason44871b12009-03-13 10:04:31 -04003040 * push some data in the path leaf to the left, trying to free up at
3041 * least data_size bytes. returns zero if the push worked, nonzero otherwise
Chris Mason99d8f832010-07-07 10:51:48 -04003042 *
3043 * max_slot can put a limit on how far into the leaf we'll push items. The
3044 * item at 'max_slot' won't be touched. Use (u32)-1 to make us push all the
3045 * items
Chris Mason44871b12009-03-13 10:04:31 -04003046 */
3047static int push_leaf_left(struct btrfs_trans_handle *trans, struct btrfs_root
Chris Mason99d8f832010-07-07 10:51:48 -04003048 *root, struct btrfs_path *path, int min_data_size,
3049 int data_size, int empty, u32 max_slot)
Chris Mason44871b12009-03-13 10:04:31 -04003050{
3051 struct extent_buffer *right = path->nodes[0];
3052 struct extent_buffer *left;
3053 int slot;
3054 int free_space;
3055 u32 right_nritems;
3056 int ret = 0;
3057
3058 slot = path->slots[1];
3059 if (slot == 0)
3060 return 1;
3061 if (!path->nodes[1])
3062 return 1;
3063
3064 right_nritems = btrfs_header_nritems(right);
3065 if (right_nritems == 0)
3066 return 1;
3067
Filipe Manana49d0c642021-09-22 10:36:45 +01003068 btrfs_assert_tree_write_locked(path->nodes[1]);
Chris Mason44871b12009-03-13 10:04:31 -04003069
David Sterba4b231ae2019-08-21 19:16:27 +02003070 left = btrfs_read_node_slot(path->nodes[1], slot - 1);
Liu Bofb770ae2016-07-05 12:10:14 -07003071 /*
3072 * slot - 1 is not valid or we fail to read the left node,
3073 * no big deal, just return.
3074 */
3075 if (IS_ERR(left))
Tsutomu Itoh91ca3382011-01-05 02:32:22 +00003076 return 1;
3077
Josef Bacikbf774672020-08-20 11:46:04 -04003078 __btrfs_tree_lock(left, BTRFS_NESTING_LEFT);
Chris Mason44871b12009-03-13 10:04:31 -04003079
David Sterbae902baa2019-03-20 14:36:46 +01003080 free_space = btrfs_leaf_free_space(left);
Chris Mason44871b12009-03-13 10:04:31 -04003081 if (free_space < data_size) {
3082 ret = 1;
3083 goto out;
3084 }
3085
3086 /* cow and double check */
3087 ret = btrfs_cow_block(trans, root, left,
Josef Bacik9631e4c2020-08-20 11:46:03 -04003088 path->nodes[1], slot - 1, &left,
Josef Bacikbf59a5a2020-08-20 11:46:05 -04003089 BTRFS_NESTING_LEFT_COW);
Chris Mason44871b12009-03-13 10:04:31 -04003090 if (ret) {
3091 /* we hit -ENOSPC, but it isn't fatal here */
Jeff Mahoney79787ea2012-03-12 16:03:00 +01003092 if (ret == -ENOSPC)
3093 ret = 1;
Chris Mason44871b12009-03-13 10:04:31 -04003094 goto out;
3095 }
3096
David Sterbae902baa2019-03-20 14:36:46 +01003097 free_space = btrfs_leaf_free_space(left);
Chris Mason44871b12009-03-13 10:04:31 -04003098 if (free_space < data_size) {
3099 ret = 1;
3100 goto out;
3101 }
3102
Qu Wenruod16c7022020-08-19 14:35:50 +08003103 if (check_sibling_keys(left, right)) {
3104 ret = -EUCLEAN;
3105 goto out;
3106 }
David Sterba8087c192019-03-20 14:40:41 +01003107 return __push_leaf_left(path, min_data_size,
Chris Mason99d8f832010-07-07 10:51:48 -04003108 empty, left, free_space, right_nritems,
3109 max_slot);
Chris Mason44871b12009-03-13 10:04:31 -04003110out:
3111 btrfs_tree_unlock(left);
3112 free_extent_buffer(left);
3113 return ret;
3114}
3115
3116/*
Chris Mason74123bd2007-02-02 11:05:29 -05003117 * split the path's leaf in two, making sure there is at least data_size
3118 * available for the resulting leaf level of the path.
3119 */
Jeff Mahoney143bede2012-03-01 14:56:26 +01003120static noinline void copy_for_split(struct btrfs_trans_handle *trans,
Jeff Mahoney143bede2012-03-01 14:56:26 +01003121 struct btrfs_path *path,
3122 struct extent_buffer *l,
3123 struct extent_buffer *right,
3124 int slot, int mid, int nritems)
Chris Masonbe0e5c02007-01-26 15:51:26 -05003125{
David Sterba94f94ad2019-03-20 14:42:33 +01003126 struct btrfs_fs_info *fs_info = trans->fs_info;
Chris Masonbe0e5c02007-01-26 15:51:26 -05003127 int data_copy_size;
3128 int rt_data_off;
3129 int i;
Chris Masond4dbff92007-04-04 14:08:15 -04003130 struct btrfs_disk_key disk_key;
Chris Masoncfed81a2012-03-03 07:40:03 -05003131 struct btrfs_map_token token;
3132
Chris Mason5f39d392007-10-15 16:14:19 -04003133 nritems = nritems - mid;
3134 btrfs_set_header_nritems(right, nritems);
David Sterba8f881e82019-03-20 11:33:10 +01003135 data_copy_size = btrfs_item_end_nr(l, mid) - leaf_data_end(l);
Chris Mason5f39d392007-10-15 16:14:19 -04003136
3137 copy_extent_buffer(right, l, btrfs_item_nr_offset(0),
3138 btrfs_item_nr_offset(mid),
3139 nritems * sizeof(struct btrfs_item));
3140
3141 copy_extent_buffer(right, l,
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03003142 BTRFS_LEAF_DATA_OFFSET + BTRFS_LEAF_DATA_SIZE(fs_info) -
3143 data_copy_size, BTRFS_LEAF_DATA_OFFSET +
David Sterba8f881e82019-03-20 11:33:10 +01003144 leaf_data_end(l), data_copy_size);
Chris Mason74123bd2007-02-02 11:05:29 -05003145
Jeff Mahoney0b246af2016-06-22 18:54:23 -04003146 rt_data_off = BTRFS_LEAF_DATA_SIZE(fs_info) - btrfs_item_end_nr(l, mid);
Chris Mason5f39d392007-10-15 16:14:19 -04003147
David Sterbac82f8232019-08-09 17:48:21 +02003148 btrfs_init_map_token(&token, right);
Chris Mason5f39d392007-10-15 16:14:19 -04003149 for (i = 0; i < nritems; i++) {
Ross Kirkdd3cc162013-09-16 15:58:09 +01003150 struct btrfs_item *item = btrfs_item_nr(i);
Chris Masondb945352007-10-15 16:15:53 -04003151 u32 ioff;
3152
David Sterbacc4c13d2020-04-29 02:15:56 +02003153 ioff = btrfs_token_item_offset(&token, item);
3154 btrfs_set_token_item_offset(&token, item, ioff + rt_data_off);
Chris Mason0783fcf2007-03-12 20:12:07 -04003155 }
Chris Mason74123bd2007-02-02 11:05:29 -05003156
Chris Mason5f39d392007-10-15 16:14:19 -04003157 btrfs_set_header_nritems(l, mid);
Chris Mason5f39d392007-10-15 16:14:19 -04003158 btrfs_item_key(right, &disk_key, 0);
David Sterba6ad3cf62019-03-20 14:32:45 +01003159 insert_ptr(trans, path, &disk_key, right->start, path->slots[1] + 1, 1);
Chris Mason5f39d392007-10-15 16:14:19 -04003160
3161 btrfs_mark_buffer_dirty(right);
3162 btrfs_mark_buffer_dirty(l);
Chris Masoneb60cea2007-02-02 09:18:22 -05003163 BUG_ON(path->slots[0] != slot);
Chris Mason5f39d392007-10-15 16:14:19 -04003164
Chris Masonbe0e5c02007-01-26 15:51:26 -05003165 if (mid <= slot) {
Chris Mason925baed2008-06-25 16:01:30 -04003166 btrfs_tree_unlock(path->nodes[0]);
Chris Mason5f39d392007-10-15 16:14:19 -04003167 free_extent_buffer(path->nodes[0]);
3168 path->nodes[0] = right;
Chris Masonbe0e5c02007-01-26 15:51:26 -05003169 path->slots[0] -= mid;
3170 path->slots[1] += 1;
Chris Mason925baed2008-06-25 16:01:30 -04003171 } else {
3172 btrfs_tree_unlock(right);
Chris Mason5f39d392007-10-15 16:14:19 -04003173 free_extent_buffer(right);
Chris Mason925baed2008-06-25 16:01:30 -04003174 }
Chris Mason5f39d392007-10-15 16:14:19 -04003175
Chris Masoneb60cea2007-02-02 09:18:22 -05003176 BUG_ON(path->slots[0] < 0);
Chris Mason44871b12009-03-13 10:04:31 -04003177}
3178
3179/*
Chris Mason99d8f832010-07-07 10:51:48 -04003180 * double splits happen when we need to insert a big item in the middle
3181 * of a leaf. A double split can leave us with 3 mostly empty leaves:
3182 * leaf: [ slots 0 - N] [ our target ] [ N + 1 - total in leaf ]
3183 * A B C
3184 *
3185 * We avoid this by trying to push the items on either side of our target
3186 * into the adjacent leaves. If all goes well we can avoid the double split
3187 * completely.
3188 */
3189static noinline int push_for_double_split(struct btrfs_trans_handle *trans,
3190 struct btrfs_root *root,
3191 struct btrfs_path *path,
3192 int data_size)
3193{
3194 int ret;
3195 int progress = 0;
3196 int slot;
3197 u32 nritems;
Filipe David Borba Manana5a4267c2013-11-25 03:20:46 +00003198 int space_needed = data_size;
Chris Mason99d8f832010-07-07 10:51:48 -04003199
3200 slot = path->slots[0];
Filipe David Borba Manana5a4267c2013-11-25 03:20:46 +00003201 if (slot < btrfs_header_nritems(path->nodes[0]))
David Sterbae902baa2019-03-20 14:36:46 +01003202 space_needed -= btrfs_leaf_free_space(path->nodes[0]);
Chris Mason99d8f832010-07-07 10:51:48 -04003203
3204 /*
3205 * try to push all the items after our slot into the
3206 * right leaf
3207 */
Filipe David Borba Manana5a4267c2013-11-25 03:20:46 +00003208 ret = push_leaf_right(trans, root, path, 1, space_needed, 0, slot);
Chris Mason99d8f832010-07-07 10:51:48 -04003209 if (ret < 0)
3210 return ret;
3211
3212 if (ret == 0)
3213 progress++;
3214
3215 nritems = btrfs_header_nritems(path->nodes[0]);
3216 /*
3217 * our goal is to get our slot at the start or end of a leaf. If
3218 * we've done so we're done
3219 */
3220 if (path->slots[0] == 0 || path->slots[0] == nritems)
3221 return 0;
3222
David Sterbae902baa2019-03-20 14:36:46 +01003223 if (btrfs_leaf_free_space(path->nodes[0]) >= data_size)
Chris Mason99d8f832010-07-07 10:51:48 -04003224 return 0;
3225
3226 /* try to push all the items before our slot into the next leaf */
3227 slot = path->slots[0];
Filipe Manana263d3992017-02-17 18:43:57 +00003228 space_needed = data_size;
3229 if (slot > 0)
David Sterbae902baa2019-03-20 14:36:46 +01003230 space_needed -= btrfs_leaf_free_space(path->nodes[0]);
Filipe David Borba Manana5a4267c2013-11-25 03:20:46 +00003231 ret = push_leaf_left(trans, root, path, 1, space_needed, 0, slot);
Chris Mason99d8f832010-07-07 10:51:48 -04003232 if (ret < 0)
3233 return ret;
3234
3235 if (ret == 0)
3236 progress++;
3237
3238 if (progress)
3239 return 0;
3240 return 1;
3241}
3242
3243/*
Chris Mason44871b12009-03-13 10:04:31 -04003244 * split the path's leaf in two, making sure there is at least data_size
3245 * available for the resulting leaf level of the path.
3246 *
3247 * returns 0 if all went well and < 0 on failure.
3248 */
3249static noinline int split_leaf(struct btrfs_trans_handle *trans,
3250 struct btrfs_root *root,
Omar Sandoval310712b2017-01-17 23:24:37 -08003251 const struct btrfs_key *ins_key,
Chris Mason44871b12009-03-13 10:04:31 -04003252 struct btrfs_path *path, int data_size,
3253 int extend)
3254{
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003255 struct btrfs_disk_key disk_key;
Chris Mason44871b12009-03-13 10:04:31 -04003256 struct extent_buffer *l;
3257 u32 nritems;
3258 int mid;
3259 int slot;
3260 struct extent_buffer *right;
Daniel Dresslerb7a03652014-11-12 13:43:09 +09003261 struct btrfs_fs_info *fs_info = root->fs_info;
Chris Mason44871b12009-03-13 10:04:31 -04003262 int ret = 0;
3263 int wret;
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003264 int split;
Chris Mason44871b12009-03-13 10:04:31 -04003265 int num_doubles = 0;
Chris Mason99d8f832010-07-07 10:51:48 -04003266 int tried_avoid_double = 0;
Chris Mason44871b12009-03-13 10:04:31 -04003267
Yan, Zhenga5719522009-09-24 09:17:31 -04003268 l = path->nodes[0];
3269 slot = path->slots[0];
3270 if (extend && data_size + btrfs_item_size_nr(l, slot) +
Jeff Mahoney0b246af2016-06-22 18:54:23 -04003271 sizeof(struct btrfs_item) > BTRFS_LEAF_DATA_SIZE(fs_info))
Yan, Zhenga5719522009-09-24 09:17:31 -04003272 return -EOVERFLOW;
3273
Chris Mason44871b12009-03-13 10:04:31 -04003274 /* first try to make some room by pushing left and right */
Liu Bo33157e02013-05-22 12:07:06 +00003275 if (data_size && path->nodes[1]) {
Filipe David Borba Manana5a4267c2013-11-25 03:20:46 +00003276 int space_needed = data_size;
3277
3278 if (slot < btrfs_header_nritems(l))
David Sterbae902baa2019-03-20 14:36:46 +01003279 space_needed -= btrfs_leaf_free_space(l);
Filipe David Borba Manana5a4267c2013-11-25 03:20:46 +00003280
3281 wret = push_leaf_right(trans, root, path, space_needed,
3282 space_needed, 0, 0);
Chris Mason44871b12009-03-13 10:04:31 -04003283 if (wret < 0)
3284 return wret;
3285 if (wret) {
Filipe Manana263d3992017-02-17 18:43:57 +00003286 space_needed = data_size;
3287 if (slot > 0)
David Sterbae902baa2019-03-20 14:36:46 +01003288 space_needed -= btrfs_leaf_free_space(l);
Filipe David Borba Manana5a4267c2013-11-25 03:20:46 +00003289 wret = push_leaf_left(trans, root, path, space_needed,
3290 space_needed, 0, (u32)-1);
Chris Mason44871b12009-03-13 10:04:31 -04003291 if (wret < 0)
3292 return wret;
3293 }
3294 l = path->nodes[0];
3295
3296 /* did the pushes work? */
David Sterbae902baa2019-03-20 14:36:46 +01003297 if (btrfs_leaf_free_space(l) >= data_size)
Chris Mason44871b12009-03-13 10:04:31 -04003298 return 0;
3299 }
3300
3301 if (!path->nodes[1]) {
Liu Bofdd99c72013-05-22 12:06:51 +00003302 ret = insert_new_root(trans, root, path, 1);
Chris Mason44871b12009-03-13 10:04:31 -04003303 if (ret)
3304 return ret;
3305 }
3306again:
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003307 split = 1;
Chris Mason44871b12009-03-13 10:04:31 -04003308 l = path->nodes[0];
3309 slot = path->slots[0];
3310 nritems = btrfs_header_nritems(l);
3311 mid = (nritems + 1) / 2;
3312
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003313 if (mid <= slot) {
3314 if (nritems == 1 ||
3315 leaf_space_used(l, mid, nritems - mid) + data_size >
Jeff Mahoney0b246af2016-06-22 18:54:23 -04003316 BTRFS_LEAF_DATA_SIZE(fs_info)) {
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003317 if (slot >= nritems) {
3318 split = 0;
3319 } else {
3320 mid = slot;
3321 if (mid != nritems &&
3322 leaf_space_used(l, mid, nritems - mid) +
Jeff Mahoney0b246af2016-06-22 18:54:23 -04003323 data_size > BTRFS_LEAF_DATA_SIZE(fs_info)) {
Chris Mason99d8f832010-07-07 10:51:48 -04003324 if (data_size && !tried_avoid_double)
3325 goto push_for_double;
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003326 split = 2;
3327 }
3328 }
3329 }
3330 } else {
3331 if (leaf_space_used(l, 0, mid) + data_size >
Jeff Mahoney0b246af2016-06-22 18:54:23 -04003332 BTRFS_LEAF_DATA_SIZE(fs_info)) {
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003333 if (!extend && data_size && slot == 0) {
3334 split = 0;
3335 } else if ((extend || !data_size) && slot == 0) {
3336 mid = 1;
3337 } else {
3338 mid = slot;
3339 if (mid != nritems &&
3340 leaf_space_used(l, mid, nritems - mid) +
Jeff Mahoney0b246af2016-06-22 18:54:23 -04003341 data_size > BTRFS_LEAF_DATA_SIZE(fs_info)) {
Chris Mason99d8f832010-07-07 10:51:48 -04003342 if (data_size && !tried_avoid_double)
3343 goto push_for_double;
Dulshani Gunawardhana67871252013-10-31 10:33:04 +05303344 split = 2;
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003345 }
3346 }
3347 }
3348 }
3349
3350 if (split == 0)
3351 btrfs_cpu_key_to_disk(&disk_key, ins_key);
3352 else
3353 btrfs_item_key(l, &disk_key, mid);
3354
Josef Bacikca9d4732020-08-20 11:46:08 -04003355 /*
3356 * We have to about BTRFS_NESTING_NEW_ROOT here if we've done a double
3357 * split, because we're only allowed to have MAX_LOCKDEP_SUBCLASSES
3358 * subclasses, which is 8 at the time of this patch, and we've maxed it
3359 * out. In the future we could add a
3360 * BTRFS_NESTING_SPLIT_THE_SPLITTENING if we need to, but for now just
3361 * use BTRFS_NESTING_NEW_ROOT.
3362 */
Filipe Manana79bd3712021-06-29 14:43:06 +01003363 right = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
3364 &disk_key, 0, l->start, 0,
3365 num_doubles ? BTRFS_NESTING_NEW_ROOT :
3366 BTRFS_NESTING_SPLIT);
Yan, Zhengf0486c62010-05-16 10:46:25 -04003367 if (IS_ERR(right))
Chris Mason44871b12009-03-13 10:04:31 -04003368 return PTR_ERR(right);
Yan, Zhengf0486c62010-05-16 10:46:25 -04003369
Jeff Mahoney0b246af2016-06-22 18:54:23 -04003370 root_add_used(root, fs_info->nodesize);
Chris Mason44871b12009-03-13 10:04:31 -04003371
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003372 if (split == 0) {
3373 if (mid <= slot) {
3374 btrfs_set_header_nritems(right, 0);
David Sterba6ad3cf62019-03-20 14:32:45 +01003375 insert_ptr(trans, path, &disk_key,
Jeff Mahoney2ff7e612016-06-22 18:54:24 -04003376 right->start, path->slots[1] + 1, 1);
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003377 btrfs_tree_unlock(path->nodes[0]);
3378 free_extent_buffer(path->nodes[0]);
3379 path->nodes[0] = right;
3380 path->slots[0] = 0;
3381 path->slots[1] += 1;
3382 } else {
3383 btrfs_set_header_nritems(right, 0);
David Sterba6ad3cf62019-03-20 14:32:45 +01003384 insert_ptr(trans, path, &disk_key,
Jeff Mahoney2ff7e612016-06-22 18:54:24 -04003385 right->start, path->slots[1], 1);
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003386 btrfs_tree_unlock(path->nodes[0]);
3387 free_extent_buffer(path->nodes[0]);
3388 path->nodes[0] = right;
3389 path->slots[0] = 0;
Jeff Mahoney143bede2012-03-01 14:56:26 +01003390 if (path->slots[1] == 0)
Nikolay Borisovb167fa92018-06-20 15:48:47 +03003391 fixup_low_keys(path, &disk_key, 1);
Chris Mason44871b12009-03-13 10:04:31 -04003392 }
Liu Bo196e0242016-09-07 14:48:28 -07003393 /*
3394 * We create a new leaf 'right' for the required ins_len and
3395 * we'll do btrfs_mark_buffer_dirty() on this leaf after copying
3396 * the content of ins_len to 'right'.
3397 */
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003398 return ret;
Chris Mason44871b12009-03-13 10:04:31 -04003399 }
3400
David Sterba94f94ad2019-03-20 14:42:33 +01003401 copy_for_split(trans, path, l, right, slot, mid, nritems);
Chris Mason44871b12009-03-13 10:04:31 -04003402
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003403 if (split == 2) {
Chris Masoncc0c5532007-10-25 15:42:57 -04003404 BUG_ON(num_doubles != 0);
3405 num_doubles++;
3406 goto again;
Chris Mason3326d1b2007-10-15 16:18:25 -04003407 }
Chris Mason44871b12009-03-13 10:04:31 -04003408
Jeff Mahoney143bede2012-03-01 14:56:26 +01003409 return 0;
Chris Mason99d8f832010-07-07 10:51:48 -04003410
3411push_for_double:
3412 push_for_double_split(trans, root, path, data_size);
3413 tried_avoid_double = 1;
David Sterbae902baa2019-03-20 14:36:46 +01003414 if (btrfs_leaf_free_space(path->nodes[0]) >= data_size)
Chris Mason99d8f832010-07-07 10:51:48 -04003415 return 0;
3416 goto again;
Chris Masonbe0e5c02007-01-26 15:51:26 -05003417}
3418
Yan, Zhengad48fd752009-11-12 09:33:58 +00003419static noinline int setup_leaf_for_split(struct btrfs_trans_handle *trans,
3420 struct btrfs_root *root,
3421 struct btrfs_path *path, int ins_len)
Chris Mason459931e2008-12-10 09:10:46 -05003422{
Yan, Zhengad48fd752009-11-12 09:33:58 +00003423 struct btrfs_key key;
Chris Mason459931e2008-12-10 09:10:46 -05003424 struct extent_buffer *leaf;
Yan, Zhengad48fd752009-11-12 09:33:58 +00003425 struct btrfs_file_extent_item *fi;
3426 u64 extent_len = 0;
3427 u32 item_size;
3428 int ret;
Chris Mason459931e2008-12-10 09:10:46 -05003429
3430 leaf = path->nodes[0];
Yan, Zhengad48fd752009-11-12 09:33:58 +00003431 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
3432
3433 BUG_ON(key.type != BTRFS_EXTENT_DATA_KEY &&
3434 key.type != BTRFS_EXTENT_CSUM_KEY);
3435
David Sterbae902baa2019-03-20 14:36:46 +01003436 if (btrfs_leaf_free_space(leaf) >= ins_len)
Yan, Zhengad48fd752009-11-12 09:33:58 +00003437 return 0;
Chris Mason459931e2008-12-10 09:10:46 -05003438
3439 item_size = btrfs_item_size_nr(leaf, path->slots[0]);
Yan, Zhengad48fd752009-11-12 09:33:58 +00003440 if (key.type == BTRFS_EXTENT_DATA_KEY) {
3441 fi = btrfs_item_ptr(leaf, path->slots[0],
3442 struct btrfs_file_extent_item);
3443 extent_len = btrfs_file_extent_num_bytes(leaf, fi);
3444 }
David Sterbab3b4aa72011-04-21 01:20:15 +02003445 btrfs_release_path(path);
Chris Mason459931e2008-12-10 09:10:46 -05003446
Chris Mason459931e2008-12-10 09:10:46 -05003447 path->keep_locks = 1;
Yan, Zhengad48fd752009-11-12 09:33:58 +00003448 path->search_for_split = 1;
3449 ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
Chris Mason459931e2008-12-10 09:10:46 -05003450 path->search_for_split = 0;
Filipe Mananaa8df6fe2015-01-20 12:40:53 +00003451 if (ret > 0)
3452 ret = -EAGAIN;
Yan, Zhengad48fd752009-11-12 09:33:58 +00003453 if (ret < 0)
3454 goto err;
Chris Mason459931e2008-12-10 09:10:46 -05003455
Yan, Zhengad48fd752009-11-12 09:33:58 +00003456 ret = -EAGAIN;
3457 leaf = path->nodes[0];
Filipe Mananaa8df6fe2015-01-20 12:40:53 +00003458 /* if our item isn't there, return now */
3459 if (item_size != btrfs_item_size_nr(leaf, path->slots[0]))
Yan, Zhengad48fd752009-11-12 09:33:58 +00003460 goto err;
3461
Chris Mason109f6ae2010-04-02 09:20:18 -04003462 /* the leaf has changed, it now has room. return now */
David Sterbae902baa2019-03-20 14:36:46 +01003463 if (btrfs_leaf_free_space(path->nodes[0]) >= ins_len)
Chris Mason109f6ae2010-04-02 09:20:18 -04003464 goto err;
3465
Yan, Zhengad48fd752009-11-12 09:33:58 +00003466 if (key.type == BTRFS_EXTENT_DATA_KEY) {
3467 fi = btrfs_item_ptr(leaf, path->slots[0],
3468 struct btrfs_file_extent_item);
3469 if (extent_len != btrfs_file_extent_num_bytes(leaf, fi))
3470 goto err;
Chris Mason459931e2008-12-10 09:10:46 -05003471 }
3472
Yan, Zhengad48fd752009-11-12 09:33:58 +00003473 ret = split_leaf(trans, root, &key, path, ins_len, 1);
Yan, Zhengf0486c62010-05-16 10:46:25 -04003474 if (ret)
3475 goto err;
Chris Mason459931e2008-12-10 09:10:46 -05003476
Yan, Zhengad48fd752009-11-12 09:33:58 +00003477 path->keep_locks = 0;
Chris Masonb9473432009-03-13 11:00:37 -04003478 btrfs_unlock_up_safe(path, 1);
Yan, Zhengad48fd752009-11-12 09:33:58 +00003479 return 0;
3480err:
3481 path->keep_locks = 0;
3482 return ret;
3483}
3484
David Sterba25263cd2019-03-20 14:44:57 +01003485static noinline int split_item(struct btrfs_path *path,
Omar Sandoval310712b2017-01-17 23:24:37 -08003486 const struct btrfs_key *new_key,
Yan, Zhengad48fd752009-11-12 09:33:58 +00003487 unsigned long split_offset)
3488{
3489 struct extent_buffer *leaf;
3490 struct btrfs_item *item;
3491 struct btrfs_item *new_item;
3492 int slot;
3493 char *buf;
3494 u32 nritems;
3495 u32 item_size;
3496 u32 orig_offset;
3497 struct btrfs_disk_key disk_key;
3498
Chris Masonb9473432009-03-13 11:00:37 -04003499 leaf = path->nodes[0];
David Sterbae902baa2019-03-20 14:36:46 +01003500 BUG_ON(btrfs_leaf_free_space(leaf) < sizeof(struct btrfs_item));
Chris Masonb9473432009-03-13 11:00:37 -04003501
Ross Kirkdd3cc162013-09-16 15:58:09 +01003502 item = btrfs_item_nr(path->slots[0]);
Chris Mason459931e2008-12-10 09:10:46 -05003503 orig_offset = btrfs_item_offset(leaf, item);
3504 item_size = btrfs_item_size(leaf, item);
3505
Chris Mason459931e2008-12-10 09:10:46 -05003506 buf = kmalloc(item_size, GFP_NOFS);
Yan, Zhengad48fd752009-11-12 09:33:58 +00003507 if (!buf)
3508 return -ENOMEM;
3509
Chris Mason459931e2008-12-10 09:10:46 -05003510 read_extent_buffer(leaf, buf, btrfs_item_ptr_offset(leaf,
3511 path->slots[0]), item_size);
Yan, Zhengad48fd752009-11-12 09:33:58 +00003512
Chris Mason459931e2008-12-10 09:10:46 -05003513 slot = path->slots[0] + 1;
Chris Mason459931e2008-12-10 09:10:46 -05003514 nritems = btrfs_header_nritems(leaf);
Chris Mason459931e2008-12-10 09:10:46 -05003515 if (slot != nritems) {
3516 /* shift the items */
3517 memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + 1),
Yan, Zhengad48fd752009-11-12 09:33:58 +00003518 btrfs_item_nr_offset(slot),
3519 (nritems - slot) * sizeof(struct btrfs_item));
Chris Mason459931e2008-12-10 09:10:46 -05003520 }
3521
3522 btrfs_cpu_key_to_disk(&disk_key, new_key);
3523 btrfs_set_item_key(leaf, &disk_key, slot);
3524
Ross Kirkdd3cc162013-09-16 15:58:09 +01003525 new_item = btrfs_item_nr(slot);
Chris Mason459931e2008-12-10 09:10:46 -05003526
3527 btrfs_set_item_offset(leaf, new_item, orig_offset);
3528 btrfs_set_item_size(leaf, new_item, item_size - split_offset);
3529
3530 btrfs_set_item_offset(leaf, item,
3531 orig_offset + item_size - split_offset);
3532 btrfs_set_item_size(leaf, item, split_offset);
3533
3534 btrfs_set_header_nritems(leaf, nritems + 1);
3535
3536 /* write the data for the start of the original item */
3537 write_extent_buffer(leaf, buf,
3538 btrfs_item_ptr_offset(leaf, path->slots[0]),
3539 split_offset);
3540
3541 /* write the data for the new item */
3542 write_extent_buffer(leaf, buf + split_offset,
3543 btrfs_item_ptr_offset(leaf, slot),
3544 item_size - split_offset);
3545 btrfs_mark_buffer_dirty(leaf);
3546
David Sterbae902baa2019-03-20 14:36:46 +01003547 BUG_ON(btrfs_leaf_free_space(leaf) < 0);
Chris Mason459931e2008-12-10 09:10:46 -05003548 kfree(buf);
Yan, Zhengad48fd752009-11-12 09:33:58 +00003549 return 0;
3550}
3551
3552/*
3553 * This function splits a single item into two items,
3554 * giving 'new_key' to the new item and splitting the
3555 * old one at split_offset (from the start of the item).
3556 *
3557 * The path may be released by this operation. After
3558 * the split, the path is pointing to the old item. The
3559 * new item is going to be in the same node as the old one.
3560 *
3561 * Note, the item being split must be smaller enough to live alone on
3562 * a tree block with room for one extra struct btrfs_item
3563 *
3564 * This allows us to split the item in place, keeping a lock on the
3565 * leaf the entire time.
3566 */
3567int btrfs_split_item(struct btrfs_trans_handle *trans,
3568 struct btrfs_root *root,
3569 struct btrfs_path *path,
Omar Sandoval310712b2017-01-17 23:24:37 -08003570 const struct btrfs_key *new_key,
Yan, Zhengad48fd752009-11-12 09:33:58 +00003571 unsigned long split_offset)
3572{
3573 int ret;
3574 ret = setup_leaf_for_split(trans, root, path,
3575 sizeof(struct btrfs_item));
3576 if (ret)
3577 return ret;
3578
David Sterba25263cd2019-03-20 14:44:57 +01003579 ret = split_item(path, new_key, split_offset);
Chris Mason459931e2008-12-10 09:10:46 -05003580 return ret;
3581}
3582
3583/*
Yan, Zhengad48fd752009-11-12 09:33:58 +00003584 * This function duplicate a item, giving 'new_key' to the new item.
3585 * It guarantees both items live in the same tree leaf and the new item
3586 * is contiguous with the original item.
3587 *
3588 * This allows us to split file extent in place, keeping a lock on the
3589 * leaf the entire time.
3590 */
3591int btrfs_duplicate_item(struct btrfs_trans_handle *trans,
3592 struct btrfs_root *root,
3593 struct btrfs_path *path,
Omar Sandoval310712b2017-01-17 23:24:37 -08003594 const struct btrfs_key *new_key)
Yan, Zhengad48fd752009-11-12 09:33:58 +00003595{
3596 struct extent_buffer *leaf;
3597 int ret;
3598 u32 item_size;
3599
3600 leaf = path->nodes[0];
3601 item_size = btrfs_item_size_nr(leaf, path->slots[0]);
3602 ret = setup_leaf_for_split(trans, root, path,
3603 item_size + sizeof(struct btrfs_item));
3604 if (ret)
3605 return ret;
3606
3607 path->slots[0]++;
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003608 setup_item_for_insert(root, path, new_key, item_size);
Yan, Zhengad48fd752009-11-12 09:33:58 +00003609 leaf = path->nodes[0];
3610 memcpy_extent_buffer(leaf,
3611 btrfs_item_ptr_offset(leaf, path->slots[0]),
3612 btrfs_item_ptr_offset(leaf, path->slots[0] - 1),
3613 item_size);
3614 return 0;
3615}
3616
3617/*
Chris Masond352ac62008-09-29 15:18:18 -04003618 * make the item pointed to by the path smaller. new_size indicates
3619 * how small to make it, and from_end tells us if we just chop bytes
3620 * off the end of the item or if we shift the item to chop bytes off
3621 * the front.
3622 */
David Sterba78ac4f92019-03-20 14:49:12 +01003623void btrfs_truncate_item(struct btrfs_path *path, u32 new_size, int from_end)
Chris Masonb18c6682007-04-17 13:26:50 -04003624{
Chris Masonb18c6682007-04-17 13:26:50 -04003625 int slot;
Chris Mason5f39d392007-10-15 16:14:19 -04003626 struct extent_buffer *leaf;
3627 struct btrfs_item *item;
Chris Masonb18c6682007-04-17 13:26:50 -04003628 u32 nritems;
3629 unsigned int data_end;
3630 unsigned int old_data_start;
3631 unsigned int old_size;
3632 unsigned int size_diff;
3633 int i;
Chris Masoncfed81a2012-03-03 07:40:03 -05003634 struct btrfs_map_token token;
3635
Chris Mason5f39d392007-10-15 16:14:19 -04003636 leaf = path->nodes[0];
Chris Mason179e29e2007-11-01 11:28:41 -04003637 slot = path->slots[0];
3638
3639 old_size = btrfs_item_size_nr(leaf, slot);
3640 if (old_size == new_size)
Jeff Mahoney143bede2012-03-01 14:56:26 +01003641 return;
Chris Masonb18c6682007-04-17 13:26:50 -04003642
Chris Mason5f39d392007-10-15 16:14:19 -04003643 nritems = btrfs_header_nritems(leaf);
David Sterba8f881e82019-03-20 11:33:10 +01003644 data_end = leaf_data_end(leaf);
Chris Masonb18c6682007-04-17 13:26:50 -04003645
Chris Mason5f39d392007-10-15 16:14:19 -04003646 old_data_start = btrfs_item_offset_nr(leaf, slot);
Chris Mason179e29e2007-11-01 11:28:41 -04003647
Chris Masonb18c6682007-04-17 13:26:50 -04003648 size_diff = old_size - new_size;
3649
3650 BUG_ON(slot < 0);
3651 BUG_ON(slot >= nritems);
3652
3653 /*
3654 * item0..itemN ... dataN.offset..dataN.size .. data0.size
3655 */
3656 /* first correct the data pointers */
David Sterbac82f8232019-08-09 17:48:21 +02003657 btrfs_init_map_token(&token, leaf);
Chris Masonb18c6682007-04-17 13:26:50 -04003658 for (i = slot; i < nritems; i++) {
Chris Mason5f39d392007-10-15 16:14:19 -04003659 u32 ioff;
Ross Kirkdd3cc162013-09-16 15:58:09 +01003660 item = btrfs_item_nr(i);
Chris Masondb945352007-10-15 16:15:53 -04003661
David Sterbacc4c13d2020-04-29 02:15:56 +02003662 ioff = btrfs_token_item_offset(&token, item);
3663 btrfs_set_token_item_offset(&token, item, ioff + size_diff);
Chris Masonb18c6682007-04-17 13:26:50 -04003664 }
Chris Masondb945352007-10-15 16:15:53 -04003665
Chris Masonb18c6682007-04-17 13:26:50 -04003666 /* shift the data */
Chris Mason179e29e2007-11-01 11:28:41 -04003667 if (from_end) {
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03003668 memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET +
3669 data_end + size_diff, BTRFS_LEAF_DATA_OFFSET +
Chris Mason179e29e2007-11-01 11:28:41 -04003670 data_end, old_data_start + new_size - data_end);
3671 } else {
3672 struct btrfs_disk_key disk_key;
3673 u64 offset;
3674
3675 btrfs_item_key(leaf, &disk_key, slot);
3676
3677 if (btrfs_disk_key_type(&disk_key) == BTRFS_EXTENT_DATA_KEY) {
3678 unsigned long ptr;
3679 struct btrfs_file_extent_item *fi;
3680
3681 fi = btrfs_item_ptr(leaf, slot,
3682 struct btrfs_file_extent_item);
3683 fi = (struct btrfs_file_extent_item *)(
3684 (unsigned long)fi - size_diff);
3685
3686 if (btrfs_file_extent_type(leaf, fi) ==
3687 BTRFS_FILE_EXTENT_INLINE) {
3688 ptr = btrfs_item_ptr_offset(leaf, slot);
3689 memmove_extent_buffer(leaf, ptr,
Chris Masond3977122009-01-05 21:25:51 -05003690 (unsigned long)fi,
David Sterba7ec20af2014-07-24 17:34:58 +02003691 BTRFS_FILE_EXTENT_INLINE_DATA_START);
Chris Mason179e29e2007-11-01 11:28:41 -04003692 }
3693 }
3694
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03003695 memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET +
3696 data_end + size_diff, BTRFS_LEAF_DATA_OFFSET +
Chris Mason179e29e2007-11-01 11:28:41 -04003697 data_end, old_data_start - data_end);
3698
3699 offset = btrfs_disk_key_offset(&disk_key);
3700 btrfs_set_disk_key_offset(&disk_key, offset + size_diff);
3701 btrfs_set_item_key(leaf, &disk_key, slot);
3702 if (slot == 0)
Nikolay Borisovb167fa92018-06-20 15:48:47 +03003703 fixup_low_keys(path, &disk_key, 1);
Chris Mason179e29e2007-11-01 11:28:41 -04003704 }
Chris Mason5f39d392007-10-15 16:14:19 -04003705
Ross Kirkdd3cc162013-09-16 15:58:09 +01003706 item = btrfs_item_nr(slot);
Chris Mason5f39d392007-10-15 16:14:19 -04003707 btrfs_set_item_size(leaf, item, new_size);
3708 btrfs_mark_buffer_dirty(leaf);
Chris Masonb18c6682007-04-17 13:26:50 -04003709
David Sterbae902baa2019-03-20 14:36:46 +01003710 if (btrfs_leaf_free_space(leaf) < 0) {
David Sterbaa4f78752017-06-29 18:37:49 +02003711 btrfs_print_leaf(leaf);
Chris Masonb18c6682007-04-17 13:26:50 -04003712 BUG();
Chris Mason5f39d392007-10-15 16:14:19 -04003713 }
Chris Masonb18c6682007-04-17 13:26:50 -04003714}
3715
Chris Masond352ac62008-09-29 15:18:18 -04003716/*
Stefan Behrens8f69dbd2013-05-07 10:23:30 +00003717 * make the item pointed to by the path bigger, data_size is the added size.
Chris Masond352ac62008-09-29 15:18:18 -04003718 */
David Sterbac71dd882019-03-20 14:51:10 +01003719void btrfs_extend_item(struct btrfs_path *path, u32 data_size)
Chris Mason6567e832007-04-16 09:22:45 -04003720{
Chris Mason6567e832007-04-16 09:22:45 -04003721 int slot;
Chris Mason5f39d392007-10-15 16:14:19 -04003722 struct extent_buffer *leaf;
3723 struct btrfs_item *item;
Chris Mason6567e832007-04-16 09:22:45 -04003724 u32 nritems;
3725 unsigned int data_end;
3726 unsigned int old_data;
3727 unsigned int old_size;
3728 int i;
Chris Masoncfed81a2012-03-03 07:40:03 -05003729 struct btrfs_map_token token;
3730
Chris Mason5f39d392007-10-15 16:14:19 -04003731 leaf = path->nodes[0];
Chris Mason6567e832007-04-16 09:22:45 -04003732
Chris Mason5f39d392007-10-15 16:14:19 -04003733 nritems = btrfs_header_nritems(leaf);
David Sterba8f881e82019-03-20 11:33:10 +01003734 data_end = leaf_data_end(leaf);
Chris Mason6567e832007-04-16 09:22:45 -04003735
David Sterbae902baa2019-03-20 14:36:46 +01003736 if (btrfs_leaf_free_space(leaf) < data_size) {
David Sterbaa4f78752017-06-29 18:37:49 +02003737 btrfs_print_leaf(leaf);
Chris Mason6567e832007-04-16 09:22:45 -04003738 BUG();
Chris Mason5f39d392007-10-15 16:14:19 -04003739 }
Chris Mason6567e832007-04-16 09:22:45 -04003740 slot = path->slots[0];
Chris Mason5f39d392007-10-15 16:14:19 -04003741 old_data = btrfs_item_end_nr(leaf, slot);
Chris Mason6567e832007-04-16 09:22:45 -04003742
3743 BUG_ON(slot < 0);
Chris Mason3326d1b2007-10-15 16:18:25 -04003744 if (slot >= nritems) {
David Sterbaa4f78752017-06-29 18:37:49 +02003745 btrfs_print_leaf(leaf);
David Sterbac71dd882019-03-20 14:51:10 +01003746 btrfs_crit(leaf->fs_info, "slot %d too large, nritems %d",
Jeff Mahoney0b246af2016-06-22 18:54:23 -04003747 slot, nritems);
Arnd Bergmann290342f2019-03-25 14:02:25 +01003748 BUG();
Chris Mason3326d1b2007-10-15 16:18:25 -04003749 }
Chris Mason6567e832007-04-16 09:22:45 -04003750
3751 /*
3752 * item0..itemN ... dataN.offset..dataN.size .. data0.size
3753 */
3754 /* first correct the data pointers */
David Sterbac82f8232019-08-09 17:48:21 +02003755 btrfs_init_map_token(&token, leaf);
Chris Mason6567e832007-04-16 09:22:45 -04003756 for (i = slot; i < nritems; i++) {
Chris Mason5f39d392007-10-15 16:14:19 -04003757 u32 ioff;
Ross Kirkdd3cc162013-09-16 15:58:09 +01003758 item = btrfs_item_nr(i);
Chris Masondb945352007-10-15 16:15:53 -04003759
David Sterbacc4c13d2020-04-29 02:15:56 +02003760 ioff = btrfs_token_item_offset(&token, item);
3761 btrfs_set_token_item_offset(&token, item, ioff - data_size);
Chris Mason6567e832007-04-16 09:22:45 -04003762 }
Chris Mason5f39d392007-10-15 16:14:19 -04003763
Chris Mason6567e832007-04-16 09:22:45 -04003764 /* shift the data */
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03003765 memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET +
3766 data_end - data_size, BTRFS_LEAF_DATA_OFFSET +
Chris Mason6567e832007-04-16 09:22:45 -04003767 data_end, old_data - data_end);
Chris Mason5f39d392007-10-15 16:14:19 -04003768
Chris Mason6567e832007-04-16 09:22:45 -04003769 data_end = old_data;
Chris Mason5f39d392007-10-15 16:14:19 -04003770 old_size = btrfs_item_size_nr(leaf, slot);
Ross Kirkdd3cc162013-09-16 15:58:09 +01003771 item = btrfs_item_nr(slot);
Chris Mason5f39d392007-10-15 16:14:19 -04003772 btrfs_set_item_size(leaf, item, old_size + data_size);
3773 btrfs_mark_buffer_dirty(leaf);
Chris Mason6567e832007-04-16 09:22:45 -04003774
David Sterbae902baa2019-03-20 14:36:46 +01003775 if (btrfs_leaf_free_space(leaf) < 0) {
David Sterbaa4f78752017-06-29 18:37:49 +02003776 btrfs_print_leaf(leaf);
Chris Mason6567e832007-04-16 09:22:45 -04003777 BUG();
Chris Mason5f39d392007-10-15 16:14:19 -04003778 }
Chris Mason6567e832007-04-16 09:22:45 -04003779}
3780
Nikolay Borisovda9ffb22020-09-01 17:40:00 +03003781/**
3782 * setup_items_for_insert - Helper called before inserting one or more items
3783 * to a leaf. Main purpose is to save stack depth by doing the bulk of the work
3784 * in a function that doesn't call btrfs_search_slot
3785 *
3786 * @root: root we are inserting items to
3787 * @path: points to the leaf/slot where we are going to insert new items
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003788 * @batch: information about the batch of items to insert
Chris Mason74123bd2007-02-02 11:05:29 -05003789 */
Tsutomu Itohafe5fea2013-04-16 05:18:22 +00003790void setup_items_for_insert(struct btrfs_root *root, struct btrfs_path *path,
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003791 const struct btrfs_item_batch *batch)
Chris Masonbe0e5c02007-01-26 15:51:26 -05003792{
Jeff Mahoney0b246af2016-06-22 18:54:23 -04003793 struct btrfs_fs_info *fs_info = root->fs_info;
Chris Mason5f39d392007-10-15 16:14:19 -04003794 struct btrfs_item *item;
Chris Mason9c583092008-01-29 15:15:18 -05003795 int i;
Chris Mason7518a232007-03-12 12:01:18 -04003796 u32 nritems;
Chris Masonbe0e5c02007-01-26 15:51:26 -05003797 unsigned int data_end;
Chris Masone2fa7222007-03-12 16:22:34 -04003798 struct btrfs_disk_key disk_key;
Chris Mason44871b12009-03-13 10:04:31 -04003799 struct extent_buffer *leaf;
3800 int slot;
Chris Masoncfed81a2012-03-03 07:40:03 -05003801 struct btrfs_map_token token;
Nikolay Borisovfc0d82e2020-09-01 17:39:59 +03003802 u32 total_size;
Nikolay Borisovfc0d82e2020-09-01 17:39:59 +03003803
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003804 /*
3805 * Before anything else, update keys in the parent and other ancestors
3806 * if needed, then release the write locks on them, so that other tasks
3807 * can use them while we modify the leaf.
3808 */
Filipe Manana24cdc842014-07-28 19:34:35 +01003809 if (path->slots[0] == 0) {
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003810 btrfs_cpu_key_to_disk(&disk_key, &batch->keys[0]);
Nikolay Borisovb167fa92018-06-20 15:48:47 +03003811 fixup_low_keys(path, &disk_key, 1);
Filipe Manana24cdc842014-07-28 19:34:35 +01003812 }
3813 btrfs_unlock_up_safe(path, 1);
3814
Chris Mason5f39d392007-10-15 16:14:19 -04003815 leaf = path->nodes[0];
Chris Mason44871b12009-03-13 10:04:31 -04003816 slot = path->slots[0];
Chris Mason74123bd2007-02-02 11:05:29 -05003817
Chris Mason5f39d392007-10-15 16:14:19 -04003818 nritems = btrfs_header_nritems(leaf);
David Sterba8f881e82019-03-20 11:33:10 +01003819 data_end = leaf_data_end(leaf);
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003820 total_size = batch->total_data_size + (batch->nr * sizeof(struct btrfs_item));
Chris Masoneb60cea2007-02-02 09:18:22 -05003821
David Sterbae902baa2019-03-20 14:36:46 +01003822 if (btrfs_leaf_free_space(leaf) < total_size) {
David Sterbaa4f78752017-06-29 18:37:49 +02003823 btrfs_print_leaf(leaf);
Jeff Mahoney0b246af2016-06-22 18:54:23 -04003824 btrfs_crit(fs_info, "not enough freespace need %u have %d",
David Sterbae902baa2019-03-20 14:36:46 +01003825 total_size, btrfs_leaf_free_space(leaf));
Chris Masonbe0e5c02007-01-26 15:51:26 -05003826 BUG();
Chris Masond4dbff92007-04-04 14:08:15 -04003827 }
Chris Mason5f39d392007-10-15 16:14:19 -04003828
David Sterbac82f8232019-08-09 17:48:21 +02003829 btrfs_init_map_token(&token, leaf);
Chris Masonbe0e5c02007-01-26 15:51:26 -05003830 if (slot != nritems) {
Chris Mason5f39d392007-10-15 16:14:19 -04003831 unsigned int old_data = btrfs_item_end_nr(leaf, slot);
Chris Masonbe0e5c02007-01-26 15:51:26 -05003832
Chris Mason5f39d392007-10-15 16:14:19 -04003833 if (old_data < data_end) {
David Sterbaa4f78752017-06-29 18:37:49 +02003834 btrfs_print_leaf(leaf);
Nikolay Borisov7269ddd2020-09-01 17:40:01 +03003835 btrfs_crit(fs_info,
3836 "item at slot %d with data offset %u beyond data end of leaf %u",
Jeff Mahoney5d163e02016-09-20 10:05:00 -04003837 slot, old_data, data_end);
Arnd Bergmann290342f2019-03-25 14:02:25 +01003838 BUG();
Chris Mason5f39d392007-10-15 16:14:19 -04003839 }
Chris Masonbe0e5c02007-01-26 15:51:26 -05003840 /*
3841 * item0..itemN ... dataN.offset..dataN.size .. data0.size
3842 */
3843 /* first correct the data pointers */
Chris Mason0783fcf2007-03-12 20:12:07 -04003844 for (i = slot; i < nritems; i++) {
Chris Mason5f39d392007-10-15 16:14:19 -04003845 u32 ioff;
Chris Masondb945352007-10-15 16:15:53 -04003846
Jeff Mahoney62e85572016-09-20 10:05:01 -04003847 item = btrfs_item_nr(i);
David Sterbacc4c13d2020-04-29 02:15:56 +02003848 ioff = btrfs_token_item_offset(&token, item);
3849 btrfs_set_token_item_offset(&token, item,
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003850 ioff - batch->total_data_size);
Chris Mason0783fcf2007-03-12 20:12:07 -04003851 }
Chris Masonbe0e5c02007-01-26 15:51:26 -05003852 /* shift the items */
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003853 memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + batch->nr),
Chris Mason5f39d392007-10-15 16:14:19 -04003854 btrfs_item_nr_offset(slot),
Chris Masond6025572007-03-30 14:27:56 -04003855 (nritems - slot) * sizeof(struct btrfs_item));
Chris Masonbe0e5c02007-01-26 15:51:26 -05003856
3857 /* shift the data */
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03003858 memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET +
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003859 data_end - batch->total_data_size,
3860 BTRFS_LEAF_DATA_OFFSET + data_end,
3861 old_data - data_end);
Chris Masonbe0e5c02007-01-26 15:51:26 -05003862 data_end = old_data;
3863 }
Chris Mason5f39d392007-10-15 16:14:19 -04003864
Chris Mason62e27492007-03-15 12:56:47 -04003865 /* setup the item for the new data */
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003866 for (i = 0; i < batch->nr; i++) {
3867 btrfs_cpu_key_to_disk(&disk_key, &batch->keys[i]);
Chris Mason9c583092008-01-29 15:15:18 -05003868 btrfs_set_item_key(leaf, &disk_key, slot + i);
Ross Kirkdd3cc162013-09-16 15:58:09 +01003869 item = btrfs_item_nr(slot + i);
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003870 data_end -= batch->data_sizes[i];
Nikolay Borisovfc0716c2020-09-01 17:39:57 +03003871 btrfs_set_token_item_offset(&token, item, data_end);
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003872 btrfs_set_token_item_size(&token, item, batch->data_sizes[i]);
Chris Mason9c583092008-01-29 15:15:18 -05003873 }
Chris Mason44871b12009-03-13 10:04:31 -04003874
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003875 btrfs_set_header_nritems(leaf, nritems + batch->nr);
Chris Masonb9473432009-03-13 11:00:37 -04003876 btrfs_mark_buffer_dirty(leaf);
Chris Masonaa5d6be2007-02-28 16:35:06 -05003877
David Sterbae902baa2019-03-20 14:36:46 +01003878 if (btrfs_leaf_free_space(leaf) < 0) {
David Sterbaa4f78752017-06-29 18:37:49 +02003879 btrfs_print_leaf(leaf);
Chris Masonbe0e5c02007-01-26 15:51:26 -05003880 BUG();
Chris Mason5f39d392007-10-15 16:14:19 -04003881 }
Chris Mason44871b12009-03-13 10:04:31 -04003882}
3883
3884/*
3885 * Given a key and some data, insert items into the tree.
3886 * This does all the path init required, making room in the tree if needed.
3887 */
3888int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
3889 struct btrfs_root *root,
3890 struct btrfs_path *path,
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003891 const struct btrfs_item_batch *batch)
Chris Mason44871b12009-03-13 10:04:31 -04003892{
Chris Mason44871b12009-03-13 10:04:31 -04003893 int ret = 0;
3894 int slot;
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003895 u32 total_size;
Chris Mason44871b12009-03-13 10:04:31 -04003896
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003897 total_size = batch->total_data_size + (batch->nr * sizeof(struct btrfs_item));
3898 ret = btrfs_search_slot(trans, root, &batch->keys[0], path, total_size, 1);
Chris Mason44871b12009-03-13 10:04:31 -04003899 if (ret == 0)
3900 return -EEXIST;
3901 if (ret < 0)
Jeff Mahoney143bede2012-03-01 14:56:26 +01003902 return ret;
Chris Mason44871b12009-03-13 10:04:31 -04003903
Chris Mason44871b12009-03-13 10:04:31 -04003904 slot = path->slots[0];
3905 BUG_ON(slot < 0);
3906
Filipe Mananab7ef5f32021-09-24 12:28:13 +01003907 setup_items_for_insert(root, path, batch);
Jeff Mahoney143bede2012-03-01 14:56:26 +01003908 return 0;
Chris Mason62e27492007-03-15 12:56:47 -04003909}
3910
3911/*
3912 * Given a key and some data, insert an item into the tree.
3913 * This does all the path init required, making room in the tree if needed.
3914 */
Omar Sandoval310712b2017-01-17 23:24:37 -08003915int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root *root,
3916 const struct btrfs_key *cpu_key, void *data,
3917 u32 data_size)
Chris Mason62e27492007-03-15 12:56:47 -04003918{
3919 int ret = 0;
Chris Mason2c90e5d2007-04-02 10:50:19 -04003920 struct btrfs_path *path;
Chris Mason5f39d392007-10-15 16:14:19 -04003921 struct extent_buffer *leaf;
3922 unsigned long ptr;
Chris Mason62e27492007-03-15 12:56:47 -04003923
Chris Mason2c90e5d2007-04-02 10:50:19 -04003924 path = btrfs_alloc_path();
Tsutomu Itohdb5b4932011-03-23 08:14:16 +00003925 if (!path)
3926 return -ENOMEM;
Chris Mason2c90e5d2007-04-02 10:50:19 -04003927 ret = btrfs_insert_empty_item(trans, root, path, cpu_key, data_size);
Chris Mason62e27492007-03-15 12:56:47 -04003928 if (!ret) {
Chris Mason5f39d392007-10-15 16:14:19 -04003929 leaf = path->nodes[0];
3930 ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
3931 write_extent_buffer(leaf, data, ptr, data_size);
3932 btrfs_mark_buffer_dirty(leaf);
Chris Mason62e27492007-03-15 12:56:47 -04003933 }
Chris Mason2c90e5d2007-04-02 10:50:19 -04003934 btrfs_free_path(path);
Chris Masonaa5d6be2007-02-28 16:35:06 -05003935 return ret;
Chris Masonbe0e5c02007-01-26 15:51:26 -05003936}
3937
Chris Mason74123bd2007-02-02 11:05:29 -05003938/*
Chris Mason5de08d72007-02-24 06:24:44 -05003939 * delete the pointer from a given node.
Chris Mason74123bd2007-02-02 11:05:29 -05003940 *
Chris Masond352ac62008-09-29 15:18:18 -04003941 * the tree should have been previously balanced so the deletion does not
3942 * empty a node.
Chris Mason74123bd2007-02-02 11:05:29 -05003943 */
Tsutomu Itohafe5fea2013-04-16 05:18:22 +00003944static void del_ptr(struct btrfs_root *root, struct btrfs_path *path,
3945 int level, int slot)
Chris Masonbe0e5c02007-01-26 15:51:26 -05003946{
Chris Mason5f39d392007-10-15 16:14:19 -04003947 struct extent_buffer *parent = path->nodes[level];
Chris Mason7518a232007-03-12 12:01:18 -04003948 u32 nritems;
Jan Schmidtf3ea38d2012-05-26 11:45:21 +02003949 int ret;
Chris Masonbe0e5c02007-01-26 15:51:26 -05003950
Chris Mason5f39d392007-10-15 16:14:19 -04003951 nritems = btrfs_header_nritems(parent);
Chris Masond3977122009-01-05 21:25:51 -05003952 if (slot != nritems - 1) {
David Sterbabf1d3422018-03-05 15:47:39 +01003953 if (level) {
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00003954 ret = btrfs_tree_mod_log_insert_move(parent, slot,
3955 slot + 1, nritems - slot - 1);
David Sterbabf1d3422018-03-05 15:47:39 +01003956 BUG_ON(ret < 0);
3957 }
Chris Mason5f39d392007-10-15 16:14:19 -04003958 memmove_extent_buffer(parent,
3959 btrfs_node_key_ptr_offset(slot),
3960 btrfs_node_key_ptr_offset(slot + 1),
Chris Masond6025572007-03-30 14:27:56 -04003961 sizeof(struct btrfs_key_ptr) *
3962 (nritems - slot - 1));
Chris Mason57ba86c2012-12-18 19:35:32 -05003963 } else if (level) {
Filipe Mananaf3a84cc2021-03-11 14:31:07 +00003964 ret = btrfs_tree_mod_log_insert_key(parent, slot,
3965 BTRFS_MOD_LOG_KEY_REMOVE, GFP_NOFS);
Chris Mason57ba86c2012-12-18 19:35:32 -05003966 BUG_ON(ret < 0);
Chris Masonbb803952007-03-01 12:04:21 -05003967 }
Jan Schmidtf3ea38d2012-05-26 11:45:21 +02003968
Chris Mason7518a232007-03-12 12:01:18 -04003969 nritems--;
Chris Mason5f39d392007-10-15 16:14:19 -04003970 btrfs_set_header_nritems(parent, nritems);
Chris Mason7518a232007-03-12 12:01:18 -04003971 if (nritems == 0 && parent == root->node) {
Chris Mason5f39d392007-10-15 16:14:19 -04003972 BUG_ON(btrfs_header_level(root->node) != 1);
Chris Masonbb803952007-03-01 12:04:21 -05003973 /* just turn the root into a leaf and break */
Chris Mason5f39d392007-10-15 16:14:19 -04003974 btrfs_set_header_level(root->node, 0);
Chris Masonbb803952007-03-01 12:04:21 -05003975 } else if (slot == 0) {
Chris Mason5f39d392007-10-15 16:14:19 -04003976 struct btrfs_disk_key disk_key;
3977
3978 btrfs_node_key(parent, &disk_key, 0);
Nikolay Borisovb167fa92018-06-20 15:48:47 +03003979 fixup_low_keys(path, &disk_key, level + 1);
Chris Masonbe0e5c02007-01-26 15:51:26 -05003980 }
Chris Masond6025572007-03-30 14:27:56 -04003981 btrfs_mark_buffer_dirty(parent);
Chris Masonbe0e5c02007-01-26 15:51:26 -05003982}
3983
Chris Mason74123bd2007-02-02 11:05:29 -05003984/*
Chris Mason323ac952008-10-01 19:05:46 -04003985 * a helper function to delete the leaf pointed to by path->slots[1] and
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003986 * path->nodes[1].
Chris Mason323ac952008-10-01 19:05:46 -04003987 *
3988 * This deletes the pointer in path->nodes[1] and frees the leaf
3989 * block extent. zero is returned if it all worked out, < 0 otherwise.
3990 *
3991 * The path must have already been setup for deleting the leaf, including
3992 * all the proper balancing. path->nodes[1] must be locked.
3993 */
Jeff Mahoney143bede2012-03-01 14:56:26 +01003994static noinline void btrfs_del_leaf(struct btrfs_trans_handle *trans,
3995 struct btrfs_root *root,
3996 struct btrfs_path *path,
3997 struct extent_buffer *leaf)
Chris Mason323ac952008-10-01 19:05:46 -04003998{
Yan Zheng5d4f98a2009-06-10 10:45:14 -04003999 WARN_ON(btrfs_header_generation(leaf) != trans->transid);
Tsutomu Itohafe5fea2013-04-16 05:18:22 +00004000 del_ptr(root, path, 1, path->slots[1]);
Chris Mason323ac952008-10-01 19:05:46 -04004001
Chris Mason4d081c42009-02-04 09:31:28 -05004002 /*
4003 * btrfs_free_extent is expensive, we want to make sure we
4004 * aren't holding any locks when we call it
4005 */
4006 btrfs_unlock_up_safe(path, 0);
4007
Yan, Zhengf0486c62010-05-16 10:46:25 -04004008 root_sub_used(root, leaf->len);
4009
David Sterba67439da2019-10-08 13:28:47 +02004010 atomic_inc(&leaf->refs);
Jan Schmidt5581a512012-05-16 17:04:52 +02004011 btrfs_free_tree_block(trans, root, leaf, 0, 1);
Josef Bacik3083ee22012-03-09 16:01:49 -05004012 free_extent_buffer_stale(leaf);
Chris Mason323ac952008-10-01 19:05:46 -04004013}
4014/*
Chris Mason74123bd2007-02-02 11:05:29 -05004015 * delete the item at the leaf level in path. If that empties
4016 * the leaf, remove it from the tree
4017 */
Chris Mason85e21ba2008-01-29 15:11:36 -05004018int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
4019 struct btrfs_path *path, int slot, int nr)
Chris Masonbe0e5c02007-01-26 15:51:26 -05004020{
Jeff Mahoney0b246af2016-06-22 18:54:23 -04004021 struct btrfs_fs_info *fs_info = root->fs_info;
Chris Mason5f39d392007-10-15 16:14:19 -04004022 struct extent_buffer *leaf;
4023 struct btrfs_item *item;
Alexandru Moisece0eac22015-08-23 16:01:42 +00004024 u32 last_off;
4025 u32 dsize = 0;
Chris Masonaa5d6be2007-02-28 16:35:06 -05004026 int ret = 0;
4027 int wret;
Chris Mason85e21ba2008-01-29 15:11:36 -05004028 int i;
Chris Mason7518a232007-03-12 12:01:18 -04004029 u32 nritems;
Chris Masonbe0e5c02007-01-26 15:51:26 -05004030
Chris Mason5f39d392007-10-15 16:14:19 -04004031 leaf = path->nodes[0];
Chris Mason85e21ba2008-01-29 15:11:36 -05004032 last_off = btrfs_item_offset_nr(leaf, slot + nr - 1);
4033
4034 for (i = 0; i < nr; i++)
4035 dsize += btrfs_item_size_nr(leaf, slot + i);
4036
Chris Mason5f39d392007-10-15 16:14:19 -04004037 nritems = btrfs_header_nritems(leaf);
Chris Masonbe0e5c02007-01-26 15:51:26 -05004038
Chris Mason85e21ba2008-01-29 15:11:36 -05004039 if (slot + nr != nritems) {
David Sterba8f881e82019-03-20 11:33:10 +01004040 int data_end = leaf_data_end(leaf);
David Sterbac82f8232019-08-09 17:48:21 +02004041 struct btrfs_map_token token;
Chris Mason5f39d392007-10-15 16:14:19 -04004042
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03004043 memmove_extent_buffer(leaf, BTRFS_LEAF_DATA_OFFSET +
Chris Masond6025572007-03-30 14:27:56 -04004044 data_end + dsize,
Nikolay Borisov3d9ec8c2017-05-29 09:43:43 +03004045 BTRFS_LEAF_DATA_OFFSET + data_end,
Chris Mason85e21ba2008-01-29 15:11:36 -05004046 last_off - data_end);
Chris Mason5f39d392007-10-15 16:14:19 -04004047
David Sterbac82f8232019-08-09 17:48:21 +02004048 btrfs_init_map_token(&token, leaf);
Chris Mason85e21ba2008-01-29 15:11:36 -05004049 for (i = slot + nr; i < nritems; i++) {
Chris Mason5f39d392007-10-15 16:14:19 -04004050 u32 ioff;
Chris Masondb945352007-10-15 16:15:53 -04004051
Ross Kirkdd3cc162013-09-16 15:58:09 +01004052 item = btrfs_item_nr(i);
David Sterbacc4c13d2020-04-29 02:15:56 +02004053 ioff = btrfs_token_item_offset(&token, item);
4054 btrfs_set_token_item_offset(&token, item, ioff + dsize);
Chris Mason0783fcf2007-03-12 20:12:07 -04004055 }
Chris Masondb945352007-10-15 16:15:53 -04004056
Chris Mason5f39d392007-10-15 16:14:19 -04004057 memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot),
Chris Mason85e21ba2008-01-29 15:11:36 -05004058 btrfs_item_nr_offset(slot + nr),
Chris Masond6025572007-03-30 14:27:56 -04004059 sizeof(struct btrfs_item) *
Chris Mason85e21ba2008-01-29 15:11:36 -05004060 (nritems - slot - nr));
Chris Masonbe0e5c02007-01-26 15:51:26 -05004061 }
Chris Mason85e21ba2008-01-29 15:11:36 -05004062 btrfs_set_header_nritems(leaf, nritems - nr);
4063 nritems -= nr;
Chris Mason5f39d392007-10-15 16:14:19 -04004064
Chris Mason74123bd2007-02-02 11:05:29 -05004065 /* delete the leaf if we've emptied it */
Chris Mason7518a232007-03-12 12:01:18 -04004066 if (nritems == 0) {
Chris Mason5f39d392007-10-15 16:14:19 -04004067 if (leaf == root->node) {
4068 btrfs_set_header_level(leaf, 0);
Chris Mason9a8dd152007-02-23 08:38:36 -05004069 } else {
David Sterba6a884d7d2019-03-20 14:30:02 +01004070 btrfs_clean_tree_block(leaf);
Jeff Mahoney143bede2012-03-01 14:56:26 +01004071 btrfs_del_leaf(trans, root, path, leaf);
Chris Mason9a8dd152007-02-23 08:38:36 -05004072 }
Chris Masonbe0e5c02007-01-26 15:51:26 -05004073 } else {
Chris Mason7518a232007-03-12 12:01:18 -04004074 int used = leaf_space_used(leaf, 0, nritems);
Chris Masonaa5d6be2007-02-28 16:35:06 -05004075 if (slot == 0) {
Chris Mason5f39d392007-10-15 16:14:19 -04004076 struct btrfs_disk_key disk_key;
4077
4078 btrfs_item_key(leaf, &disk_key, 0);
Nikolay Borisovb167fa92018-06-20 15:48:47 +03004079 fixup_low_keys(path, &disk_key, 1);
Chris Masonaa5d6be2007-02-28 16:35:06 -05004080 }
Chris Masonaa5d6be2007-02-28 16:35:06 -05004081
Chris Mason74123bd2007-02-02 11:05:29 -05004082 /* delete the leaf if it is mostly empty */
Jeff Mahoney0b246af2016-06-22 18:54:23 -04004083 if (used < BTRFS_LEAF_DATA_SIZE(fs_info) / 3) {
Chris Masonbe0e5c02007-01-26 15:51:26 -05004084 /* push_leaf_left fixes the path.
4085 * make sure the path still points to our leaf
4086 * for possible call to del_ptr below
4087 */
Chris Mason4920c9a2007-01-26 16:38:42 -05004088 slot = path->slots[1];
David Sterba67439da2019-10-08 13:28:47 +02004089 atomic_inc(&leaf->refs);
Chris Mason5f39d392007-10-15 16:14:19 -04004090
Chris Mason99d8f832010-07-07 10:51:48 -04004091 wret = push_leaf_left(trans, root, path, 1, 1,
4092 1, (u32)-1);
Chris Mason54aa1f42007-06-22 14:16:25 -04004093 if (wret < 0 && wret != -ENOSPC)
Chris Masonaa5d6be2007-02-28 16:35:06 -05004094 ret = wret;
Chris Mason5f39d392007-10-15 16:14:19 -04004095
4096 if (path->nodes[0] == leaf &&
4097 btrfs_header_nritems(leaf)) {
Chris Mason99d8f832010-07-07 10:51:48 -04004098 wret = push_leaf_right(trans, root, path, 1,
4099 1, 1, 0);
Chris Mason54aa1f42007-06-22 14:16:25 -04004100 if (wret < 0 && wret != -ENOSPC)
Chris Masonaa5d6be2007-02-28 16:35:06 -05004101 ret = wret;
4102 }
Chris Mason5f39d392007-10-15 16:14:19 -04004103
4104 if (btrfs_header_nritems(leaf) == 0) {
Chris Mason323ac952008-10-01 19:05:46 -04004105 path->slots[1] = slot;
Jeff Mahoney143bede2012-03-01 14:56:26 +01004106 btrfs_del_leaf(trans, root, path, leaf);
Chris Mason5f39d392007-10-15 16:14:19 -04004107 free_extent_buffer(leaf);
Jeff Mahoney143bede2012-03-01 14:56:26 +01004108 ret = 0;
Chris Mason5de08d72007-02-24 06:24:44 -05004109 } else {
Chris Mason925baed2008-06-25 16:01:30 -04004110 /* if we're still in the path, make sure
4111 * we're dirty. Otherwise, one of the
4112 * push_leaf functions must have already
4113 * dirtied this buffer
4114 */
4115 if (path->nodes[0] == leaf)
4116 btrfs_mark_buffer_dirty(leaf);
Chris Mason5f39d392007-10-15 16:14:19 -04004117 free_extent_buffer(leaf);
Chris Masonbe0e5c02007-01-26 15:51:26 -05004118 }
Chris Masond5719762007-03-23 10:01:08 -04004119 } else {
Chris Mason5f39d392007-10-15 16:14:19 -04004120 btrfs_mark_buffer_dirty(leaf);
Chris Masonbe0e5c02007-01-26 15:51:26 -05004121 }
4122 }
Chris Masonaa5d6be2007-02-28 16:35:06 -05004123 return ret;
Chris Masonbe0e5c02007-01-26 15:51:26 -05004124}
4125
Chris Mason97571fd2007-02-24 13:39:08 -05004126/*
Chris Mason925baed2008-06-25 16:01:30 -04004127 * search the tree again to find a leaf with lesser keys
Chris Mason7bb86312007-12-11 09:25:06 -05004128 * returns 0 if it found something or 1 if there are no lesser leaves.
4129 * returns < 0 on io errors.
Chris Masond352ac62008-09-29 15:18:18 -04004130 *
4131 * This may release the path, and so you may lose any locks held at the
4132 * time you call it.
Chris Mason7bb86312007-12-11 09:25:06 -05004133 */
Josef Bacik16e75492013-10-22 12:18:51 -04004134int btrfs_prev_leaf(struct btrfs_root *root, struct btrfs_path *path)
Chris Mason7bb86312007-12-11 09:25:06 -05004135{
Chris Mason925baed2008-06-25 16:01:30 -04004136 struct btrfs_key key;
4137 struct btrfs_disk_key found_key;
4138 int ret;
Chris Mason7bb86312007-12-11 09:25:06 -05004139
Chris Mason925baed2008-06-25 16:01:30 -04004140 btrfs_item_key_to_cpu(path->nodes[0], &key, 0);
Chris Mason7bb86312007-12-11 09:25:06 -05004141
Filipe David Borba Mananae8b0d7242013-10-15 00:12:27 +01004142 if (key.offset > 0) {
Chris Mason925baed2008-06-25 16:01:30 -04004143 key.offset--;
Filipe David Borba Mananae8b0d7242013-10-15 00:12:27 +01004144 } else if (key.type > 0) {
Chris Mason925baed2008-06-25 16:01:30 -04004145 key.type--;
Filipe David Borba Mananae8b0d7242013-10-15 00:12:27 +01004146 key.offset = (u64)-1;
4147 } else if (key.objectid > 0) {
Chris Mason925baed2008-06-25 16:01:30 -04004148 key.objectid--;
Filipe David Borba Mananae8b0d7242013-10-15 00:12:27 +01004149 key.type = (u8)-1;
4150 key.offset = (u64)-1;
4151 } else {
Chris Mason925baed2008-06-25 16:01:30 -04004152 return 1;
Filipe David Borba Mananae8b0d7242013-10-15 00:12:27 +01004153 }
Chris Mason7bb86312007-12-11 09:25:06 -05004154
David Sterbab3b4aa72011-04-21 01:20:15 +02004155 btrfs_release_path(path);
Chris Mason925baed2008-06-25 16:01:30 -04004156 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
4157 if (ret < 0)
4158 return ret;
4159 btrfs_item_key(path->nodes[0], &found_key, 0);
4160 ret = comp_keys(&found_key, &key);
Filipe Manana337c6f62014-06-09 13:22:13 +01004161 /*
4162 * We might have had an item with the previous key in the tree right
4163 * before we released our path. And after we released our path, that
4164 * item might have been pushed to the first slot (0) of the leaf we
4165 * were holding due to a tree balance. Alternatively, an item with the
4166 * previous key can exist as the only element of a leaf (big fat item).
4167 * Therefore account for these 2 cases, so that our callers (like
4168 * btrfs_previous_item) don't miss an existing item with a key matching
4169 * the previous key we computed above.
4170 */
4171 if (ret <= 0)
Chris Mason925baed2008-06-25 16:01:30 -04004172 return 0;
4173 return 1;
Chris Mason7bb86312007-12-11 09:25:06 -05004174}
4175
Chris Mason3f157a22008-06-25 16:01:31 -04004176/*
4177 * A helper function to walk down the tree starting at min_key, and looking
Eric Sandeende78b512013-01-31 18:21:12 +00004178 * for nodes or leaves that are have a minimum transaction id.
4179 * This is used by the btree defrag code, and tree logging
Chris Mason3f157a22008-06-25 16:01:31 -04004180 *
4181 * This does not cow, but it does stuff the starting key it finds back
4182 * into min_key, so you can call btrfs_search_slot with cow=1 on the
4183 * key and get a writable path.
4184 *
Chris Mason3f157a22008-06-25 16:01:31 -04004185 * This honors path->lowest_level to prevent descent past a given level
4186 * of the tree.
4187 *
Chris Masond352ac62008-09-29 15:18:18 -04004188 * min_trans indicates the oldest transaction that you are interested
4189 * in walking through. Any nodes or leaves older than min_trans are
4190 * skipped over (without reading them).
4191 *
Chris Mason3f157a22008-06-25 16:01:31 -04004192 * returns zero if something useful was found, < 0 on error and 1 if there
4193 * was nothing in the tree that matched the search criteria.
4194 */
4195int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key,
Eric Sandeende78b512013-01-31 18:21:12 +00004196 struct btrfs_path *path,
Chris Mason3f157a22008-06-25 16:01:31 -04004197 u64 min_trans)
4198{
4199 struct extent_buffer *cur;
4200 struct btrfs_key found_key;
4201 int slot;
Yan96524802008-07-24 12:19:49 -04004202 int sret;
Chris Mason3f157a22008-06-25 16:01:31 -04004203 u32 nritems;
4204 int level;
4205 int ret = 1;
Filipe Mananaf98de9b2014-08-04 19:37:21 +01004206 int keep_locks = path->keep_locks;
Chris Mason3f157a22008-06-25 16:01:31 -04004207
Filipe Mananaf98de9b2014-08-04 19:37:21 +01004208 path->keep_locks = 1;
Chris Mason3f157a22008-06-25 16:01:31 -04004209again:
Chris Masonbd681512011-07-16 15:23:14 -04004210 cur = btrfs_read_lock_root_node(root);
Chris Mason3f157a22008-06-25 16:01:31 -04004211 level = btrfs_header_level(cur);
Chris Masone02119d2008-09-05 16:13:11 -04004212 WARN_ON(path->nodes[level]);
Chris Mason3f157a22008-06-25 16:01:31 -04004213 path->nodes[level] = cur;
Chris Masonbd681512011-07-16 15:23:14 -04004214 path->locks[level] = BTRFS_READ_LOCK;
Chris Mason3f157a22008-06-25 16:01:31 -04004215
4216 if (btrfs_header_generation(cur) < min_trans) {
4217 ret = 1;
4218 goto out;
4219 }
Chris Masond3977122009-01-05 21:25:51 -05004220 while (1) {
Chris Mason3f157a22008-06-25 16:01:31 -04004221 nritems = btrfs_header_nritems(cur);
4222 level = btrfs_header_level(cur);
Qu Wenruoe3b83362020-04-17 15:08:21 +08004223 sret = btrfs_bin_search(cur, min_key, &slot);
Filipe Mananacbca7d52019-02-18 16:57:26 +00004224 if (sret < 0) {
4225 ret = sret;
4226 goto out;
4227 }
Chris Mason3f157a22008-06-25 16:01:31 -04004228
Chris Mason323ac952008-10-01 19:05:46 -04004229 /* at the lowest level, we're done, setup the path and exit */
4230 if (level == path->lowest_level) {
Chris Masone02119d2008-09-05 16:13:11 -04004231 if (slot >= nritems)
4232 goto find_next_key;
Chris Mason3f157a22008-06-25 16:01:31 -04004233 ret = 0;
4234 path->slots[level] = slot;
4235 btrfs_item_key_to_cpu(cur, &found_key, slot);
4236 goto out;
4237 }
Yan96524802008-07-24 12:19:49 -04004238 if (sret && slot > 0)
4239 slot--;
Chris Mason3f157a22008-06-25 16:01:31 -04004240 /*
Eric Sandeende78b512013-01-31 18:21:12 +00004241 * check this node pointer against the min_trans parameters.
Randy Dunlap260db432020-08-04 19:48:34 -07004242 * If it is too old, skip to the next one.
Chris Mason3f157a22008-06-25 16:01:31 -04004243 */
Chris Masond3977122009-01-05 21:25:51 -05004244 while (slot < nritems) {
Chris Mason3f157a22008-06-25 16:01:31 -04004245 u64 gen;
Chris Masone02119d2008-09-05 16:13:11 -04004246
Chris Mason3f157a22008-06-25 16:01:31 -04004247 gen = btrfs_node_ptr_generation(cur, slot);
4248 if (gen < min_trans) {
4249 slot++;
4250 continue;
4251 }
Eric Sandeende78b512013-01-31 18:21:12 +00004252 break;
Chris Mason3f157a22008-06-25 16:01:31 -04004253 }
Chris Masone02119d2008-09-05 16:13:11 -04004254find_next_key:
Chris Mason3f157a22008-06-25 16:01:31 -04004255 /*
4256 * we didn't find a candidate key in this node, walk forward
4257 * and find another one
4258 */
4259 if (slot >= nritems) {
Chris Masone02119d2008-09-05 16:13:11 -04004260 path->slots[level] = slot;
4261 sret = btrfs_find_next_key(root, path, min_key, level,
Eric Sandeende78b512013-01-31 18:21:12 +00004262 min_trans);
Chris Masone02119d2008-09-05 16:13:11 -04004263 if (sret == 0) {
David Sterbab3b4aa72011-04-21 01:20:15 +02004264 btrfs_release_path(path);
Chris Mason3f157a22008-06-25 16:01:31 -04004265 goto again;
4266 } else {
4267 goto out;
4268 }
4269 }
4270 /* save our key for returning back */
4271 btrfs_node_key_to_cpu(cur, &found_key, slot);
4272 path->slots[level] = slot;
4273 if (level == path->lowest_level) {
4274 ret = 0;
Chris Mason3f157a22008-06-25 16:01:31 -04004275 goto out;
4276 }
David Sterba4b231ae2019-08-21 19:16:27 +02004277 cur = btrfs_read_node_slot(cur, slot);
Liu Bofb770ae2016-07-05 12:10:14 -07004278 if (IS_ERR(cur)) {
4279 ret = PTR_ERR(cur);
4280 goto out;
4281 }
Chris Mason3f157a22008-06-25 16:01:31 -04004282
Chris Masonbd681512011-07-16 15:23:14 -04004283 btrfs_tree_read_lock(cur);
Chris Masonb4ce94d2009-02-04 09:25:08 -05004284
Chris Masonbd681512011-07-16 15:23:14 -04004285 path->locks[level - 1] = BTRFS_READ_LOCK;
Chris Mason3f157a22008-06-25 16:01:31 -04004286 path->nodes[level - 1] = cur;
Chris Masonf7c79f32012-03-19 15:54:38 -04004287 unlock_up(path, level, 1, 0, NULL);
Chris Mason3f157a22008-06-25 16:01:31 -04004288 }
4289out:
Filipe Mananaf98de9b2014-08-04 19:37:21 +01004290 path->keep_locks = keep_locks;
4291 if (ret == 0) {
4292 btrfs_unlock_up_safe(path, path->lowest_level + 1);
Chris Mason3f157a22008-06-25 16:01:31 -04004293 memcpy(min_key, &found_key, sizeof(found_key));
Filipe Mananaf98de9b2014-08-04 19:37:21 +01004294 }
Chris Mason3f157a22008-06-25 16:01:31 -04004295 return ret;
4296}
4297
4298/*
4299 * this is similar to btrfs_next_leaf, but does not try to preserve
4300 * and fixup the path. It looks for and returns the next key in the
Eric Sandeende78b512013-01-31 18:21:12 +00004301 * tree based on the current path and the min_trans parameters.
Chris Mason3f157a22008-06-25 16:01:31 -04004302 *
4303 * 0 is returned if another key is found, < 0 if there are any errors
4304 * and 1 is returned if there are no higher keys in the tree
4305 *
4306 * path->keep_locks should be set to 1 on the search made before
4307 * calling this function.
4308 */
Chris Masone7a84562008-06-25 16:01:31 -04004309int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path,
Eric Sandeende78b512013-01-31 18:21:12 +00004310 struct btrfs_key *key, int level, u64 min_trans)
Chris Masone7a84562008-06-25 16:01:31 -04004311{
Chris Masone7a84562008-06-25 16:01:31 -04004312 int slot;
4313 struct extent_buffer *c;
4314
Josef Bacik6a9fb462019-06-20 15:37:52 -04004315 WARN_ON(!path->keep_locks && !path->skip_locking);
Chris Masond3977122009-01-05 21:25:51 -05004316 while (level < BTRFS_MAX_LEVEL) {
Chris Masone7a84562008-06-25 16:01:31 -04004317 if (!path->nodes[level])
4318 return 1;
4319
4320 slot = path->slots[level] + 1;
4321 c = path->nodes[level];
Chris Mason3f157a22008-06-25 16:01:31 -04004322next:
Chris Masone7a84562008-06-25 16:01:31 -04004323 if (slot >= btrfs_header_nritems(c)) {
Yan Zheng33c66f42009-07-22 09:59:00 -04004324 int ret;
4325 int orig_lowest;
4326 struct btrfs_key cur_key;
4327 if (level + 1 >= BTRFS_MAX_LEVEL ||
4328 !path->nodes[level + 1])
Chris Masone7a84562008-06-25 16:01:31 -04004329 return 1;
Yan Zheng33c66f42009-07-22 09:59:00 -04004330
Josef Bacik6a9fb462019-06-20 15:37:52 -04004331 if (path->locks[level + 1] || path->skip_locking) {
Yan Zheng33c66f42009-07-22 09:59:00 -04004332 level++;
4333 continue;
4334 }
4335
4336 slot = btrfs_header_nritems(c) - 1;
4337 if (level == 0)
4338 btrfs_item_key_to_cpu(c, &cur_key, slot);
4339 else
4340 btrfs_node_key_to_cpu(c, &cur_key, slot);
4341
4342 orig_lowest = path->lowest_level;
David Sterbab3b4aa72011-04-21 01:20:15 +02004343 btrfs_release_path(path);
Yan Zheng33c66f42009-07-22 09:59:00 -04004344 path->lowest_level = level;
4345 ret = btrfs_search_slot(NULL, root, &cur_key, path,
4346 0, 0);
4347 path->lowest_level = orig_lowest;
4348 if (ret < 0)
4349 return ret;
4350
4351 c = path->nodes[level];
4352 slot = path->slots[level];
4353 if (ret == 0)
4354 slot++;
4355 goto next;
Chris Masone7a84562008-06-25 16:01:31 -04004356 }
Yan Zheng33c66f42009-07-22 09:59:00 -04004357
Chris Masone7a84562008-06-25 16:01:31 -04004358 if (level == 0)
4359 btrfs_item_key_to_cpu(c, key, slot);
Chris Mason3f157a22008-06-25 16:01:31 -04004360 else {
Chris Mason3f157a22008-06-25 16:01:31 -04004361 u64 gen = btrfs_node_ptr_generation(c, slot);
4362
Chris Mason3f157a22008-06-25 16:01:31 -04004363 if (gen < min_trans) {
4364 slot++;
4365 goto next;
4366 }
Chris Masone7a84562008-06-25 16:01:31 -04004367 btrfs_node_key_to_cpu(c, key, slot);
Chris Mason3f157a22008-06-25 16:01:31 -04004368 }
Chris Masone7a84562008-06-25 16:01:31 -04004369 return 0;
4370 }
4371 return 1;
4372}
4373
Jan Schmidt3d7806e2012-06-11 08:29:29 +02004374int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path,
4375 u64 time_seq)
4376{
Chris Masond97e63b2007-02-20 16:40:44 -05004377 int slot;
Chris Mason8e73f272009-04-03 10:14:18 -04004378 int level;
Chris Mason5f39d392007-10-15 16:14:19 -04004379 struct extent_buffer *c;
Chris Mason8e73f272009-04-03 10:14:18 -04004380 struct extent_buffer *next;
Chris Mason925baed2008-06-25 16:01:30 -04004381 struct btrfs_key key;
4382 u32 nritems;
4383 int ret;
Josef Bacik0e463182020-11-06 16:27:30 -05004384 int i;
Chris Mason925baed2008-06-25 16:01:30 -04004385
4386 nritems = btrfs_header_nritems(path->nodes[0]);
Chris Masond3977122009-01-05 21:25:51 -05004387 if (nritems == 0)
Chris Mason925baed2008-06-25 16:01:30 -04004388 return 1;
Chris Mason925baed2008-06-25 16:01:30 -04004389
Chris Mason8e73f272009-04-03 10:14:18 -04004390 btrfs_item_key_to_cpu(path->nodes[0], &key, nritems - 1);
4391again:
4392 level = 1;
4393 next = NULL;
David Sterbab3b4aa72011-04-21 01:20:15 +02004394 btrfs_release_path(path);
Chris Mason8e73f272009-04-03 10:14:18 -04004395
Chris Masona2135012008-06-25 16:01:30 -04004396 path->keep_locks = 1;
Chris Mason8e73f272009-04-03 10:14:18 -04004397
Jan Schmidt3d7806e2012-06-11 08:29:29 +02004398 if (time_seq)
4399 ret = btrfs_search_old_slot(root, &key, path, time_seq);
4400 else
4401 ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
Chris Mason925baed2008-06-25 16:01:30 -04004402 path->keep_locks = 0;
4403
4404 if (ret < 0)
4405 return ret;
4406
Chris Masona2135012008-06-25 16:01:30 -04004407 nritems = btrfs_header_nritems(path->nodes[0]);
Chris Mason168fd7d2008-06-25 16:01:30 -04004408 /*
4409 * by releasing the path above we dropped all our locks. A balance
4410 * could have added more items next to the key that used to be
4411 * at the very end of the block. So, check again here and
4412 * advance the path if there are now more items available.
4413 */
Chris Masona2135012008-06-25 16:01:30 -04004414 if (nritems > 0 && path->slots[0] < nritems - 1) {
Yan Zhenge457afe2009-07-22 09:59:00 -04004415 if (ret == 0)
4416 path->slots[0]++;
Chris Mason8e73f272009-04-03 10:14:18 -04004417 ret = 0;
Chris Mason925baed2008-06-25 16:01:30 -04004418 goto done;
4419 }
Liu Bo0b43e042014-06-09 11:04:49 +08004420 /*
4421 * So the above check misses one case:
4422 * - after releasing the path above, someone has removed the item that
4423 * used to be at the very end of the block, and balance between leafs
4424 * gets another one with bigger key.offset to replace it.
4425 *
4426 * This one should be returned as well, or we can get leaf corruption
4427 * later(esp. in __btrfs_drop_extents()).
4428 *
4429 * And a bit more explanation about this check,
4430 * with ret > 0, the key isn't found, the path points to the slot
4431 * where it should be inserted, so the path->slots[0] item must be the
4432 * bigger one.
4433 */
4434 if (nritems > 0 && ret > 0 && path->slots[0] == nritems - 1) {
4435 ret = 0;
4436 goto done;
4437 }
Chris Masond97e63b2007-02-20 16:40:44 -05004438
Chris Masond3977122009-01-05 21:25:51 -05004439 while (level < BTRFS_MAX_LEVEL) {
Chris Mason8e73f272009-04-03 10:14:18 -04004440 if (!path->nodes[level]) {
4441 ret = 1;
4442 goto done;
4443 }
Chris Mason5f39d392007-10-15 16:14:19 -04004444
Chris Masond97e63b2007-02-20 16:40:44 -05004445 slot = path->slots[level] + 1;
4446 c = path->nodes[level];
Chris Mason5f39d392007-10-15 16:14:19 -04004447 if (slot >= btrfs_header_nritems(c)) {
Chris Masond97e63b2007-02-20 16:40:44 -05004448 level++;
Chris Mason8e73f272009-04-03 10:14:18 -04004449 if (level == BTRFS_MAX_LEVEL) {
4450 ret = 1;
4451 goto done;
4452 }
Chris Masond97e63b2007-02-20 16:40:44 -05004453 continue;
4454 }
Chris Mason5f39d392007-10-15 16:14:19 -04004455
Josef Bacik0e463182020-11-06 16:27:30 -05004456
4457 /*
4458 * Our current level is where we're going to start from, and to
4459 * make sure lockdep doesn't complain we need to drop our locks
4460 * and nodes from 0 to our current level.
4461 */
4462 for (i = 0; i < level; i++) {
4463 if (path->locks[level]) {
4464 btrfs_tree_read_unlock(path->nodes[i]);
4465 path->locks[i] = 0;
4466 }
4467 free_extent_buffer(path->nodes[i]);
4468 path->nodes[i] = NULL;
Chris Mason925baed2008-06-25 16:01:30 -04004469 }
Chris Mason5f39d392007-10-15 16:14:19 -04004470
Chris Mason8e73f272009-04-03 10:14:18 -04004471 next = c;
Liu Bod07b8522017-01-30 12:23:42 -08004472 ret = read_block_for_search(root, path, &next, level,
David Sterbacda79c52017-02-10 18:44:32 +01004473 slot, &key);
Chris Mason8e73f272009-04-03 10:14:18 -04004474 if (ret == -EAGAIN)
4475 goto again;
Chris Mason5f39d392007-10-15 16:14:19 -04004476
Chris Mason76a05b32009-05-14 13:24:30 -04004477 if (ret < 0) {
David Sterbab3b4aa72011-04-21 01:20:15 +02004478 btrfs_release_path(path);
Chris Mason76a05b32009-05-14 13:24:30 -04004479 goto done;
4480 }
4481
Chris Mason5cd57b22008-06-25 16:01:30 -04004482 if (!path->skip_locking) {
Chris Masonbd681512011-07-16 15:23:14 -04004483 ret = btrfs_try_tree_read_lock(next);
Jan Schmidtd42244a2012-06-22 14:51:15 +02004484 if (!ret && time_seq) {
4485 /*
4486 * If we don't get the lock, we may be racing
4487 * with push_leaf_left, holding that lock while
4488 * itself waiting for the leaf we've currently
4489 * locked. To solve this situation, we give up
4490 * on our lock and cycle.
4491 */
Jan Schmidtcf538832012-07-04 15:42:48 +02004492 free_extent_buffer(next);
Jan Schmidtd42244a2012-06-22 14:51:15 +02004493 btrfs_release_path(path);
4494 cond_resched();
4495 goto again;
4496 }
Josef Bacik0e463182020-11-06 16:27:30 -05004497 if (!ret)
4498 btrfs_tree_read_lock(next);
Chris Mason5cd57b22008-06-25 16:01:30 -04004499 }
Chris Masond97e63b2007-02-20 16:40:44 -05004500 break;
4501 }
4502 path->slots[level] = slot;
Chris Masond3977122009-01-05 21:25:51 -05004503 while (1) {
Chris Masond97e63b2007-02-20 16:40:44 -05004504 level--;
Chris Masond97e63b2007-02-20 16:40:44 -05004505 path->nodes[level] = next;
4506 path->slots[level] = 0;
Chris Masona74a4b92008-06-25 16:01:31 -04004507 if (!path->skip_locking)
Josef Bacikffeb03c2020-11-06 16:27:29 -05004508 path->locks[level] = BTRFS_READ_LOCK;
Chris Masond97e63b2007-02-20 16:40:44 -05004509 if (!level)
4510 break;
Chris Masonb4ce94d2009-02-04 09:25:08 -05004511
Liu Bod07b8522017-01-30 12:23:42 -08004512 ret = read_block_for_search(root, path, &next, level,
David Sterbacda79c52017-02-10 18:44:32 +01004513 0, &key);
Chris Mason8e73f272009-04-03 10:14:18 -04004514 if (ret == -EAGAIN)
4515 goto again;
4516
Chris Mason76a05b32009-05-14 13:24:30 -04004517 if (ret < 0) {
David Sterbab3b4aa72011-04-21 01:20:15 +02004518 btrfs_release_path(path);
Chris Mason76a05b32009-05-14 13:24:30 -04004519 goto done;
4520 }
4521
Josef Bacikffeb03c2020-11-06 16:27:29 -05004522 if (!path->skip_locking)
Josef Bacik0e463182020-11-06 16:27:30 -05004523 btrfs_tree_read_lock(next);
Chris Masond97e63b2007-02-20 16:40:44 -05004524 }
Chris Mason8e73f272009-04-03 10:14:18 -04004525 ret = 0;
Chris Mason925baed2008-06-25 16:01:30 -04004526done:
Chris Masonf7c79f32012-03-19 15:54:38 -04004527 unlock_up(path, 0, 1, 0, NULL);
Chris Mason8e73f272009-04-03 10:14:18 -04004528
4529 return ret;
Chris Masond97e63b2007-02-20 16:40:44 -05004530}
Chris Mason0b86a832008-03-24 15:01:56 -04004531
Chris Mason3f157a22008-06-25 16:01:31 -04004532/*
4533 * this uses btrfs_prev_leaf to walk backwards in the tree, and keeps
4534 * searching until it gets past min_objectid or finds an item of 'type'
4535 *
4536 * returns 0 if something is found, 1 if nothing was found and < 0 on error
4537 */
Chris Mason0b86a832008-03-24 15:01:56 -04004538int btrfs_previous_item(struct btrfs_root *root,
4539 struct btrfs_path *path, u64 min_objectid,
4540 int type)
4541{
4542 struct btrfs_key found_key;
4543 struct extent_buffer *leaf;
Chris Masone02119d2008-09-05 16:13:11 -04004544 u32 nritems;
Chris Mason0b86a832008-03-24 15:01:56 -04004545 int ret;
4546
Chris Masond3977122009-01-05 21:25:51 -05004547 while (1) {
Chris Mason0b86a832008-03-24 15:01:56 -04004548 if (path->slots[0] == 0) {
4549 ret = btrfs_prev_leaf(root, path);
4550 if (ret != 0)
4551 return ret;
4552 } else {
4553 path->slots[0]--;
4554 }
4555 leaf = path->nodes[0];
Chris Masone02119d2008-09-05 16:13:11 -04004556 nritems = btrfs_header_nritems(leaf);
4557 if (nritems == 0)
4558 return 1;
4559 if (path->slots[0] == nritems)
4560 path->slots[0]--;
4561
Chris Mason0b86a832008-03-24 15:01:56 -04004562 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
Chris Masone02119d2008-09-05 16:13:11 -04004563 if (found_key.objectid < min_objectid)
4564 break;
Yan Zheng0a4eefb2009-07-24 11:06:53 -04004565 if (found_key.type == type)
4566 return 0;
Chris Masone02119d2008-09-05 16:13:11 -04004567 if (found_key.objectid == min_objectid &&
4568 found_key.type < type)
4569 break;
Chris Mason0b86a832008-03-24 15:01:56 -04004570 }
4571 return 1;
4572}
Wang Shilongade2e0b2014-01-12 21:38:33 +08004573
4574/*
4575 * search in extent tree to find a previous Metadata/Data extent item with
4576 * min objecitd.
4577 *
4578 * returns 0 if something is found, 1 if nothing was found and < 0 on error
4579 */
4580int btrfs_previous_extent_item(struct btrfs_root *root,
4581 struct btrfs_path *path, u64 min_objectid)
4582{
4583 struct btrfs_key found_key;
4584 struct extent_buffer *leaf;
4585 u32 nritems;
4586 int ret;
4587
4588 while (1) {
4589 if (path->slots[0] == 0) {
Wang Shilongade2e0b2014-01-12 21:38:33 +08004590 ret = btrfs_prev_leaf(root, path);
4591 if (ret != 0)
4592 return ret;
4593 } else {
4594 path->slots[0]--;
4595 }
4596 leaf = path->nodes[0];
4597 nritems = btrfs_header_nritems(leaf);
4598 if (nritems == 0)
4599 return 1;
4600 if (path->slots[0] == nritems)
4601 path->slots[0]--;
4602
4603 btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0]);
4604 if (found_key.objectid < min_objectid)
4605 break;
4606 if (found_key.type == BTRFS_EXTENT_ITEM_KEY ||
4607 found_key.type == BTRFS_METADATA_ITEM_KEY)
4608 return 0;
4609 if (found_key.objectid == min_objectid &&
4610 found_key.type < BTRFS_EXTENT_ITEM_KEY)
4611 break;
4612 }
4613 return 1;
4614}