11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _RAID10_H 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _RAID10_H 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4dc280d987f039ef35ac1e59c09b7154b61f385cfJonathan Brassowstruct raid10_info { 569335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown struct md_rdev *rdev, *replacement; 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sector_t head_position; 72bb77736ae5dca0a189829fbb7379d43364a9dacNeilBrown int recovery_disabled; /* matches 82bb77736ae5dca0a189829fbb7379d43364a9dacNeilBrown * mddev->recovery_disabled 92bb77736ae5dca0a189829fbb7379d43364a9dacNeilBrown * when we shouldn't try 102bb77736ae5dca0a189829fbb7379d43364a9dacNeilBrown * recovering this device. 112bb77736ae5dca0a189829fbb7379d43364a9dacNeilBrown */ 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 14e879a8793f915aa7933364d962d2435bd71de462NeilBrownstruct r10conf { 15fd01b88c75a718020ff77e7f560d33835e9b58deNeilBrown struct mddev *mddev; 16dc280d987f039ef35ac1e59c09b7154b61f385cfJonathan Brassow struct raid10_info *mirrors; 17dc280d987f039ef35ac1e59c09b7154b61f385cfJonathan Brassow struct raid10_info *mirrors_new, *mirrors_old; 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spinlock_t device_lock; 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* geometry */ 215cf00fcd3c98d2eafb58ac7a649bbdb9dbc4902bNeilBrown struct geom { 225cf00fcd3c98d2eafb58ac7a649bbdb9dbc4902bNeilBrown int raid_disks; 235cf00fcd3c98d2eafb58ac7a649bbdb9dbc4902bNeilBrown int near_copies; /* number of copies laid out 2469335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown * raid0 style */ 255cf00fcd3c98d2eafb58ac7a649bbdb9dbc4902bNeilBrown int far_copies; /* number of copies laid out 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * at large strides across drives 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 285cf00fcd3c98d2eafb58ac7a649bbdb9dbc4902bNeilBrown int far_offset; /* far_copies are offset by 1 2969335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown * stripe instead of many 30c93983bf517c100a31e40ef087e19bd3d7aa2d28NeilBrown */ 315cf00fcd3c98d2eafb58ac7a649bbdb9dbc4902bNeilBrown sector_t stride; /* distance between far copies. 32c93983bf517c100a31e40ef087e19bd3d7aa2d28NeilBrown * This is size / far_copies unless 33c93983bf517c100a31e40ef087e19bd3d7aa2d28NeilBrown * far_offset, in which case it is 34c93983bf517c100a31e40ef087e19bd3d7aa2d28NeilBrown * 1 stripe. 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 36475901aff15841fb0a81e7546517407779a9b061Jonathan Brassow int far_set_size; /* The number of devices in a set, 37475901aff15841fb0a81e7546517407779a9b061Jonathan Brassow * where a 'set' are devices that 38475901aff15841fb0a81e7546517407779a9b061Jonathan Brassow * contain far/offset copies of 39475901aff15841fb0a81e7546517407779a9b061Jonathan Brassow * each other. 40475901aff15841fb0a81e7546517407779a9b061Jonathan Brassow */ 415cf00fcd3c98d2eafb58ac7a649bbdb9dbc4902bNeilBrown int chunk_shift; /* shift from chunks to sectors */ 425cf00fcd3c98d2eafb58ac7a649bbdb9dbc4902bNeilBrown sector_t chunk_mask; 43f8c9e74ff0832f2244d7991d2aea13851b20a622NeilBrown } prev, geo; 445cf00fcd3c98d2eafb58ac7a649bbdb9dbc4902bNeilBrown int copies; /* near_copies * far_copies. 455cf00fcd3c98d2eafb58ac7a649bbdb9dbc4902bNeilBrown * must be <= raid_disks 465cf00fcd3c98d2eafb58ac7a649bbdb9dbc4902bNeilBrown */ 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 4869335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown sector_t dev_sectors; /* temp copy of 4969335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown * mddev->dev_sectors */ 50f8c9e74ff0832f2244d7991d2aea13851b20a622NeilBrown sector_t reshape_progress; 513ea7daa5d7fde47cd41f4d56c2deb949114da9d6NeilBrown sector_t reshape_safe; 523ea7daa5d7fde47cd41f4d56c2deb949114da9d6NeilBrown unsigned long reshape_checkpoint; 533ea7daa5d7fde47cd41f4d56c2deb949114da9d6NeilBrown sector_t offset_diff; 54dab8b29248b3f14f456651a2a6ee9b8fd16d1b3cTrela, Maciej 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head retry_list; 566cce3b23f6f8e974c00af7a9b88f1d413ba368a8NeilBrown /* queue pending writes and submit them on unplug */ 576cce3b23f6f8e974c00af7a9b88f1d413ba368a8NeilBrown struct bio_list pending_bio_list; 5834db0cd60f8a1f4ab73d118a8be3797c20388223NeilBrown int pending_count; 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spinlock_t resync_lock; 6169335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown int nr_pending; 6269335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown int nr_waiting; 6369335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown int nr_queued; 6469335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown int barrier; 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sector_t next_resync; 666cce3b23f6f8e974c00af7a9b88f1d413ba368a8NeilBrown int fullsync; /* set to 1 if a full sync is needed, 676cce3b23f6f8e974c00af7a9b88f1d413ba368a8NeilBrown * (fresh device added). 686cce3b23f6f8e974c00af7a9b88f1d413ba368a8NeilBrown * Cleared when a sync completes. 696cce3b23f6f8e974c00af7a9b88f1d413ba368a8NeilBrown */ 7069335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown int have_replacement; /* There is at least one 7169335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown * replacement device. 7269335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown */ 730a27ec96b6fb1abf867e36d7b0b681d67588767aNeilBrown wait_queue_head_t wait_barrier; 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 7569335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown mempool_t *r10bio_pool; 7669335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown mempool_t *r10buf_pool; 774443ae10ca15d07922ceda622f03db8865fa3d13NeilBrown struct page *tmppage; 78dab8b29248b3f14f456651a2a6ee9b8fd16d1b3cTrela, Maciej 79dab8b29248b3f14f456651a2a6ee9b8fd16d1b3cTrela, Maciej /* When taking over an array from a different personality, we store 80dab8b29248b3f14f456651a2a6ee9b8fd16d1b3cTrela, Maciej * the new thread here until we fully activate the array. 81dab8b29248b3f14f456651a2a6ee9b8fd16d1b3cTrela, Maciej */ 822b8bf3451d1e3133ebc3998721d14013a6c27114NeilBrown struct md_thread *thread; 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * this is our 'private' RAID10 bio. 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it contains information about what kind of IO operations were started 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * for this RAID10 operation, and about their status: 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 929f2c9d12bcc53fcb3b787023723754e84d1aef8bNeilBrownstruct r10bio { 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds atomic_t remaining; /* 'have we finished' count, 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * used from IRQ handlers 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds sector_t sector; /* virtual sector number */ 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int sectors; 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long state; 99fd01b88c75a718020ff77e7f560d33835e9b58deNeilBrown struct mddev *mddev; 1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * original bio going to /dev/mdx 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct bio *master_bio; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * if the IO is in READ direction, then this is where we read 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int read_slot; 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds struct list_head retry_list; 1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * if the IO is in WRITE direction, then multiple bios are used, 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * one for each copy. 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * When resyncing we also use one for each copy. 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * When reconstructing, we use 2 bios, one for read, one for write. 1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We choose the number when they are allocated. 11669335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown * We sometimes need an extra bio to write to the replacement. 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 118e0ee778528bbaad28a5c69d2e219269a3a096607NeilBrown struct r10dev { 11969335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown struct bio *bio; 12069335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown union { 12169335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown struct bio *repl_bio; /* used for resync and 12269335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown * writes */ 12369335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown struct md_rdev *rdev; /* used for reads 12469335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown * (read_slot >= 0) */ 12569335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown }; 12669335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown sector_t addr; 12769335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown int devnum; 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } devs[0]; 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* bits for r10bio.state */ 13269335ef3bc5b766f34db2d688be1d35313138bcaNeilBrownenum r10bio_state { 13369335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown R10BIO_Uptodate, 13469335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown R10BIO_IsSync, 13569335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown R10BIO_IsRecover, 1363ea7daa5d7fde47cd41f4d56c2deb949114da9d6NeilBrown R10BIO_IsReshape, 13769335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown R10BIO_Degraded, 138856e08e23762dfb92ffc68fd0a8d228f9e152160NeilBrown/* Set ReadError on bios that experience a read error 139856e08e23762dfb92ffc68fd0a8d228f9e152160NeilBrown * so that raid10d knows what to do with them. 140856e08e23762dfb92ffc68fd0a8d228f9e152160NeilBrown */ 14169335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown R10BIO_ReadError, 142749c55e942d91cb27045fe2eb313aa5afe68ae0bNeilBrown/* If a write for this request means we can clear some 143749c55e942d91cb27045fe2eb313aa5afe68ae0bNeilBrown * known-bad-block records, we set this flag. 144749c55e942d91cb27045fe2eb313aa5afe68ae0bNeilBrown */ 14569335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown R10BIO_MadeGood, 14669335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown R10BIO_WriteError, 147f8c9e74ff0832f2244d7991d2aea13851b20a622NeilBrown/* During a reshape we might be performing IO on the 148f8c9e74ff0832f2244d7991d2aea13851b20a622NeilBrown * 'previous' part of the array, in which case this 149f8c9e74ff0832f2244d7991d2aea13851b20a622NeilBrown * flag is set 150f8c9e74ff0832f2244d7991d2aea13851b20a622NeilBrown */ 151f8c9e74ff0832f2244d7991d2aea13851b20a622NeilBrown R10BIO_Previous, 15269335ef3bc5b766f34db2d688be1d35313138bcaNeilBrown}; 153cc4d1efdd017083bbcbaf23feb4cdc717fa7dab8Jonathan Brassow 154cc4d1efdd017083bbcbaf23feb4cdc717fa7dab8Jonathan Brassowextern int md_raid10_congested(struct mddev *mddev, int bits); 155cc4d1efdd017083bbcbaf23feb4cdc717fa7dab8Jonathan Brassow 1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif 157