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 btrfs_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 btrfs_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  
btrfs_set_log_full_commit(struct btrfs_trans_handle * trans)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  
btrfs_need_log_full_commit(struct btrfs_trans_handle * trans)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_record_new_subvolume(const struct btrfs_trans_handle *trans,
98  				struct btrfs_inode *dir);
99  void btrfs_log_new_name(struct btrfs_trans_handle *trans,
100  			struct dentry *old_dentry, struct btrfs_inode *old_dir,
101  			u64 old_dir_index, struct dentry *parent);
102  
103  #endif
104