mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	md/raid10: recognise replacements when assembling array.
If a Replacement is seen, file it as such. If we see two replacements (or two normal devices) for the one slot, abort. Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
		
							parent
							
								
									4ca40c2ce0
								
							
						
					
					
						commit
						56a2559bb6
					
				
					 1 changed files with 17 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -3201,6 +3201,16 @@ static int run(struct mddev *mddev)
 | 
			
		|||
			continue;
 | 
			
		||||
		disk = conf->mirrors + disk_idx;
 | 
			
		||||
 | 
			
		||||
		if (test_bit(Replacement, &rdev->flags)) {
 | 
			
		||||
			if (disk->replacement)
 | 
			
		||||
				goto out_free_conf;
 | 
			
		||||
			disk->replacement = rdev;
 | 
			
		||||
		} else {
 | 
			
		||||
			if (disk->rdev)
 | 
			
		||||
				goto out_free_conf;
 | 
			
		||||
			disk->rdev = rdev;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		disk->rdev = rdev;
 | 
			
		||||
		disk_stack_limits(mddev->gendisk, rdev->bdev,
 | 
			
		||||
				  rdev->data_offset << 9);
 | 
			
		||||
| 
						 | 
				
			
			@ -3228,6 +3238,13 @@ static int run(struct mddev *mddev)
 | 
			
		|||
 | 
			
		||||
		disk = conf->mirrors + i;
 | 
			
		||||
 | 
			
		||||
		if (!disk->rdev && disk->replacement) {
 | 
			
		||||
			/* The replacement is all we have - use it */
 | 
			
		||||
			disk->rdev = disk->replacement;
 | 
			
		||||
			disk->replacement = NULL;
 | 
			
		||||
			clear_bit(Replacement, &disk->rdev->flags);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (!disk->rdev ||
 | 
			
		||||
		    !test_bit(In_sync, &disk->rdev->flags)) {
 | 
			
		||||
			disk->head_position = 0;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue