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 BTRFS_RBIO_REBUILD_MISSING, 18 }; 19 20 struct btrfs_raid_bio { 21 struct btrfs_io_context *bioc; 22 23 /* 24 * While we're doing RMW on a stripe we put it into a hash table so we 25 * can lock the stripe and merge more rbios into it. 26 */ 27 struct list_head hash_list; 28 29 /* LRU list for the stripe cache */ 30 struct list_head stripe_cache; 31 32 /* For scheduling work in the helper threads */ 33 struct work_struct work; 34 35 /* 36 * bio_list and bio_list_lock are used to add more bios into the stripe 37 * in hopes of avoiding the full RMW 38 */ 39 struct bio_list bio_list; 40 spinlock_t bio_list_lock; 41 42 /* 43 * Also protected by the bio_list_lock, the plug list is used by the 44 * plugging code to collect partial bios while plugged. The stripe 45 * locking code also uses it to hand off the stripe lock to the next 46 * pending IO. 47 */ 48 struct list_head plug_list; 49 50 /* Flags that tell us if it is safe to merge with this bio. */ 51 unsigned long flags; 52 53 /* 54 * Set if we're doing a parity rebuild for a read from higher up, which 55 * is handled differently from a parity rebuild as part of RMW. 56 */ 57 enum btrfs_rbio_ops operation; 58 59 /* How many pages there are for the full stripe including P/Q */ 60 u16 nr_pages; 61 62 /* How many sectors there are for the full stripe including P/Q */ 63 u16 nr_sectors; 64 65 /* Number of data stripes (no p/q) */ 66 u8 nr_data; 67 68 /* Numer of all stripes (including P/Q) */ 69 u8 real_stripes; 70 71 /* How many pages there are for each stripe */ 72 u8 stripe_npages; 73 74 /* How many sectors there are for each stripe */ 75 u8 stripe_nsectors; 76 77 /* First bad stripe, -1 means no corruption */ 78 s8 faila; 79 80 /* Second bad stripe (for RAID6 use) */ 81 s8 failb; 82 83 /* Stripe number that we're scrubbing */ 84 u8 scrubp; 85 86 /* 87 * Size of all the bios in the bio_list. This helps us decide if the 88 * rbio maps to a full stripe or not. 89 */ 90 int bio_list_bytes; 91 92 refcount_t refs; 93 94 atomic_t stripes_pending; 95 96 atomic_t error; 97 98 struct work_struct end_io_work; 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 /* 132 * For trace event usage only. Records useful debug info for each bio submitted 133 * by RAID56 to each physical device. 134 * 135 * No matter signed or not, (-1) is always the one indicating we can not grab 136 * the proper stripe number. 137 */ 138 struct raid56_bio_trace_info { 139 u64 devid; 140 141 /* The offset inside the stripe. (<= STRIPE_LEN) */ 142 u32 offset; 143 144 /* 145 * Stripe number. 146 * 0 is the first data stripe, and nr_data for P stripe, 147 * nr_data + 1 for Q stripe. 148 * >= real_stripes for 149 */ 150 u8 stripe_nr; 151 }; 152 153 static inline int nr_data_stripes(const struct map_lookup *map) 154 { 155 return map->num_stripes - btrfs_nr_parity_stripes(map->type); 156 } 157 158 #define RAID5_P_STRIPE ((u64)-2) 159 #define RAID6_Q_STRIPE ((u64)-1) 160 161 #define is_parity_stripe(x) (((x) == RAID5_P_STRIPE) || \ 162 ((x) == RAID6_Q_STRIPE)) 163 164 struct btrfs_device; 165 166 void raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc, 167 int mirror_num); 168 void raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc); 169 170 void raid56_add_scrub_pages(struct btrfs_raid_bio *rbio, struct page *page, 171 unsigned int pgoff, u64 logical); 172 173 struct btrfs_raid_bio *raid56_parity_alloc_scrub_rbio(struct bio *bio, 174 struct btrfs_io_context *bioc, 175 struct btrfs_device *scrub_dev, 176 unsigned long *dbitmap, int stripe_nsectors); 177 void raid56_parity_submit_scrub_rbio(struct btrfs_raid_bio *rbio); 178 179 struct btrfs_raid_bio * 180 raid56_alloc_missing_rbio(struct bio *bio, struct btrfs_io_context *bioc); 181 void raid56_submit_missing_rbio(struct btrfs_raid_bio *rbio); 182 183 int btrfs_alloc_stripe_hash_table(struct btrfs_fs_info *info); 184 void btrfs_free_stripe_hash_table(struct btrfs_fs_info *info); 185 186 #endif 187