1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * Copyright (C) 2012 Fusion-io All rights reserved. |
4 | * Copyright (C) 2012 Intel Corp. All rights reserved. |
5 | */ |
6 | |
7 | #ifndef BTRFS_RAID56_H |
8 | #define BTRFS_RAID56_H |
9 | |
10 | #include <linux/types.h> |
11 | #include <linux/list.h> |
12 | #include <linux/spinlock.h> |
13 | #include <linux/bio.h> |
14 | #include <linux/refcount.h> |
15 | #include <linux/workqueue.h> |
16 | #include "volumes.h" |
17 | |
18 | struct page; |
19 | struct sector_ptr; |
20 | struct btrfs_fs_info; |
21 | |
22 | enum btrfs_rbio_ops { |
23 | BTRFS_RBIO_WRITE, |
24 | BTRFS_RBIO_READ_REBUILD, |
25 | BTRFS_RBIO_PARITY_SCRUB, |
26 | }; |
27 | |
28 | struct btrfs_raid_bio { |
29 | struct btrfs_io_context *bioc; |
30 | |
31 | /* |
32 | * While we're doing RMW on a stripe we put it into a hash table so we |
33 | * can lock the stripe and merge more rbios into it. |
34 | */ |
35 | struct list_head hash_list; |
36 | |
37 | /* LRU list for the stripe cache */ |
38 | struct list_head stripe_cache; |
39 | |
40 | /* For scheduling work in the helper threads */ |
41 | struct work_struct work; |
42 | |
43 | /* |
44 | * bio_list and bio_list_lock are used to add more bios into the stripe |
45 | * in hopes of avoiding the full RMW |
46 | */ |
47 | struct bio_list bio_list; |
48 | spinlock_t bio_list_lock; |
49 | |
50 | /* |
51 | * Also protected by the bio_list_lock, the plug list is used by the |
52 | * plugging code to collect partial bios while plugged. The stripe |
53 | * locking code also uses it to hand off the stripe lock to the next |
54 | * pending IO. |
55 | */ |
56 | struct list_head plug_list; |
57 | |
58 | /* Flags that tell us if it is safe to merge with this bio. */ |
59 | unsigned long flags; |
60 | |
61 | /* |
62 | * Set if we're doing a parity rebuild for a read from higher up, which |
63 | * is handled differently from a parity rebuild as part of RMW. |
64 | */ |
65 | enum btrfs_rbio_ops operation; |
66 | |
67 | /* How many pages there are for the full stripe including P/Q */ |
68 | u16 nr_pages; |
69 | |
70 | /* How many sectors there are for the full stripe including P/Q */ |
71 | u16 nr_sectors; |
72 | |
73 | /* Number of data stripes (no p/q) */ |
74 | u8 nr_data; |
75 | |
76 | /* Number of all stripes (including P/Q) */ |
77 | u8 real_stripes; |
78 | |
79 | /* How many pages there are for each stripe */ |
80 | u8 stripe_npages; |
81 | |
82 | /* How many sectors there are for each stripe */ |
83 | u8 stripe_nsectors; |
84 | |
85 | /* Stripe number that we're scrubbing */ |
86 | u8 scrubp; |
87 | |
88 | /* |
89 | * Size of all the bios in the bio_list. This helps us decide if the |
90 | * rbio maps to a full stripe or not. |
91 | */ |
92 | int bio_list_bytes; |
93 | |
94 | refcount_t refs; |
95 | |
96 | atomic_t stripes_pending; |
97 | |
98 | wait_queue_head_t io_wait; |
99 | |
100 | /* Bitmap to record which horizontal stripe has data */ |
101 | unsigned long dbitmap; |
102 | |
103 | /* Allocated with stripe_nsectors-many bits for finish_*() calls */ |
104 | unsigned long finish_pbitmap; |
105 | |
106 | /* |
107 | * These are two arrays of pointers. We allocate the rbio big enough |
108 | * to hold them both and setup their locations when the rbio is |
109 | * allocated. |
110 | */ |
111 | |
112 | /* |
113 | * Pointers to pages that we allocated for reading/writing stripes |
114 | * directly from the disk (including P/Q). |
115 | */ |
116 | struct page **stripe_pages; |
117 | |
118 | /* Pointers to the sectors in the bio_list, for faster lookup */ |
119 | struct sector_ptr *bio_sectors; |
120 | |
121 | /* |
122 | * For subpage support, we need to map each sector to above |
123 | * stripe_pages. |
124 | */ |
125 | struct sector_ptr *stripe_sectors; |
126 | |
127 | /* Allocated with real_stripes-many pointers for finish_*() calls */ |
128 | void **finish_pointers; |
129 | |
130 | /* |
131 | * The bitmap recording where IO errors happened. |
132 | * Each bit is corresponding to one sector in either bio_sectors[] or |
133 | * stripe_sectors[] array. |
134 | * |
135 | * The reason we don't use another bit in sector_ptr is, we have two |
136 | * arrays of sectors, and a lot of IO can use sectors in both arrays. |
137 | * Thus making it much harder to iterate. |
138 | */ |
139 | unsigned long *error_bitmap; |
140 | |
141 | /* |
142 | * Checksum buffer if the rbio is for data. The buffer should cover |
143 | * all data sectors (excluding P/Q sectors). |
144 | */ |
145 | u8 *csum_buf; |
146 | |
147 | /* |
148 | * Each bit represents if the corresponding sector has data csum found. |
149 | * Should only cover data sectors (excluding P/Q sectors). |
150 | */ |
151 | unsigned long *csum_bitmap; |
152 | }; |
153 | |
154 | /* |
155 | * For trace event usage only. Records useful debug info for each bio submitted |
156 | * by RAID56 to each physical device. |
157 | * |
158 | * No matter signed or not, (-1) is always the one indicating we can not grab |
159 | * the proper stripe number. |
160 | */ |
161 | struct raid56_bio_trace_info { |
162 | u64 devid; |
163 | |
164 | /* The offset inside the stripe. (<= STRIPE_LEN) */ |
165 | u32 offset; |
166 | |
167 | /* |
168 | * Stripe number. |
169 | * 0 is the first data stripe, and nr_data for P stripe, |
170 | * nr_data + 1 for Q stripe. |
171 | * >= real_stripes for |
172 | */ |
173 | u8 stripe_nr; |
174 | }; |
175 | |
176 | static inline int nr_data_stripes(const struct btrfs_chunk_map *map) |
177 | { |
178 | return map->num_stripes - btrfs_nr_parity_stripes(type: map->type); |
179 | } |
180 | |
181 | static inline int nr_bioc_data_stripes(const struct btrfs_io_context *bioc) |
182 | { |
183 | return bioc->num_stripes - btrfs_nr_parity_stripes(type: bioc->map_type); |
184 | } |
185 | |
186 | #define RAID5_P_STRIPE ((u64)-2) |
187 | #define RAID6_Q_STRIPE ((u64)-1) |
188 | |
189 | #define is_parity_stripe(x) (((x) == RAID5_P_STRIPE) || \ |
190 | ((x) == RAID6_Q_STRIPE)) |
191 | |
192 | struct btrfs_device; |
193 | |
194 | void raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc, |
195 | int mirror_num); |
196 | void raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc); |
197 | |
198 | struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio, |
199 | struct btrfs_io_context *bioc, |
200 | struct btrfs_device *scrub_dev, |
201 | unsigned long *dbitmap, int stripe_nsectors); |
202 | void raid56_parity_submit_scrub_rbio(struct btrfs_raid_bio *rbio); |
203 | |
204 | void raid56_parity_cache_data_pages(struct btrfs_raid_bio *rbio, |
205 | struct page **data_pages, u64 data_logical); |
206 | |
207 | int btrfs_alloc_stripe_hash_table(struct btrfs_fs_info *info); |
208 | void btrfs_free_stripe_hash_table(struct btrfs_fs_info *info); |
209 | |
210 | #endif |
211 | |