1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Copyright (C) 2008 Oracle. All rights reserved. |
4 | */ |
5 | |
6 | #ifndef BTRFS_TREE_LOG_H |
7 | #define BTRFS_TREE_LOG_H |
8 | |
9 | #include <linux/list.h> |
10 | #include <linux/fs.h> |
11 | #include "messages.h" |
12 | #include "ctree.h" |
13 | #include "transaction.h" |
14 | |
15 | struct inode; |
16 | struct dentry; |
17 | struct btrfs_ordered_extent; |
18 | struct btrfs_root; |
19 | struct btrfs_trans_handle; |
20 | |
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 | |
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)) |
31 | |
32 | struct btrfs_log_ctx { |
33 | int log_ret; |
34 | int log_transid; |
35 | bool log_new_dentries; |
36 | bool logging_new_name; |
37 | bool logging_new_delayed_dentries; |
38 | /* Indicate if the inode being logged was logged before. */ |
39 | bool logged_before; |
40 | struct inode *inode; |
41 | struct list_head list; |
42 | /* Only used for fast fsyncs. */ |
43 | struct list_head ordered_extents; |
44 | struct list_head conflict_inodes; |
45 | int num_conflict_inodes; |
46 | bool logging_conflict_inodes; |
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; |
56 | }; |
57 | |
58 | void btrfs_init_log_ctx(struct btrfs_log_ctx *ctx, struct inode *inode); |
59 | void btrfs_init_log_ctx_scratch_eb(struct btrfs_log_ctx *ctx); |
60 | void btrfs_release_log_ctx_extents(struct btrfs_log_ctx *ctx); |
61 | |
62 | static inline void btrfs_set_log_full_commit(struct btrfs_trans_handle *trans) |
63 | { |
64 | WRITE_ONCE(trans->fs_info->last_trans_log_full_commit, trans->transid); |
65 | } |
66 | |
67 | static inline int btrfs_need_log_full_commit(struct btrfs_trans_handle *trans) |
68 | { |
69 | return READ_ONCE(trans->fs_info->last_trans_log_full_commit) == |
70 | trans->transid; |
71 | } |
72 | |
73 | int btrfs_sync_log(struct btrfs_trans_handle *trans, |
74 | struct btrfs_root *root, struct btrfs_log_ctx *ctx); |
75 | int btrfs_free_log(struct btrfs_trans_handle *trans, struct btrfs_root *root); |
76 | int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans, |
77 | struct btrfs_fs_info *fs_info); |
78 | int btrfs_recover_log_trees(struct btrfs_root *tree_root); |
79 | int btrfs_log_dentry_safe(struct btrfs_trans_handle *trans, |
80 | struct dentry *dentry, |
81 | struct btrfs_log_ctx *ctx); |
82 | void btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans, |
83 | struct btrfs_root *root, |
84 | const struct fscrypt_str *name, |
85 | struct btrfs_inode *dir, u64 index); |
86 | void btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans, |
87 | struct btrfs_root *root, |
88 | const struct fscrypt_str *name, |
89 | struct btrfs_inode *inode, u64 dirid); |
90 | void btrfs_end_log_trans(struct btrfs_root *root); |
91 | void btrfs_pin_log_trans(struct btrfs_root *root); |
92 | void btrfs_record_unlink_dir(struct btrfs_trans_handle *trans, |
93 | struct btrfs_inode *dir, struct btrfs_inode *inode, |
94 | bool for_rename); |
95 | void btrfs_record_snapshot_destroy(struct btrfs_trans_handle *trans, |
96 | struct btrfs_inode *dir); |
97 | void btrfs_log_new_name(struct btrfs_trans_handle *trans, |
98 | struct dentry *old_dentry, struct btrfs_inode *old_dir, |
99 | u64 old_dir_index, struct dentry *parent); |
100 | |
101 | #endif |
102 | |