Blame view

fs/btrfs/delayed-inode.h 4.24 KB
9888c3402   David Sterba   btrfs: replace GP...
1
  /* SPDX-License-Identifier: GPL-2.0 */
16cdcec73   Miao Xie   btrfs: implement ...
2
3
4
  /*
   * Copyright (C) 2011 Fujitsu.  All rights reserved.
   * Written by Miao Xie <miaox@cn.fujitsu.com>
16cdcec73   Miao Xie   btrfs: implement ...
5
   */
9888c3402   David Sterba   btrfs: replace GP...
6
7
  #ifndef BTRFS_DELAYED_INODE_H
  #define BTRFS_DELAYED_INODE_H
16cdcec73   Miao Xie   btrfs: implement ...
8
9
10
11
12
13
  
  #include <linux/rbtree.h>
  #include <linux/spinlock.h>
  #include <linux/mutex.h>
  #include <linux/list.h>
  #include <linux/wait.h>
60063497a   Arun Sharma   atomic: use <linu...
14
  #include <linux/atomic.h>
6de5f18e7   Elena Reshetova   btrfs: convert bt...
15
  #include <linux/refcount.h>
16cdcec73   Miao Xie   btrfs: implement ...
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  #include "ctree.h"
  
  /* types of the delayed item */
  #define BTRFS_DELAYED_INSERTION_ITEM	1
  #define BTRFS_DELAYED_DELETION_ITEM	2
  
  struct btrfs_delayed_root {
  	spinlock_t lock;
  	struct list_head node_list;
  	/*
  	 * Used for delayed nodes which is waiting to be dealt with by the
  	 * worker. If the delayed node is inserted into the work queue, we
  	 * drop it from this list.
  	 */
  	struct list_head prepare_list;
  	atomic_t items;		/* for delayed items */
de3cb945d   Chris Mason   Btrfs: improve th...
32
  	atomic_t items_seq;	/* for delayed items */
16cdcec73   Miao Xie   btrfs: implement ...
33
34
35
  	int nodes;		/* for delayed nodes */
  	wait_queue_head_t wait;
  };
7cf35d91b   Miao Xie   Btrfs: use flags ...
36
37
  #define BTRFS_DELAYED_NODE_IN_LIST	0
  #define BTRFS_DELAYED_NODE_INODE_DIRTY	1
67de11769   Miao Xie   Btrfs: introduce ...
38
  #define BTRFS_DELAYED_NODE_DEL_IREF	2
7cf35d91b   Miao Xie   Btrfs: use flags ...
39

16cdcec73   Miao Xie   btrfs: implement ...
40
41
42
43
44
45
46
47
48
49
50
  struct btrfs_delayed_node {
  	u64 inode_id;
  	u64 bytes_reserved;
  	struct btrfs_root *root;
  	/* Used to add the node into the delayed root's node list. */
  	struct list_head n_list;
  	/*
  	 * Used to add the node into the prepare list, the nodes in this list
  	 * is waiting to be dealt with by the async worker.
  	 */
  	struct list_head p_list;
03a1d4c89   Liu Bo   Btrfs: delayed-in...
51
52
  	struct rb_root_cached ins_root;
  	struct rb_root_cached del_root;
16cdcec73   Miao Xie   btrfs: implement ...
53
54
  	struct mutex mutex;
  	struct btrfs_inode_item inode_item;
6de5f18e7   Elena Reshetova   btrfs: convert bt...
55
  	refcount_t refs;
16cdcec73   Miao Xie   btrfs: implement ...
56
  	u64 index_cnt;
7cf35d91b   Miao Xie   Btrfs: use flags ...
57
  	unsigned long flags;
16cdcec73   Miao Xie   btrfs: implement ...
58
59
60
61
62
63
64
65
66
  	int count;
  };
  
  struct btrfs_delayed_item {
  	struct rb_node rb_node;
  	struct btrfs_key key;
  	struct list_head tree_list;	/* used for batch insert/delete items */
  	struct list_head readdir_list;	/* used for readdir items */
  	u64 bytes_reserved;
16cdcec73   Miao Xie   btrfs: implement ...
67
  	struct btrfs_delayed_node *delayed_node;
089e77e10   Elena Reshetova   btrfs: convert bt...
68
  	refcount_t refs;
16cdcec73   Miao Xie   btrfs: implement ...
69
70
  	int ins_or_del;
  	u32 data_len;
17b238acf   Gustavo A. R. Silva   btrfs: delayed-in...
71
  	char data[];
16cdcec73   Miao Xie   btrfs: implement ...
72
73
74
75
76
77
  };
  
  static inline void btrfs_init_delayed_root(
  				struct btrfs_delayed_root *delayed_root)
  {
  	atomic_set(&delayed_root->items, 0);
de3cb945d   Chris Mason   Btrfs: improve th...
78
  	atomic_set(&delayed_root->items_seq, 0);
16cdcec73   Miao Xie   btrfs: implement ...
79
80
81
82
83
84
85
86
  	delayed_root->nodes = 0;
  	spin_lock_init(&delayed_root->lock);
  	init_waitqueue_head(&delayed_root->wait);
  	INIT_LIST_HEAD(&delayed_root->node_list);
  	INIT_LIST_HEAD(&delayed_root->prepare_list);
  }
  
  int btrfs_insert_delayed_dir_index(struct btrfs_trans_handle *trans,
2ff7e61e0   Jeff Mahoney   btrfs: take an fs...
87
  				   const char *name, int name_len,
6f45d1856   Nikolay Borisov   btrfs: Make btrfs...
88
  				   struct btrfs_inode *dir,
16cdcec73   Miao Xie   btrfs: implement ...
89
90
91
92
  				   struct btrfs_disk_key *disk_key, u8 type,
  				   u64 index);
  
  int btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans,
e67bbbb9d   Nikolay Borisov   btrfs: Make btrfs...
93
  				   struct btrfs_inode *dir, u64 index);
16cdcec73   Miao Xie   btrfs: implement ...
94

f5cc7b80a   Nikolay Borisov   btrfs: Make btrfs...
95
  int btrfs_inode_delayed_dir_index_count(struct btrfs_inode *inode);
16cdcec73   Miao Xie   btrfs: implement ...
96

e5c304e65   Nikolay Borisov   btrfs: Don't pass...
97
98
  int btrfs_run_delayed_items(struct btrfs_trans_handle *trans);
  int btrfs_run_delayed_items_nr(struct btrfs_trans_handle *trans, int nr);
16cdcec73   Miao Xie   btrfs: implement ...
99

2ff7e61e0   Jeff Mahoney   btrfs: take an fs...
100
  void btrfs_balance_delayed_items(struct btrfs_fs_info *fs_info);
16cdcec73   Miao Xie   btrfs: implement ...
101
102
  
  int btrfs_commit_inode_delayed_items(struct btrfs_trans_handle *trans,
5f4b32e94   Nikolay Borisov   btrfs: Make btrfs...
103
  				     struct btrfs_inode *inode);
16cdcec73   Miao Xie   btrfs: implement ...
104
  /* Used for evicting the inode. */
f48d1cf59   Nikolay Borisov   btrfs: Make btrfs...
105
  void btrfs_remove_delayed_node(struct btrfs_inode *inode);
4ccb5c723   Nikolay Borisov   btrfs: Make btrfs...
106
  void btrfs_kill_delayed_inode_items(struct btrfs_inode *inode);
aa79021fd   Nikolay Borisov   btrfs: Make btrfs...
107
  int btrfs_commit_inode_delayed_inode(struct btrfs_inode *inode);
16cdcec73   Miao Xie   btrfs: implement ...
108
109
110
111
  
  
  int btrfs_delayed_update_inode(struct btrfs_trans_handle *trans,
  			       struct btrfs_root *root, struct inode *inode);
2f7e33d43   Miao Xie   btrfs: fix incons...
112
  int btrfs_fill_inode(struct inode *inode, u32 *rdev);
e07222c7d   Nikolay Borisov   btrfs: Make btrfs...
113
  int btrfs_delayed_delete_inode_ref(struct btrfs_inode *inode);
16cdcec73   Miao Xie   btrfs: implement ...
114
115
116
  
  /* Used for drop dead root */
  void btrfs_kill_all_delayed_nodes(struct btrfs_root *root);
67cde3448   Miao Xie   Btrfs: destroy th...
117
  /* Used for clean the transaction */
ccdf9b305   Jeff Mahoney   btrfs: root->fs_i...
118
  void btrfs_destroy_delayed_inodes(struct btrfs_fs_info *fs_info);
67cde3448   Miao Xie   Btrfs: destroy th...
119

16cdcec73   Miao Xie   btrfs: implement ...
120
  /* Used for readdir() */
02dbfc99b   Omar Sandoval   Btrfs: fix ->iter...
121
122
123
124
125
126
  bool btrfs_readdir_get_delayed_items(struct inode *inode,
  				     struct list_head *ins_list,
  				     struct list_head *del_list);
  void btrfs_readdir_put_delayed_items(struct inode *inode,
  				     struct list_head *ins_list,
  				     struct list_head *del_list);
16cdcec73   Miao Xie   btrfs: implement ...
127
128
  int btrfs_should_delete_dir_index(struct list_head *del_list,
  				  u64 index);
9cdda8d31   Al Viro   [readdir] convert...
129
  int btrfs_readdir_delayed_dir_index(struct dir_context *ctx,
d2fbb2b58   Jeff Mahoney   btrfs: increment ...
130
  				    struct list_head *ins_list);
16cdcec73   Miao Xie   btrfs: implement ...
131
132
133
  
  /* for init */
  int __init btrfs_delayed_inode_init(void);
e67c718b5   David Sterba   btrfs: add more _...
134
  void __cold btrfs_delayed_inode_exit(void);
e999376f0   Chris Mason   Btrfs: avoid dela...
135
136
  
  /* for debugging */
ccdf9b305   Jeff Mahoney   btrfs: root->fs_i...
137
  void btrfs_assert_delayed_root_empty(struct btrfs_fs_info *fs_info);
e999376f0   Chris Mason   Btrfs: avoid dela...
138

16cdcec73   Miao Xie   btrfs: implement ...
139
  #endif