~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/btrfs/raid56.h

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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(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(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 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php