brintos

brintos / linux-shallow public Read only

0
0
Text · 5.3 KiB · 0d7b4c2 Raw
211 lines · c
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_H8#define BTRFS_RAID56_H9 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 18struct page;19struct sector_ptr;20struct btrfs_fs_info;21 22enum btrfs_rbio_ops {23	BTRFS_RBIO_WRITE,24	BTRFS_RBIO_READ_REBUILD,25	BTRFS_RBIO_PARITY_SCRUB,26};27 28struct 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 we33	 * 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 stripe45	 * in hopes of avoiding the full RMW46	 */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 the52	 * plugging code to collect partial bios while plugged.  The stripe53	 * locking code also uses it to hand off the stripe lock to the next54	 * 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, which63	 * 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 the90	 * 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 enough108	 * to hold them both and setup their locations when the rbio is109	 * allocated.110	 */111 112	/*113	 * Pointers to pages that we allocated for reading/writing stripes114	 * 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 above123	 * 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[] or133	 * stripe_sectors[] array.134	 *135	 * The reason we don't use another bit in sector_ptr is, we have two136	 * 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 cover143	 * 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 submitted156 * by RAID56 to each physical device.157 *158 * No matter signed or not, (-1) is always the one indicating we can not grab159 * the proper stripe number.160 */161struct 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 for172	 */173	u8 stripe_nr;174};175 176static 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 181static 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 192struct btrfs_device;193 194void raid56_parity_recover(struct bio *bio, struct btrfs_io_context *bioc,195			   int mirror_num);196void raid56_parity_write(struct bio *bio, struct btrfs_io_context *bioc);197 198struct 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);202void raid56_parity_submit_scrub_rbio(struct btrfs_raid_bio *rbio);203 204void raid56_parity_cache_data_pages(struct btrfs_raid_bio *rbio,205				    struct page **data_pages, u64 data_logical);206 207int btrfs_alloc_stripe_hash_table(struct btrfs_fs_info *info);208void btrfs_free_stripe_hash_table(struct btrfs_fs_info *info);209 210#endif211