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