1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2012 Fusion-io All rights reserved.
4 * Copyright (C) 2012 Intel Corp. All rights reserved.
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>
24 BTRFS_RBIO_READ_REBUILD
,
25 BTRFS_RBIO_PARITY_SCRUB
,
28 struct btrfs_raid_bio
{
29 struct btrfs_io_context
*bioc
;
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.
35 struct list_head hash_list
;
37 /* LRU list for the stripe cache */
38 struct list_head stripe_cache
;
40 /* For scheduling work in the helper threads */
41 struct work_struct work
;
44 * bio_list and bio_list_lock are used to add more bios into the stripe
45 * in hopes of avoiding the full RMW
47 struct bio_list bio_list
;
48 spinlock_t bio_list_lock
;
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
56 struct list_head plug_list
;
58 /* Flags that tell us if it is safe to merge with this bio. */
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.
65 enum btrfs_rbio_ops operation
;
67 /* How many pages there are for the full stripe including P/Q */
70 /* How many sectors there are for the full stripe including P/Q */
73 /* Number of data stripes (no p/q) */
76 /* Number of all stripes (including P/Q) */
79 /* How many pages there are for each stripe */
82 /* How many sectors there are for each stripe */
85 /* Stripe number that we're scrubbing */
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.
96 atomic_t stripes_pending
;
98 wait_queue_head_t io_wait
;
100 /* Bitmap to record which horizontal stripe has data */
101 unsigned long dbitmap
;
103 /* Allocated with stripe_nsectors-many bits for finish_*() calls */
104 unsigned long finish_pbitmap
;
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
113 * Pointers to pages that we allocated for reading/writing stripes
114 * directly from the disk (including P/Q).
116 struct page
**stripe_pages
;
118 /* Pointers to the sectors in the bio_list, for faster lookup */
119 struct sector_ptr
*bio_sectors
;
122 * For subpage support, we need to map each sector to above
125 struct sector_ptr
*stripe_sectors
;
127 /* Allocated with real_stripes-many pointers for finish_*() calls */
128 void **finish_pointers
;
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.
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.
139 unsigned long *error_bitmap
;
142 * Checksum buffer if the rbio is for data. The buffer should cover
143 * all data sectors (excluding P/Q sectors).
148 * Each bit represents if the corresponding sector has data csum found.
149 * Should only cover data sectors (excluding P/Q sectors).
151 unsigned long *csum_bitmap
;
155 * For trace event usage only. Records useful debug info for each bio submitted
156 * by RAID56 to each physical device.
158 * No matter signed or not, (-1) is always the one indicating we can not grab
159 * the proper stripe number.
161 struct raid56_bio_trace_info
{
164 /* The offset inside the stripe. (<= STRIPE_LEN) */
169 * 0 is the first data stripe, and nr_data for P stripe,
170 * nr_data + 1 for Q stripe.
171 * >= real_stripes for
176 static inline int nr_data_stripes(const struct btrfs_chunk_map
*map
)
178 return map
->num_stripes
- btrfs_nr_parity_stripes(map
->type
);
181 static inline int nr_bioc_data_stripes(const struct btrfs_io_context
*bioc
)
183 return bioc
->num_stripes
- btrfs_nr_parity_stripes(bioc
->map_type
);
186 #define RAID5_P_STRIPE ((u64)-2)
187 #define RAID6_Q_STRIPE ((u64)-1)
189 #define is_parity_stripe(x) (((x) == RAID5_P_STRIPE) || \
190 ((x) == RAID6_Q_STRIPE))
194 void raid56_parity_recover(struct bio
*bio
, struct btrfs_io_context
*bioc
,
196 void raid56_parity_write(struct bio
*bio
, struct btrfs_io_context
*bioc
);
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
);
204 void raid56_parity_cache_data_pages(struct btrfs_raid_bio
*rbio
,
205 struct page
**data_pages
, u64 data_logical
);
207 int btrfs_alloc_stripe_hash_table(struct btrfs_fs_info
*info
);
208 void btrfs_free_stripe_hash_table(struct btrfs_fs_info
*info
);