Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/fs/btrfs/ctree.h
26285 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/*
3
* Copyright (C) 2007 Oracle. All rights reserved.
4
*/
5
6
#ifndef BTRFS_CTREE_H
7
#define BTRFS_CTREE_H
8
9
#include <linux/cleanup.h>
10
#include <linux/spinlock.h>
11
#include <linux/rbtree.h>
12
#include <linux/mutex.h>
13
#include <linux/wait.h>
14
#include <linux/list.h>
15
#include <linux/atomic.h>
16
#include <linux/xarray.h>
17
#include <linux/refcount.h>
18
#include <uapi/linux/btrfs_tree.h>
19
#include "locking.h"
20
#include "fs.h"
21
#include "accessors.h"
22
#include "extent-io-tree.h"
23
24
struct extent_buffer;
25
struct btrfs_block_rsv;
26
struct btrfs_trans_handle;
27
struct btrfs_block_group;
28
29
/* Read ahead values for struct btrfs_path.reada */
30
enum {
31
READA_NONE,
32
READA_BACK,
33
READA_FORWARD,
34
/*
35
* Similar to READA_FORWARD but unlike it:
36
*
37
* 1) It will trigger readahead even for leaves that are not close to
38
* each other on disk;
39
* 2) It also triggers readahead for nodes;
40
* 3) During a search, even when a node or leaf is already in memory, it
41
* will still trigger readahead for other nodes and leaves that follow
42
* it.
43
*
44
* This is meant to be used only when we know we are iterating over the
45
* entire tree or a very large part of it.
46
*/
47
READA_FORWARD_ALWAYS,
48
};
49
50
/*
51
* btrfs_paths remember the path taken from the root down to the leaf.
52
* level 0 is always the leaf, and nodes[1...BTRFS_MAX_LEVEL] will point
53
* to any other levels that are present.
54
*
55
* The slots array records the index of the item or block pointer
56
* used while walking the tree.
57
*/
58
struct btrfs_path {
59
struct extent_buffer *nodes[BTRFS_MAX_LEVEL];
60
int slots[BTRFS_MAX_LEVEL];
61
/* if there is real range locking, this locks field will change */
62
u8 locks[BTRFS_MAX_LEVEL];
63
u8 reada;
64
u8 lowest_level;
65
66
/*
67
* set by btrfs_split_item, tells search_slot to keep all locks
68
* and to force calls to keep space in the nodes
69
*/
70
unsigned int search_for_split:1;
71
/* Keep some upper locks as we walk down. */
72
unsigned int keep_locks:1;
73
unsigned int skip_locking:1;
74
unsigned int search_commit_root:1;
75
unsigned int need_commit_sem:1;
76
unsigned int skip_release_on_error:1;
77
/*
78
* Indicate that new item (btrfs_search_slot) is extending already
79
* existing item and ins_len contains only the data size and not item
80
* header (ie. sizeof(struct btrfs_item) is not included).
81
*/
82
unsigned int search_for_extension:1;
83
/* Stop search if any locks need to be taken (for read) */
84
unsigned int nowait:1;
85
};
86
87
#define BTRFS_PATH_AUTO_FREE(path_name) \
88
struct btrfs_path *path_name __free(btrfs_free_path) = NULL
89
90
/*
91
* The state of btrfs root
92
*/
93
enum {
94
/*
95
* btrfs_record_root_in_trans is a multi-step process, and it can race
96
* with the balancing code. But the race is very small, and only the
97
* first time the root is added to each transaction. So IN_TRANS_SETUP
98
* is used to tell us when more checks are required
99
*/
100
BTRFS_ROOT_IN_TRANS_SETUP,
101
102
/*
103
* Set if tree blocks of this root can be shared by other roots.
104
* Only subvolume trees and their reloc trees have this bit set.
105
* Conflicts with TRACK_DIRTY bit.
106
*
107
* This affects two things:
108
*
109
* - How balance works
110
* For shareable roots, we need to use reloc tree and do path
111
* replacement for balance, and need various pre/post hooks for
112
* snapshot creation to handle them.
113
*
114
* While for non-shareable trees, we just simply do a tree search
115
* with COW.
116
*
117
* - How dirty roots are tracked
118
* For shareable roots, btrfs_record_root_in_trans() is needed to
119
* track them, while non-subvolume roots have TRACK_DIRTY bit, they
120
* don't need to set this manually.
121
*/
122
BTRFS_ROOT_SHAREABLE,
123
BTRFS_ROOT_TRACK_DIRTY,
124
BTRFS_ROOT_IN_RADIX,
125
BTRFS_ROOT_ORPHAN_ITEM_INSERTED,
126
BTRFS_ROOT_DEFRAG_RUNNING,
127
BTRFS_ROOT_FORCE_COW,
128
BTRFS_ROOT_MULTI_LOG_TASKS,
129
BTRFS_ROOT_DIRTY,
130
BTRFS_ROOT_DELETING,
131
132
/*
133
* Reloc tree is orphan, only kept here for qgroup delayed subtree scan
134
*
135
* Set for the subvolume tree owning the reloc tree.
136
*/
137
BTRFS_ROOT_DEAD_RELOC_TREE,
138
/* Mark dead root stored on device whose cleanup needs to be resumed */
139
BTRFS_ROOT_DEAD_TREE,
140
/* The root has a log tree. Used for subvolume roots and the tree root. */
141
BTRFS_ROOT_HAS_LOG_TREE,
142
/* Qgroup flushing is in progress */
143
BTRFS_ROOT_QGROUP_FLUSHING,
144
/* We started the orphan cleanup for this root. */
145
BTRFS_ROOT_ORPHAN_CLEANUP,
146
/* This root has a drop operation that was started previously. */
147
BTRFS_ROOT_UNFINISHED_DROP,
148
/* This reloc root needs to have its buffers lockdep class reset. */
149
BTRFS_ROOT_RESET_LOCKDEP_CLASS,
150
};
151
152
/*
153
* Record swapped tree blocks of a subvolume tree for delayed subtree trace
154
* code. For detail check comment in fs/btrfs/qgroup.c.
155
*/
156
struct btrfs_qgroup_swapped_blocks {
157
spinlock_t lock;
158
/* RM_EMPTY_ROOT() of above blocks[] */
159
bool swapped;
160
struct rb_root blocks[BTRFS_MAX_LEVEL];
161
};
162
163
/*
164
* in ram representation of the tree. extent_root is used for all allocations
165
* and for the extent tree extent_root root.
166
*/
167
struct btrfs_root {
168
struct rb_node rb_node;
169
170
struct extent_buffer *node;
171
172
struct extent_buffer *commit_root;
173
struct btrfs_root *log_root;
174
struct btrfs_root *reloc_root;
175
176
unsigned long state;
177
struct btrfs_root_item root_item;
178
struct btrfs_key root_key;
179
struct btrfs_fs_info *fs_info;
180
struct extent_io_tree dirty_log_pages;
181
182
struct mutex objectid_mutex;
183
184
spinlock_t accounting_lock;
185
struct btrfs_block_rsv *block_rsv;
186
187
struct mutex log_mutex;
188
wait_queue_head_t log_writer_wait;
189
wait_queue_head_t log_commit_wait[2];
190
struct list_head log_ctxs[2];
191
/* Used only for log trees of subvolumes, not for the log root tree */
192
atomic_t log_writers;
193
atomic_t log_commit[2];
194
/* Used only for log trees of subvolumes, not for the log root tree */
195
atomic_t log_batch;
196
/*
197
* Protected by the 'log_mutex' lock but can be read without holding
198
* that lock to avoid unnecessary lock contention, in which case it
199
* should be read using btrfs_get_root_log_transid() except if it's a
200
* log tree in which case it can be directly accessed. Updates to this
201
* field should always use btrfs_set_root_log_transid(), except for log
202
* trees where the field can be updated directly.
203
*/
204
int log_transid;
205
/* No matter the commit succeeds or not*/
206
int log_transid_committed;
207
/*
208
* Just be updated when the commit succeeds. Use
209
* btrfs_get_root_last_log_commit() and btrfs_set_root_last_log_commit()
210
* to access this field.
211
*/
212
int last_log_commit;
213
pid_t log_start_pid;
214
215
u64 last_trans;
216
217
u64 free_objectid;
218
219
struct btrfs_key defrag_progress;
220
struct btrfs_key defrag_max;
221
222
/* The dirty list is only used by non-shareable roots */
223
struct list_head dirty_list;
224
225
struct list_head root_list;
226
227
/* Xarray that keeps track of in-memory inodes. */
228
struct xarray inodes;
229
230
/* Xarray that keeps track of delayed nodes of every inode. */
231
struct xarray delayed_nodes;
232
/*
233
* right now this just gets used so that a root has its own devid
234
* for stat. It may be used for more later
235
*/
236
dev_t anon_dev;
237
238
spinlock_t root_item_lock;
239
refcount_t refs;
240
241
struct mutex delalloc_mutex;
242
spinlock_t delalloc_lock;
243
/*
244
* all of the inodes that have delalloc bytes. It is possible for
245
* this list to be empty even when there is still dirty data=ordered
246
* extents waiting to finish IO.
247
*/
248
struct list_head delalloc_inodes;
249
struct list_head delalloc_root;
250
u64 nr_delalloc_inodes;
251
252
struct mutex ordered_extent_mutex;
253
/*
254
* this is used by the balancing code to wait for all the pending
255
* ordered extents
256
*/
257
spinlock_t ordered_extent_lock;
258
259
/*
260
* all of the data=ordered extents pending writeback
261
* these can span multiple transactions and basically include
262
* every dirty data page that isn't from nodatacow
263
*/
264
struct list_head ordered_extents;
265
struct list_head ordered_root;
266
u64 nr_ordered_extents;
267
268
/*
269
* Not empty if this subvolume root has gone through tree block swap
270
* (relocation)
271
*
272
* Will be used by reloc_control::dirty_subvol_roots.
273
*/
274
struct list_head reloc_dirty_list;
275
276
/*
277
* Number of currently running SEND ioctls to prevent
278
* manipulation with the read-only status via SUBVOL_SETFLAGS
279
*/
280
int send_in_progress;
281
/*
282
* Number of currently running deduplication operations that have a
283
* destination inode belonging to this root. Protected by the lock
284
* root_item_lock.
285
*/
286
int dedupe_in_progress;
287
/* For exclusion of snapshot creation and nocow writes */
288
struct btrfs_drew_lock snapshot_lock;
289
290
atomic_t snapshot_force_cow;
291
292
/* For qgroup metadata reserved space */
293
spinlock_t qgroup_meta_rsv_lock;
294
u64 qgroup_meta_rsv_pertrans;
295
u64 qgroup_meta_rsv_prealloc;
296
wait_queue_head_t qgroup_flush_wait;
297
298
/* Number of active swapfiles */
299
atomic_t nr_swapfiles;
300
301
/* Record pairs of swapped blocks for qgroup */
302
struct btrfs_qgroup_swapped_blocks swapped_blocks;
303
304
/* Used only by log trees, when logging csum items */
305
struct extent_io_tree log_csum_range;
306
307
/* Used in simple quotas, track root during relocation. */
308
u64 relocation_src_root;
309
310
#ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
311
u64 alloc_bytenr;
312
#endif
313
314
#ifdef CONFIG_BTRFS_DEBUG
315
struct list_head leak_list;
316
#endif
317
};
318
319
static inline bool btrfs_root_readonly(const struct btrfs_root *root)
320
{
321
/* Byte-swap the constant at compile time, root_item::flags is LE */
322
return (root->root_item.flags & cpu_to_le64(BTRFS_ROOT_SUBVOL_RDONLY)) != 0;
323
}
324
325
static inline bool btrfs_root_dead(const struct btrfs_root *root)
326
{
327
/* Byte-swap the constant at compile time, root_item::flags is LE */
328
return (root->root_item.flags & cpu_to_le64(BTRFS_ROOT_SUBVOL_DEAD)) != 0;
329
}
330
331
static inline u64 btrfs_root_id(const struct btrfs_root *root)
332
{
333
return root->root_key.objectid;
334
}
335
336
static inline int btrfs_get_root_log_transid(const struct btrfs_root *root)
337
{
338
return READ_ONCE(root->log_transid);
339
}
340
341
static inline void btrfs_set_root_log_transid(struct btrfs_root *root, int log_transid)
342
{
343
WRITE_ONCE(root->log_transid, log_transid);
344
}
345
346
static inline int btrfs_get_root_last_log_commit(const struct btrfs_root *root)
347
{
348
return READ_ONCE(root->last_log_commit);
349
}
350
351
static inline void btrfs_set_root_last_log_commit(struct btrfs_root *root, int commit_id)
352
{
353
WRITE_ONCE(root->last_log_commit, commit_id);
354
}
355
356
static inline u64 btrfs_get_root_last_trans(const struct btrfs_root *root)
357
{
358
return READ_ONCE(root->last_trans);
359
}
360
361
static inline void btrfs_set_root_last_trans(struct btrfs_root *root, u64 transid)
362
{
363
WRITE_ONCE(root->last_trans, transid);
364
}
365
366
/*
367
* Return the generation this root started with.
368
*
369
* Every normal root that is created with root->root_key.offset set to it's
370
* originating generation. If it is a snapshot it is the generation when the
371
* snapshot was created.
372
*
373
* However for TREE_RELOC roots root_key.offset is the objectid of the owning
374
* tree root. Thankfully we copy the root item of the owning tree root, which
375
* has it's last_snapshot set to what we would have root_key.offset set to, so
376
* return that if this is a TREE_RELOC root.
377
*/
378
static inline u64 btrfs_root_origin_generation(const struct btrfs_root *root)
379
{
380
if (btrfs_root_id(root) == BTRFS_TREE_RELOC_OBJECTID)
381
return btrfs_root_last_snapshot(&root->root_item);
382
return root->root_key.offset;
383
}
384
385
/*
386
* Structure that conveys information about an extent that is going to replace
387
* all the extents in a file range.
388
*/
389
struct btrfs_replace_extent_info {
390
u64 disk_offset;
391
u64 disk_len;
392
u64 data_offset;
393
u64 data_len;
394
u64 file_offset;
395
/* Pointer to a file extent item of type regular or prealloc. */
396
char *extent_buf;
397
/*
398
* Set to true when attempting to replace a file range with a new extent
399
* described by this structure, set to false when attempting to clone an
400
* existing extent into a file range.
401
*/
402
bool is_new_extent;
403
/* Indicate if we should update the inode's mtime and ctime. */
404
bool update_times;
405
/* Meaningful only if is_new_extent is true. */
406
int qgroup_reserved;
407
/*
408
* Meaningful only if is_new_extent is true.
409
* Used to track how many extent items we have already inserted in a
410
* subvolume tree that refer to the extent described by this structure,
411
* so that we know when to create a new delayed ref or update an existing
412
* one.
413
*/
414
int insertions;
415
};
416
417
/* Arguments for btrfs_drop_extents() */
418
struct btrfs_drop_extents_args {
419
/* Input parameters */
420
421
/*
422
* If NULL, btrfs_drop_extents() will allocate and free its own path.
423
* If 'replace_extent' is true, this must not be NULL. Also the path
424
* is always released except if 'replace_extent' is true and
425
* btrfs_drop_extents() sets 'extent_inserted' to true, in which case
426
* the path is kept locked.
427
*/
428
struct btrfs_path *path;
429
/* Start offset of the range to drop extents from */
430
u64 start;
431
/* End (exclusive, last byte + 1) of the range to drop extents from */
432
u64 end;
433
/* If true drop all the extent maps in the range */
434
bool drop_cache;
435
/*
436
* If true it means we want to insert a new extent after dropping all
437
* the extents in the range. If this is true, the 'extent_item_size'
438
* parameter must be set as well and the 'extent_inserted' field will
439
* be set to true by btrfs_drop_extents() if it could insert the new
440
* extent.
441
* Note: when this is set to true the path must not be NULL.
442
*/
443
bool replace_extent;
444
/*
445
* Used if 'replace_extent' is true. Size of the file extent item to
446
* insert after dropping all existing extents in the range
447
*/
448
u32 extent_item_size;
449
450
/* Output parameters */
451
452
/*
453
* Set to the minimum between the input parameter 'end' and the end
454
* (exclusive, last byte + 1) of the last dropped extent. This is always
455
* set even if btrfs_drop_extents() returns an error.
456
*/
457
u64 drop_end;
458
/*
459
* The number of allocated bytes found in the range. This can be smaller
460
* than the range's length when there are holes in the range.
461
*/
462
u64 bytes_found;
463
/*
464
* Only set if 'replace_extent' is true. Set to true if we were able
465
* to insert a replacement extent after dropping all extents in the
466
* range, otherwise set to false by btrfs_drop_extents().
467
* Also, if btrfs_drop_extents() has set this to true it means it
468
* returned with the path locked, otherwise if it has set this to
469
* false it has returned with the path released.
470
*/
471
bool extent_inserted;
472
};
473
474
struct btrfs_file_private {
475
void *filldir_buf;
476
u64 last_index;
477
struct extent_state *llseek_cached_state;
478
/* Task that allocated this structure. */
479
struct task_struct *owner_task;
480
};
481
482
static inline u32 BTRFS_LEAF_DATA_SIZE(const struct btrfs_fs_info *info)
483
{
484
return info->nodesize - sizeof(struct btrfs_header);
485
}
486
487
static inline u32 BTRFS_MAX_ITEM_SIZE(const struct btrfs_fs_info *info)
488
{
489
return BTRFS_LEAF_DATA_SIZE(info) - sizeof(struct btrfs_item);
490
}
491
492
static inline u32 BTRFS_NODEPTRS_PER_BLOCK(const struct btrfs_fs_info *info)
493
{
494
return BTRFS_LEAF_DATA_SIZE(info) / sizeof(struct btrfs_key_ptr);
495
}
496
497
static inline u32 BTRFS_MAX_XATTR_SIZE(const struct btrfs_fs_info *info)
498
{
499
return BTRFS_MAX_ITEM_SIZE(info) - sizeof(struct btrfs_dir_item);
500
}
501
502
int __init btrfs_ctree_init(void);
503
void __cold btrfs_ctree_exit(void);
504
505
int btrfs_bin_search(const struct extent_buffer *eb, int first_slot,
506
const struct btrfs_key *key, int *slot);
507
508
int __pure btrfs_comp_cpu_keys(const struct btrfs_key *k1, const struct btrfs_key *k2);
509
510
#ifdef __LITTLE_ENDIAN
511
512
/*
513
* Compare two keys, on little-endian the disk order is same as CPU order and
514
* we can avoid the conversion.
515
*/
516
static inline int btrfs_comp_keys(const struct btrfs_disk_key *disk_key,
517
const struct btrfs_key *k2)
518
{
519
const struct btrfs_key *k1 = (const struct btrfs_key *)disk_key;
520
521
return btrfs_comp_cpu_keys(k1, k2);
522
}
523
524
#else
525
526
/* Compare two keys in a memcmp fashion. */
527
static inline int btrfs_comp_keys(const struct btrfs_disk_key *disk,
528
const struct btrfs_key *k2)
529
{
530
struct btrfs_key k1;
531
532
btrfs_disk_key_to_cpu(&k1, disk);
533
534
return btrfs_comp_cpu_keys(&k1, k2);
535
}
536
537
#endif
538
539
int btrfs_previous_item(struct btrfs_root *root,
540
struct btrfs_path *path, u64 min_objectid,
541
int type);
542
int btrfs_previous_extent_item(struct btrfs_root *root,
543
struct btrfs_path *path, u64 min_objectid);
544
void btrfs_set_item_key_safe(struct btrfs_trans_handle *trans,
545
const struct btrfs_path *path,
546
const struct btrfs_key *new_key);
547
struct extent_buffer *btrfs_root_node(struct btrfs_root *root);
548
int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path,
549
struct btrfs_key *key, int lowest_level,
550
u64 min_trans);
551
int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key,
552
struct btrfs_path *path,
553
u64 min_trans);
554
struct extent_buffer *btrfs_read_node_slot(struct extent_buffer *parent,
555
int slot);
556
557
int btrfs_cow_block(struct btrfs_trans_handle *trans,
558
struct btrfs_root *root, struct extent_buffer *buf,
559
struct extent_buffer *parent, int parent_slot,
560
struct extent_buffer **cow_ret,
561
enum btrfs_lock_nesting nest);
562
int btrfs_force_cow_block(struct btrfs_trans_handle *trans,
563
struct btrfs_root *root,
564
struct extent_buffer *buf,
565
struct extent_buffer *parent, int parent_slot,
566
struct extent_buffer **cow_ret,
567
u64 search_start, u64 empty_size,
568
enum btrfs_lock_nesting nest);
569
int btrfs_copy_root(struct btrfs_trans_handle *trans,
570
struct btrfs_root *root,
571
struct extent_buffer *buf,
572
struct extent_buffer **cow_ret, u64 new_root_objectid);
573
bool btrfs_block_can_be_shared(const struct btrfs_trans_handle *trans,
574
const struct btrfs_root *root,
575
const struct extent_buffer *buf);
576
int btrfs_del_ptr(struct btrfs_trans_handle *trans, struct btrfs_root *root,
577
struct btrfs_path *path, int level, int slot);
578
void btrfs_extend_item(struct btrfs_trans_handle *trans,
579
const struct btrfs_path *path, u32 data_size);
580
void btrfs_truncate_item(struct btrfs_trans_handle *trans,
581
const struct btrfs_path *path, u32 new_size, int from_end);
582
int btrfs_split_item(struct btrfs_trans_handle *trans,
583
struct btrfs_root *root,
584
struct btrfs_path *path,
585
const struct btrfs_key *new_key,
586
unsigned long split_offset);
587
int btrfs_duplicate_item(struct btrfs_trans_handle *trans,
588
struct btrfs_root *root,
589
struct btrfs_path *path,
590
const struct btrfs_key *new_key);
591
int btrfs_find_item(struct btrfs_root *fs_root, struct btrfs_path *path,
592
u64 inum, u64 ioff, u8 key_type, struct btrfs_key *found_key);
593
int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root *root,
594
const struct btrfs_key *key, struct btrfs_path *p,
595
int ins_len, int cow);
596
int btrfs_search_old_slot(struct btrfs_root *root, const struct btrfs_key *key,
597
struct btrfs_path *p, u64 time_seq);
598
int btrfs_search_slot_for_read(struct btrfs_root *root,
599
const struct btrfs_key *key,
600
struct btrfs_path *p, int find_higher,
601
int return_any);
602
void btrfs_release_path(struct btrfs_path *p);
603
struct btrfs_path *btrfs_alloc_path(void);
604
void btrfs_free_path(struct btrfs_path *p);
605
DEFINE_FREE(btrfs_free_path, struct btrfs_path *, btrfs_free_path(_T))
606
607
int btrfs_del_items(struct btrfs_trans_handle *trans, struct btrfs_root *root,
608
struct btrfs_path *path, int slot, int nr);
609
static inline int btrfs_del_item(struct btrfs_trans_handle *trans,
610
struct btrfs_root *root,
611
struct btrfs_path *path)
612
{
613
return btrfs_del_items(trans, root, path, path->slots[0], 1);
614
}
615
616
/*
617
* Describes a batch of items to insert in a btree. This is used by
618
* btrfs_insert_empty_items().
619
*/
620
struct btrfs_item_batch {
621
/*
622
* Pointer to an array containing the keys of the items to insert (in
623
* sorted order).
624
*/
625
const struct btrfs_key *keys;
626
/* Pointer to an array containing the data size for each item to insert. */
627
const u32 *data_sizes;
628
/*
629
* The sum of data sizes for all items. The caller can compute this while
630
* setting up the data_sizes array, so it ends up being more efficient
631
* than having btrfs_insert_empty_items() or setup_item_for_insert()
632
* doing it, as it would avoid an extra loop over a potentially large
633
* array, and in the case of setup_item_for_insert(), we would be doing
634
* it while holding a write lock on a leaf and often on upper level nodes
635
* too, unnecessarily increasing the size of a critical section.
636
*/
637
u32 total_data_size;
638
/* Size of the keys and data_sizes arrays (number of items in the batch). */
639
int nr;
640
};
641
642
void btrfs_setup_item_for_insert(struct btrfs_trans_handle *trans,
643
struct btrfs_root *root,
644
struct btrfs_path *path,
645
const struct btrfs_key *key,
646
u32 data_size);
647
int btrfs_insert_item(struct btrfs_trans_handle *trans, struct btrfs_root *root,
648
const struct btrfs_key *key, void *data, u32 data_size);
649
int btrfs_insert_empty_items(struct btrfs_trans_handle *trans,
650
struct btrfs_root *root,
651
struct btrfs_path *path,
652
const struct btrfs_item_batch *batch);
653
654
static inline int btrfs_insert_empty_item(struct btrfs_trans_handle *trans,
655
struct btrfs_root *root,
656
struct btrfs_path *path,
657
const struct btrfs_key *key,
658
u32 data_size)
659
{
660
struct btrfs_item_batch batch;
661
662
batch.keys = key;
663
batch.data_sizes = &data_size;
664
batch.total_data_size = data_size;
665
batch.nr = 1;
666
667
return btrfs_insert_empty_items(trans, root, path, &batch);
668
}
669
670
int btrfs_next_old_leaf(struct btrfs_root *root, struct btrfs_path *path,
671
u64 time_seq);
672
673
int btrfs_search_backwards(struct btrfs_root *root, struct btrfs_key *key,
674
struct btrfs_path *path);
675
676
int btrfs_get_next_valid_item(struct btrfs_root *root, struct btrfs_key *key,
677
struct btrfs_path *path);
678
679
/*
680
* Search in @root for a given @key, and store the slot found in @found_key.
681
*
682
* @root: The root node of the tree.
683
* @key: The key we are looking for.
684
* @found_key: Will hold the found item.
685
* @path: Holds the current slot/leaf.
686
* @iter_ret: Contains the value returned from btrfs_search_slot or
687
* btrfs_get_next_valid_item, whichever was executed last.
688
*
689
* The @iter_ret is an output variable that will contain the return value of
690
* btrfs_search_slot, if it encountered an error, or the value returned from
691
* btrfs_get_next_valid_item otherwise. That return value can be 0, if a valid
692
* slot was found, 1 if there were no more leaves, and <0 if there was an error.
693
*
694
* It's recommended to use a separate variable for iter_ret and then use it to
695
* set the function return value so there's no confusion of the 0/1/errno
696
* values stemming from btrfs_search_slot.
697
*/
698
#define btrfs_for_each_slot(root, key, found_key, path, iter_ret) \
699
for (iter_ret = btrfs_search_slot(NULL, (root), (key), (path), 0, 0); \
700
(iter_ret) >= 0 && \
701
(iter_ret = btrfs_get_next_valid_item((root), (found_key), (path))) == 0; \
702
(path)->slots[0]++ \
703
)
704
705
int btrfs_next_old_item(struct btrfs_root *root, struct btrfs_path *path, u64 time_seq);
706
707
/*
708
* Search the tree again to find a leaf with greater keys.
709
*
710
* Returns 0 if it found something or 1 if there are no greater leaves.
711
* Returns < 0 on error.
712
*/
713
static inline int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
714
{
715
return btrfs_next_old_leaf(root, path, 0);
716
}
717
718
static inline int btrfs_next_item(struct btrfs_root *root, struct btrfs_path *p)
719
{
720
return btrfs_next_old_item(root, p, 0);
721
}
722
int btrfs_leaf_free_space(const struct extent_buffer *leaf);
723
724
static inline bool btrfs_is_fstree(u64 rootid)
725
{
726
if (rootid == BTRFS_FS_TREE_OBJECTID)
727
return true;
728
729
if ((s64)rootid < (s64)BTRFS_FIRST_FREE_OBJECTID)
730
return false;
731
732
if (btrfs_qgroup_level(rootid) != 0)
733
return false;
734
735
return true;
736
}
737
738
static inline bool btrfs_is_data_reloc_root(const struct btrfs_root *root)
739
{
740
return root->root_key.objectid == BTRFS_DATA_RELOC_TREE_OBJECTID;
741
}
742
743
#endif
744
745