raid5.c (4536bf9ba2d03404655586b07f8830b6f2106242) | raid5.c (6358c239d88c751a9f14152a8d4ad2b69f5be48f) |
---|---|
1/* 2 * raid5.c : Multiple Devices driver for Linux 3 * Copyright (C) 1996, 1997 Ingo Molnar, Miguel de Icaza, Gadi Oxman 4 * Copyright (C) 1999, 2000 Ingo Molnar 5 * Copyright (C) 2002, 2003 H. Peter Anvin 6 * 7 * RAID-4/5/6 management functions. 8 * Thanks to Penguin Computing for making the RAID-6 development possible --- 7634 unchanged lines hidden (view full) --- 7643 if (!test_bit(RemoveSynchronized, &rdev->flags)) { 7644 synchronize_rcu(); 7645 if (atomic_read(&rdev->nr_pending)) { 7646 /* lost the race, try later */ 7647 err = -EBUSY; 7648 *rdevp = rdev; 7649 } 7650 } | 1/* 2 * raid5.c : Multiple Devices driver for Linux 3 * Copyright (C) 1996, 1997 Ingo Molnar, Miguel de Icaza, Gadi Oxman 4 * Copyright (C) 1999, 2000 Ingo Molnar 5 * Copyright (C) 2002, 2003 H. Peter Anvin 6 * 7 * RAID-4/5/6 management functions. 8 * Thanks to Penguin Computing for making the RAID-6 development possible --- 7634 unchanged lines hidden (view full) --- 7643 if (!test_bit(RemoveSynchronized, &rdev->flags)) { 7644 synchronize_rcu(); 7645 if (atomic_read(&rdev->nr_pending)) { 7646 /* lost the race, try later */ 7647 err = -EBUSY; 7648 *rdevp = rdev; 7649 } 7650 } |
7651 if (!err) { 7652 err = log_modify(conf, rdev, false); 7653 if (err) 7654 goto abort; 7655 } |
|
7651 if (p->replacement) { 7652 /* We must have just cleared 'rdev' */ 7653 p->rdev = p->replacement; 7654 clear_bit(Replacement, &p->replacement->flags); 7655 smp_mb(); /* Make sure other CPUs may see both as identical 7656 * but will never see neither - if they are careful 7657 */ 7658 p->replacement = NULL; 7659 clear_bit(WantReplacement, &rdev->flags); | 7656 if (p->replacement) { 7657 /* We must have just cleared 'rdev' */ 7658 p->rdev = p->replacement; 7659 clear_bit(Replacement, &p->replacement->flags); 7660 smp_mb(); /* Make sure other CPUs may see both as identical 7661 * but will never see neither - if they are careful 7662 */ 7663 p->replacement = NULL; 7664 clear_bit(WantReplacement, &rdev->flags); |
7665 7666 if (!err) 7667 err = log_modify(conf, p->rdev, true); |
|
7660 } else 7661 /* We might have just removed the Replacement as faulty- 7662 * clear the bit just in case 7663 */ 7664 clear_bit(WantReplacement, &rdev->flags); 7665abort: 7666 7667 print_raid5_conf(conf); --- 40 unchanged lines hidden (view full) --- 7708 conf->disks[rdev->saved_raid_disk].rdev == NULL) 7709 first = rdev->saved_raid_disk; 7710 7711 for (disk = first; disk <= last; disk++) { 7712 p = conf->disks + disk; 7713 if (p->rdev == NULL) { 7714 clear_bit(In_sync, &rdev->flags); 7715 rdev->raid_disk = disk; | 7668 } else 7669 /* We might have just removed the Replacement as faulty- 7670 * clear the bit just in case 7671 */ 7672 clear_bit(WantReplacement, &rdev->flags); 7673abort: 7674 7675 print_raid5_conf(conf); --- 40 unchanged lines hidden (view full) --- 7716 conf->disks[rdev->saved_raid_disk].rdev == NULL) 7717 first = rdev->saved_raid_disk; 7718 7719 for (disk = first; disk <= last; disk++) { 7720 p = conf->disks + disk; 7721 if (p->rdev == NULL) { 7722 clear_bit(In_sync, &rdev->flags); 7723 rdev->raid_disk = disk; |
7716 err = 0; | |
7717 if (rdev->saved_raid_disk != disk) 7718 conf->fullsync = 1; 7719 rcu_assign_pointer(p->rdev, rdev); | 7724 if (rdev->saved_raid_disk != disk) 7725 conf->fullsync = 1; 7726 rcu_assign_pointer(p->rdev, rdev); |
7727 7728 err = log_modify(conf, rdev, true); 7729 |
|
7720 goto out; 7721 } 7722 } 7723 for (disk = first; disk <= last; disk++) { 7724 p = conf->disks + disk; 7725 if (test_bit(WantReplacement, &p->rdev->flags) && 7726 p->replacement == NULL) { 7727 clear_bit(In_sync, &rdev->flags); --- 718 unchanged lines hidden --- | 7730 goto out; 7731 } 7732 } 7733 for (disk = first; disk <= last; disk++) { 7734 p = conf->disks + disk; 7735 if (test_bit(WantReplacement, &p->rdev->flags) && 7736 p->replacement == NULL) { 7737 clear_bit(In_sync, &rdev->flags); --- 718 unchanged lines hidden --- |