Merge tag 'io_uring-6.16-20250630' of git://git.kernel.dk/linux
[linux-block.git] / fs / btrfs / tree-log.h
CommitLineData
9888c340 1/* SPDX-License-Identifier: GPL-2.0 */
e02119d5
CM
2/*
3 * Copyright (C) 2008 Oracle. All rights reserved.
e02119d5
CM
4 */
5
9888c340
DS
6#ifndef BTRFS_TREE_LOG_H
7#define BTRFS_TREE_LOG_H
e02119d5 8
602035d7
DS
9#include <linux/list.h>
10#include <linux/fs.h>
9b569ea0 11#include "messages.h"
995946dd
MX
12#include "ctree.h"
13#include "transaction.h"
14
602035d7
DS
15struct inode;
16struct dentry;
17struct btrfs_ordered_extent;
18struct btrfs_root;
19struct btrfs_trans_handle;
20
257c62e1
CM
21/* return value for btrfs_log_dentry_safe that means we don't need to log it at all */
22#define BTRFS_NO_LOG_SYNC 256
23
5cce1780
FM
24/*
25 * We can't use the tree log for whatever reason, force a transaction commit.
26 * We use a negative value because there are functions through the logging code
27 * that need to return an error (< 0 value), false (0) or true (1). Any negative
28 * value will do, as it will cause the log to be marked for a full sync.
29 */
30#define BTRFS_LOG_FORCE_COMMIT (-(MAX_ERRNO + 1))
f31f09f6 31
8b050d35
MX
32struct btrfs_log_ctx {
33 int log_ret;
d1433deb 34 int log_transid;
2f2ff0ee 35 bool log_new_dentries;
75b463d2 36 bool logging_new_name;
30b80f3c 37 bool logging_new_delayed_dentries;
0f8ce498
FM
38 /* Indicate if the inode being logged was logged before. */
39 bool logged_before;
4d0120a5 40 struct btrfs_inode *inode;
8b050d35 41 struct list_head list;
48778179
FM
42 /* Only used for fast fsyncs. */
43 struct list_head ordered_extents;
e09d94c9
FM
44 struct list_head conflict_inodes;
45 int num_conflict_inodes;
46 bool logging_conflict_inodes;
e383e158
FM
47 /*
48 * Used for fsyncs that need to copy items from the subvolume tree to
49 * the log tree (full sync flag set or copy everything flag set) to
50 * avoid allocating a temporary extent buffer while holding a lock on
51 * an extent buffer of the subvolume tree and under the log transaction.
52 * Also helps to avoid allocating and freeing a temporary extent buffer
53 * in case we need to process multiple leaves from the subvolume tree.
54 */
55 struct extent_buffer *scratch_eb;
8b050d35
MX
56};
57
4d0120a5 58void btrfs_init_log_ctx(struct btrfs_log_ctx *ctx, struct btrfs_inode *inode);
c207adc1
DS
59void btrfs_init_log_ctx_scratch_eb(struct btrfs_log_ctx *ctx);
60void btrfs_release_log_ctx_extents(struct btrfs_log_ctx *ctx);
8b050d35 61
90787766 62static inline void btrfs_set_log_full_commit(struct btrfs_trans_handle *trans)
995946dd 63{
90787766 64 WRITE_ONCE(trans->fs_info->last_trans_log_full_commit, trans->transid);
995946dd
MX
65}
66
4884b8e8 67static inline int btrfs_need_log_full_commit(struct btrfs_trans_handle *trans)
995946dd 68{
4884b8e8 69 return READ_ONCE(trans->fs_info->last_trans_log_full_commit) ==
995946dd
MX
70 trans->transid;
71}
72
e02119d5 73int btrfs_sync_log(struct btrfs_trans_handle *trans,
8b050d35 74 struct btrfs_root *root, struct btrfs_log_ctx *ctx);
e02119d5 75int btrfs_free_log(struct btrfs_trans_handle *trans, struct btrfs_root *root);
4a500fd1
YZ
76int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans,
77 struct btrfs_fs_info *fs_info);
e02119d5
CM
78int btrfs_recover_log_trees(struct btrfs_root *tree_root);
79int btrfs_log_dentry_safe(struct btrfs_trans_handle *trans,
e5b84f7a 80 struct dentry *dentry,
8b050d35 81 struct btrfs_log_ctx *ctx);
9a35fc95
JB
82void btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans,
83 struct btrfs_root *root,
6db75318 84 const struct fscrypt_str *name,
9a35fc95
JB
85 struct btrfs_inode *dir, u64 index);
86void btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans,
87 struct btrfs_root *root,
6db75318 88 const struct fscrypt_str *name,
9a35fc95 89 struct btrfs_inode *inode, u64 dirid);
143bede5 90void btrfs_end_log_trans(struct btrfs_root *root);
45128b08 91void btrfs_pin_log_trans(struct btrfs_root *root);
12fcfd22 92void btrfs_record_unlink_dir(struct btrfs_trans_handle *trans,
4176bdbf 93 struct btrfs_inode *dir, struct btrfs_inode *inode,
59fcf388 94 bool for_rename);
1ec9a1ae 95void btrfs_record_snapshot_destroy(struct btrfs_trans_handle *trans,
43663557 96 struct btrfs_inode *dir);
45c4102f
FM
97void btrfs_record_new_subvolume(const struct btrfs_trans_handle *trans,
98 struct btrfs_inode *dir);
75b463d2 99void btrfs_log_new_name(struct btrfs_trans_handle *trans,
d5f5bd54 100 struct dentry *old_dentry, struct btrfs_inode *old_dir,
88d2beec 101 u64 old_dir_index, struct dentry *parent);
9888c340 102
e02119d5 103#endif