Line data Source code
1 : /* SPDX-License-Identifier: GPL-2.0 */
2 : /*
3 : * Copyright (C) 2007 Oracle. All rights reserved.
4 : */
5 :
6 : #ifndef BTRFS_ORDERED_DATA_H
7 : #define BTRFS_ORDERED_DATA_H
8 :
9 : /* one of these per inode */
10 : struct btrfs_ordered_inode_tree {
11 : spinlock_t lock;
12 : struct rb_root tree;
13 : struct rb_node *last;
14 : };
15 :
16 : struct btrfs_ordered_sum {
17 : /*
18 : * Logical start address and length for of the blocks covered by
19 : * the sums array.
20 : */
21 : u64 logical;
22 : u32 len;
23 :
24 : struct list_head list;
25 : /* last field is a variable length array of csums */
26 : u8 sums[];
27 : };
28 :
29 : /*
30 : * Bits for btrfs_ordered_extent::flags.
31 : *
32 : * BTRFS_ORDERED_IO_DONE is set when all of the blocks are written.
33 : * It is used to make sure metadata is inserted into the tree only once
34 : * per extent.
35 : *
36 : * BTRFS_ORDERED_COMPLETE is set when the extent is removed from the
37 : * rbtree, just before waking any waiters. It is used to indicate the
38 : * IO is done and any metadata is inserted into the tree.
39 : */
40 : enum {
41 : /*
42 : * Different types for ordered extents, one and only one of the 4 types
43 : * need to be set when creating ordered extent.
44 : *
45 : * REGULAR: For regular non-compressed COW write
46 : * NOCOW: For NOCOW write into existing non-hole extent
47 : * PREALLOC: For NOCOW write into preallocated extent
48 : * COMPRESSED: For compressed COW write
49 : */
50 : BTRFS_ORDERED_REGULAR,
51 : BTRFS_ORDERED_NOCOW,
52 : BTRFS_ORDERED_PREALLOC,
53 : BTRFS_ORDERED_COMPRESSED,
54 :
55 : /*
56 : * Extra bit for direct io, can only be set for
57 : * REGULAR/NOCOW/PREALLOC. No direct io for compressed extent.
58 : */
59 : BTRFS_ORDERED_DIRECT,
60 :
61 : /* Extra status bits for ordered extents */
62 :
63 : /* set when all the pages are written */
64 : BTRFS_ORDERED_IO_DONE,
65 : /* set when removed from the tree */
66 : BTRFS_ORDERED_COMPLETE,
67 : /* We had an io error when writing this out */
68 : BTRFS_ORDERED_IOERR,
69 : /* Set when we have to truncate an extent */
70 : BTRFS_ORDERED_TRUNCATED,
71 : /* Used during fsync to track already logged extents */
72 : BTRFS_ORDERED_LOGGED,
73 : /* We have already logged all the csums of the ordered extent */
74 : BTRFS_ORDERED_LOGGED_CSUM,
75 : /* We wait for this extent to complete in the current transaction */
76 : BTRFS_ORDERED_PENDING,
77 : /* BTRFS_IOC_ENCODED_WRITE */
78 : BTRFS_ORDERED_ENCODED,
79 : };
80 :
81 : /* BTRFS_ORDERED_* flags that specify the type of the extent. */
82 : #define BTRFS_ORDERED_TYPE_FLAGS ((1UL << BTRFS_ORDERED_REGULAR) | \
83 : (1UL << BTRFS_ORDERED_NOCOW) | \
84 : (1UL << BTRFS_ORDERED_PREALLOC) | \
85 : (1UL << BTRFS_ORDERED_COMPRESSED) | \
86 : (1UL << BTRFS_ORDERED_DIRECT) | \
87 : (1UL << BTRFS_ORDERED_ENCODED))
88 :
89 : struct btrfs_ordered_extent {
90 : /* logical offset in the file */
91 : u64 file_offset;
92 :
93 : /*
94 : * These fields directly correspond to the same fields in
95 : * btrfs_file_extent_item.
96 : */
97 : u64 num_bytes;
98 : u64 ram_bytes;
99 : u64 disk_bytenr;
100 : u64 disk_num_bytes;
101 : u64 offset;
102 :
103 : /* number of bytes that still need writing */
104 : u64 bytes_left;
105 :
106 : /*
107 : * the end of the ordered extent which is behind it but
108 : * didn't update disk_i_size. Please see the comment of
109 : * btrfs_ordered_update_i_size();
110 : */
111 : u64 outstanding_isize;
112 :
113 : /*
114 : * If we get truncated we need to adjust the file extent we enter for
115 : * this ordered extent so that we do not expose stale data.
116 : */
117 : u64 truncated_len;
118 :
119 : /* flags (described above) */
120 : unsigned long flags;
121 :
122 : /* compression algorithm */
123 : int compress_type;
124 :
125 : /* Qgroup reserved space */
126 : int qgroup_rsv;
127 :
128 : /* reference count */
129 : refcount_t refs;
130 :
131 : /* the inode we belong to */
132 : struct inode *inode;
133 :
134 : /* list of checksums for insertion when the extent io is done */
135 : struct list_head list;
136 :
137 : /* used for fast fsyncs */
138 : struct list_head log_list;
139 :
140 : /* used to wait for the BTRFS_ORDERED_COMPLETE bit */
141 : wait_queue_head_t wait;
142 :
143 : /* our friendly rbtree entry */
144 : struct rb_node rb_node;
145 :
146 : /* a per root list of all the pending ordered extents */
147 : struct list_head root_extent_list;
148 :
149 : struct btrfs_work work;
150 :
151 : struct completion completion;
152 : struct btrfs_work flush_work;
153 : struct list_head work_list;
154 : };
155 :
156 : static inline void
157 3879462 : btrfs_ordered_inode_tree_init(struct btrfs_ordered_inode_tree *t)
158 : {
159 3879462 : spin_lock_init(&t->lock);
160 3877407 : t->tree = RB_ROOT;
161 3877407 : t->last = NULL;
162 3877407 : }
163 :
164 : int btrfs_finish_one_ordered(struct btrfs_ordered_extent *ordered_extent);
165 : int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent);
166 :
167 : void btrfs_put_ordered_extent(struct btrfs_ordered_extent *entry);
168 : void btrfs_remove_ordered_extent(struct btrfs_inode *btrfs_inode,
169 : struct btrfs_ordered_extent *entry);
170 : bool btrfs_finish_ordered_extent(struct btrfs_ordered_extent *ordered,
171 : struct page *page, u64 file_offset, u64 len,
172 : bool uptodate);
173 : void btrfs_mark_ordered_io_finished(struct btrfs_inode *inode,
174 : struct page *page, u64 file_offset,
175 : u64 num_bytes, bool uptodate);
176 : bool btrfs_dec_test_ordered_pending(struct btrfs_inode *inode,
177 : struct btrfs_ordered_extent **cached,
178 : u64 file_offset, u64 io_size);
179 : struct btrfs_ordered_extent *btrfs_alloc_ordered_extent(
180 : struct btrfs_inode *inode, u64 file_offset,
181 : u64 num_bytes, u64 ram_bytes, u64 disk_bytenr,
182 : u64 disk_num_bytes, u64 offset, unsigned long flags,
183 : int compress_type);
184 : void btrfs_add_ordered_sum(struct btrfs_ordered_extent *entry,
185 : struct btrfs_ordered_sum *sum);
186 : struct btrfs_ordered_extent *btrfs_lookup_ordered_extent(struct btrfs_inode *inode,
187 : u64 file_offset);
188 : void btrfs_start_ordered_extent(struct btrfs_ordered_extent *entry);
189 : int btrfs_wait_ordered_range(struct inode *inode, u64 start, u64 len);
190 : struct btrfs_ordered_extent *
191 : btrfs_lookup_first_ordered_extent(struct btrfs_inode *inode, u64 file_offset);
192 : struct btrfs_ordered_extent *btrfs_lookup_first_ordered_range(
193 : struct btrfs_inode *inode, u64 file_offset, u64 len);
194 : struct btrfs_ordered_extent *btrfs_lookup_ordered_range(
195 : struct btrfs_inode *inode,
196 : u64 file_offset,
197 : u64 len);
198 : void btrfs_get_ordered_extents_for_logging(struct btrfs_inode *inode,
199 : struct list_head *list);
200 : u64 btrfs_wait_ordered_extents(struct btrfs_root *root, u64 nr,
201 : const u64 range_start, const u64 range_len);
202 : void btrfs_wait_ordered_roots(struct btrfs_fs_info *fs_info, u64 nr,
203 : const u64 range_start, const u64 range_len);
204 : void btrfs_lock_and_flush_ordered_range(struct btrfs_inode *inode, u64 start,
205 : u64 end,
206 : struct extent_state **cached_state);
207 : bool btrfs_try_lock_ordered_range(struct btrfs_inode *inode, u64 start, u64 end,
208 : struct extent_state **cached_state);
209 : struct btrfs_ordered_extent *btrfs_split_ordered_extent(
210 : struct btrfs_ordered_extent *ordered, u64 len);
211 : int __init ordered_data_init(void);
212 : void __cold ordered_data_exit(void);
213 :
214 : #endif
|