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 ---