brintos

brintos / linux-shallow public Read only

0
0
Text · 5.0 KiB · 2e75e88 Raw
184 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _RAID10_H3#define _RAID10_H4 5/* Note: raid10_info.rdev can be set to NULL asynchronously by6 * raid10_remove_disk.7 * There are three safe ways to access raid10_info.rdev.8 * 1/ when holding mddev->reconfig_mutex9 * 2/ when resync/recovery/reshape is known to be happening - i.e. in code10 *    that is called as part of performing resync/recovery/reshape.11 * 3/ while holding rcu_read_lock(), use rcu_dereference to get the pointer12 *    and if it is non-NULL, increment rdev->nr_pending before dropping the13 *    RCU lock.14 * When .rdev is set to NULL, the nr_pending count checked again and if it has15 * been incremented, the pointer is put back in .rdev.16 */17 18struct raid10_info {19	struct md_rdev	*rdev, *replacement;20	sector_t	head_position;21	int		recovery_disabled;	/* matches22						 * mddev->recovery_disabled23						 * when we shouldn't try24						 * recovering this device.25						 */26};27 28struct r10conf {29	struct mddev		*mddev;30	struct raid10_info	*mirrors;31	struct raid10_info	*mirrors_new, *mirrors_old;32	spinlock_t		device_lock;33 34	/* geometry */35	struct geom {36		int		raid_disks;37		int		near_copies;  /* number of copies laid out38					       * raid0 style */39		int		far_copies;   /* number of copies laid out40					       * at large strides across drives41					       */42		int		far_offset;   /* far_copies are offset by 143					       * stripe instead of many44					       */45		sector_t	stride;	      /* distance between far copies.46					       * This is size / far_copies unless47					       * far_offset, in which case it is48					       * 1 stripe.49					       */50		int             far_set_size; /* The number of devices in a set,51					       * where a 'set' are devices that52					       * contain far/offset copies of53					       * each other.54					       */55		int		chunk_shift; /* shift from chunks to sectors */56		sector_t	chunk_mask;57	} prev, geo;58	int			copies;	      /* near_copies * far_copies.59					       * must be <= raid_disks60					       */61 62	sector_t		dev_sectors;  /* temp copy of63					       * mddev->dev_sectors */64	sector_t		reshape_progress;65	sector_t		reshape_safe;66	unsigned long		reshape_checkpoint;67	sector_t		offset_diff;68 69	struct list_head	retry_list;70	/* A separate list of r1bio which just need raid_end_bio_io called.71	 * This mustn't happen for writes which had any errors if the superblock72	 * needs to be written.73	 */74	struct list_head	bio_end_io_list;75 76	/* queue pending writes and submit them on unplug */77	struct bio_list		pending_bio_list;78 79	seqlock_t		resync_lock;80	atomic_t		nr_pending;81	int			nr_waiting;82	int			nr_queued;83	int			barrier;84	int			array_freeze_pending;85	sector_t		next_resync;86	int			fullsync;  /* set to 1 if a full sync is needed,87					    * (fresh device added).88					    * Cleared when a sync completes.89					    */90	int			have_replacement; /* There is at least one91						   * replacement device.92						   */93	wait_queue_head_t	wait_barrier;94 95	mempool_t		r10bio_pool;96	mempool_t		r10buf_pool;97	struct page		*tmppage;98	struct bio_set		bio_split;99 100	/* When taking over an array from a different personality, we store101	 * the new thread here until we fully activate the array.102	 */103	struct md_thread __rcu	*thread;104 105	/*106	 * Keep track of cluster resync window to send to other nodes.107	 */108	sector_t		cluster_sync_low;109	sector_t		cluster_sync_high;110};111 112/*113 * this is our 'private' RAID10 bio.114 *115 * it contains information about what kind of IO operations were started116 * for this RAID10 operation, and about their status:117 */118 119struct r10bio {120	atomic_t		remaining; /* 'have we finished' count,121					    * used from IRQ handlers122					    */123	sector_t		sector;	/* virtual sector number */124	int			sectors;125	unsigned long		state;126	struct mddev		*mddev;127	/*128	 * original bio going to /dev/mdx129	 */130	struct bio		*master_bio;131	/*132	 * if the IO is in READ direction, then this is where we read133	 */134	int			read_slot;135 136	struct list_head	retry_list;137	/*138	 * if the IO is in WRITE direction, then multiple bios are used,139	 * one for each copy.140	 * When resyncing we also use one for each copy.141	 * When reconstructing, we use 2 bios, one for read, one for write.142	 * We choose the number when they are allocated.143	 * We sometimes need an extra bio to write to the replacement.144	 */145	struct r10dev {146		struct bio	*bio;147		union {148			struct bio	*repl_bio; /* used for resync and149						    * writes */150			struct md_rdev	*rdev;	   /* used for reads151						    * (read_slot >= 0) */152		};153		sector_t	addr;154		int		devnum;155	} devs[];156};157 158/* bits for r10bio.state */159enum r10bio_state {160	R10BIO_Uptodate,161	R10BIO_IsSync,162	R10BIO_IsRecover,163	R10BIO_IsReshape,164	R10BIO_Degraded,165/* Set ReadError on bios that experience a read error166 * so that raid10d knows what to do with them.167 */168	R10BIO_ReadError,169/* If a write for this request means we can clear some170 * known-bad-block records, we set this flag.171 */172	R10BIO_MadeGood,173	R10BIO_WriteError,174/* During a reshape we might be performing IO on the175 * 'previous' part of the array, in which case this176 * flag is set177 */178	R10BIO_Previous,179/* failfast devices did receive failfast requests. */180	R10BIO_FailFast,181	R10BIO_Discard,182};183#endif184