raid1.c (11e4afb49b7fa1fc8e1ffd850c1806dd86a08204) raid1.c (7b6d91daee5cac6402186ff224c3af39d79f4a0e)
1/*
2 * raid1.c : Multiple Devices driver for Linux
3 *
4 * Copyright (C) 1999, 2000, 2001 Ingo Molnar, Red Hat
5 *
6 * Copyright (C) 1996, 1997, 1998 Ingo Molnar, Miguel de Icaza, Gadi Oxman
7 *
8 * RAID-1 management functions.

--- 773 unchanged lines hidden (view full) ---

782 r1bio_t *r1_bio;
783 struct bio *read_bio;
784 int i, targets = 0, disks;
785 struct bitmap *bitmap;
786 unsigned long flags;
787 struct bio_list bl;
788 struct page **behind_pages = NULL;
789 const int rw = bio_data_dir(bio);
1/*
2 * raid1.c : Multiple Devices driver for Linux
3 *
4 * Copyright (C) 1999, 2000, 2001 Ingo Molnar, Red Hat
5 *
6 * Copyright (C) 1996, 1997, 1998 Ingo Molnar, Miguel de Icaza, Gadi Oxman
7 *
8 * RAID-1 management functions.

--- 773 unchanged lines hidden (view full) ---

782 r1bio_t *r1_bio;
783 struct bio *read_bio;
784 int i, targets = 0, disks;
785 struct bitmap *bitmap;
786 unsigned long flags;
787 struct bio_list bl;
788 struct page **behind_pages = NULL;
789 const int rw = bio_data_dir(bio);
790 const bool do_sync = bio_rw_flagged(bio, BIO_RW_SYNCIO);
790 const bool do_sync = (bio->bi_rw & REQ_SYNC);
791 bool do_barriers;
792 mdk_rdev_t *blocked_rdev;
793
794 /*
795 * Register the new request and wait if the reconstruction
796 * thread has put up a bar for new requests.
797 * Continue immediately if no resync is active currently.
798 * We test barriers_work *after* md_write_start as md_write_start

--- 18 unchanged lines hidden (view full) ---

817 if (bio->bi_sector + bio->bi_size/512 <= mddev->suspend_lo ||
818 bio->bi_sector >= mddev->suspend_hi)
819 break;
820 schedule();
821 }
822 finish_wait(&conf->wait_barrier, &w);
823 }
824 if (unlikely(!mddev->barriers_work &&
791 bool do_barriers;
792 mdk_rdev_t *blocked_rdev;
793
794 /*
795 * Register the new request and wait if the reconstruction
796 * thread has put up a bar for new requests.
797 * Continue immediately if no resync is active currently.
798 * We test barriers_work *after* md_write_start as md_write_start

--- 18 unchanged lines hidden (view full) ---

817 if (bio->bi_sector + bio->bi_size/512 <= mddev->suspend_lo ||
818 bio->bi_sector >= mddev->suspend_hi)
819 break;
820 schedule();
821 }
822 finish_wait(&conf->wait_barrier, &w);
823 }
824 if (unlikely(!mddev->barriers_work &&
825 bio_rw_flagged(bio, BIO_RW_BARRIER))) {
825 (bio->bi_rw & REQ_HARDBARRIER))) {
826 if (rw == WRITE)
827 md_write_end(mddev);
828 bio_endio(bio, -EOPNOTSUPP);
829 return 0;
830 }
831
832 wait_barrier(conf);
833

--- 38 unchanged lines hidden (view full) ---

872
873 read_bio = bio_clone(bio, GFP_NOIO);
874
875 r1_bio->bios[rdisk] = read_bio;
876
877 read_bio->bi_sector = r1_bio->sector + mirror->rdev->data_offset;
878 read_bio->bi_bdev = mirror->rdev->bdev;
879 read_bio->bi_end_io = raid1_end_read_request;
826 if (rw == WRITE)
827 md_write_end(mddev);
828 bio_endio(bio, -EOPNOTSUPP);
829 return 0;
830 }
831
832 wait_barrier(conf);
833

--- 38 unchanged lines hidden (view full) ---

872
873 read_bio = bio_clone(bio, GFP_NOIO);
874
875 r1_bio->bios[rdisk] = read_bio;
876
877 read_bio->bi_sector = r1_bio->sector + mirror->rdev->data_offset;
878 read_bio->bi_bdev = mirror->rdev->bdev;
879 read_bio->bi_end_io = raid1_end_read_request;
880 read_bio->bi_rw = READ | (do_sync << BIO_RW_SYNCIO);
880 read_bio->bi_rw = READ | do_sync;
881 read_bio->bi_private = r1_bio;
882
883 generic_make_request(read_bio);
884 return 0;
885 }
886
887 /*
888 * WRITE:

--- 65 unchanged lines hidden (view full) ---

954 < mddev->bitmap_info.max_write_behind) &&
955 !waitqueue_active(&bitmap->behind_wait) &&
956 (behind_pages = alloc_behind_pages(bio)) != NULL)
957 set_bit(R1BIO_BehindIO, &r1_bio->state);
958
959 atomic_set(&r1_bio->remaining, 0);
960 atomic_set(&r1_bio->behind_remaining, 0);
961
881 read_bio->bi_private = r1_bio;
882
883 generic_make_request(read_bio);
884 return 0;
885 }
886
887 /*
888 * WRITE:

--- 65 unchanged lines hidden (view full) ---

954 < mddev->bitmap_info.max_write_behind) &&
955 !waitqueue_active(&bitmap->behind_wait) &&
956 (behind_pages = alloc_behind_pages(bio)) != NULL)
957 set_bit(R1BIO_BehindIO, &r1_bio->state);
958
959 atomic_set(&r1_bio->remaining, 0);
960 atomic_set(&r1_bio->behind_remaining, 0);
961
962 do_barriers = bio_rw_flagged(bio, BIO_RW_BARRIER);
962 do_barriers = bio->bi_rw & REQ_HARDBARRIER;
963 if (do_barriers)
964 set_bit(R1BIO_Barrier, &r1_bio->state);
965
966 bio_list_init(&bl);
967 for (i = 0; i < disks; i++) {
968 struct bio *mbio;
969 if (!r1_bio->bios[i])
970 continue;
971
972 mbio = bio_clone(bio, GFP_NOIO);
973 r1_bio->bios[i] = mbio;
974
975 mbio->bi_sector = r1_bio->sector + conf->mirrors[i].rdev->data_offset;
976 mbio->bi_bdev = conf->mirrors[i].rdev->bdev;
977 mbio->bi_end_io = raid1_end_write_request;
963 if (do_barriers)
964 set_bit(R1BIO_Barrier, &r1_bio->state);
965
966 bio_list_init(&bl);
967 for (i = 0; i < disks; i++) {
968 struct bio *mbio;
969 if (!r1_bio->bios[i])
970 continue;
971
972 mbio = bio_clone(bio, GFP_NOIO);
973 r1_bio->bios[i] = mbio;
974
975 mbio->bi_sector = r1_bio->sector + conf->mirrors[i].rdev->data_offset;
976 mbio->bi_bdev = conf->mirrors[i].rdev->bdev;
977 mbio->bi_end_io = raid1_end_write_request;
978 mbio->bi_rw = WRITE | (do_barriers << BIO_RW_BARRIER) |
979 (do_sync << BIO_RW_SYNCIO);
978 mbio->bi_rw = WRITE | do_barriers | do_sync;
980 mbio->bi_private = r1_bio;
981
982 if (behind_pages) {
983 struct bio_vec *bvec;
984 int j;
985
986 /* Yes, I really want the '__' version so that
987 * we clear any unused pointer in the io_vec, rather

--- 640 unchanged lines hidden (view full) ---

1628 spin_unlock_irqrestore(&conf->device_lock, flags);
1629
1630 mddev = r1_bio->mddev;
1631 conf = mddev->private;
1632 if (test_bit(R1BIO_IsSync, &r1_bio->state)) {
1633 sync_request_write(mddev, r1_bio);
1634 unplug = 1;
1635 } else if (test_bit(R1BIO_BarrierRetry, &r1_bio->state)) {
979 mbio->bi_private = r1_bio;
980
981 if (behind_pages) {
982 struct bio_vec *bvec;
983 int j;
984
985 /* Yes, I really want the '__' version so that
986 * we clear any unused pointer in the io_vec, rather

--- 640 unchanged lines hidden (view full) ---

1627 spin_unlock_irqrestore(&conf->device_lock, flags);
1628
1629 mddev = r1_bio->mddev;
1630 conf = mddev->private;
1631 if (test_bit(R1BIO_IsSync, &r1_bio->state)) {
1632 sync_request_write(mddev, r1_bio);
1633 unplug = 1;
1634 } else if (test_bit(R1BIO_BarrierRetry, &r1_bio->state)) {
1636 /* some requests in the r1bio were BIO_RW_BARRIER
1635 /* some requests in the r1bio were REQ_HARDBARRIER
1637 * requests which failed with -EOPNOTSUPP. Hohumm..
1638 * Better resubmit without the barrier.
1639 * We know which devices to resubmit for, because
1640 * all others have had their bios[] entry cleared.
1641 * We already have a nr_pending reference on these rdevs.
1642 */
1643 int i;
1636 * requests which failed with -EOPNOTSUPP. Hohumm..
1637 * Better resubmit without the barrier.
1638 * We know which devices to resubmit for, because
1639 * all others have had their bios[] entry cleared.
1640 * We already have a nr_pending reference on these rdevs.
1641 */
1642 int i;
1644 const bool do_sync = bio_rw_flagged(r1_bio->master_bio, BIO_RW_SYNCIO);
1643 const bool do_sync = (r1_bio->master_bio->bi_rw & REQ_SYNC);
1645 clear_bit(R1BIO_BarrierRetry, &r1_bio->state);
1646 clear_bit(R1BIO_Barrier, &r1_bio->state);
1647 for (i=0; i < conf->raid_disks; i++)
1648 if (r1_bio->bios[i])
1649 atomic_inc(&r1_bio->remaining);
1650 for (i=0; i < conf->raid_disks; i++)
1651 if (r1_bio->bios[i]) {
1652 struct bio_vec *bvec;

--- 4 unchanged lines hidden (view full) ---

1657 * this might be a write-behind device */
1658 __bio_for_each_segment(bvec, bio, j, 0)
1659 bvec->bv_page = bio_iovec_idx(r1_bio->bios[i], j)->bv_page;
1660 bio_put(r1_bio->bios[i]);
1661 bio->bi_sector = r1_bio->sector +
1662 conf->mirrors[i].rdev->data_offset;
1663 bio->bi_bdev = conf->mirrors[i].rdev->bdev;
1664 bio->bi_end_io = raid1_end_write_request;
1644 clear_bit(R1BIO_BarrierRetry, &r1_bio->state);
1645 clear_bit(R1BIO_Barrier, &r1_bio->state);
1646 for (i=0; i < conf->raid_disks; i++)
1647 if (r1_bio->bios[i])
1648 atomic_inc(&r1_bio->remaining);
1649 for (i=0; i < conf->raid_disks; i++)
1650 if (r1_bio->bios[i]) {
1651 struct bio_vec *bvec;

--- 4 unchanged lines hidden (view full) ---

1656 * this might be a write-behind device */
1657 __bio_for_each_segment(bvec, bio, j, 0)
1658 bvec->bv_page = bio_iovec_idx(r1_bio->bios[i], j)->bv_page;
1659 bio_put(r1_bio->bios[i]);
1660 bio->bi_sector = r1_bio->sector +
1661 conf->mirrors[i].rdev->data_offset;
1662 bio->bi_bdev = conf->mirrors[i].rdev->bdev;
1663 bio->bi_end_io = raid1_end_write_request;
1665 bio->bi_rw = WRITE |
1666 (do_sync << BIO_RW_SYNCIO);
1664 bio->bi_rw = WRITE | do_sync;
1667 bio->bi_private = r1_bio;
1668 r1_bio->bios[i] = bio;
1669 generic_make_request(bio);
1670 }
1671 } else {
1672 int disk;
1673
1674 /* we got a read error. Maybe the drive is bad. Maybe just

--- 18 unchanged lines hidden (view full) ---

1693 if ((disk=read_balance(conf, r1_bio)) == -1) {
1694 printk(KERN_ALERT "md/raid1:%s: %s: unrecoverable I/O"
1695 " read error for block %llu\n",
1696 mdname(mddev),
1697 bdevname(bio->bi_bdev,b),
1698 (unsigned long long)r1_bio->sector);
1699 raid_end_bio_io(r1_bio);
1700 } else {
1665 bio->bi_private = r1_bio;
1666 r1_bio->bios[i] = bio;
1667 generic_make_request(bio);
1668 }
1669 } else {
1670 int disk;
1671
1672 /* we got a read error. Maybe the drive is bad. Maybe just

--- 18 unchanged lines hidden (view full) ---

1691 if ((disk=read_balance(conf, r1_bio)) == -1) {
1692 printk(KERN_ALERT "md/raid1:%s: %s: unrecoverable I/O"
1693 " read error for block %llu\n",
1694 mdname(mddev),
1695 bdevname(bio->bi_bdev,b),
1696 (unsigned long long)r1_bio->sector);
1697 raid_end_bio_io(r1_bio);
1698 } else {
1701 const bool do_sync = bio_rw_flagged(r1_bio->master_bio, BIO_RW_SYNCIO);
1699 const bool do_sync = r1_bio->master_bio->bi_rw & REQ_SYNC;
1702 r1_bio->bios[r1_bio->read_disk] =
1703 mddev->ro ? IO_BLOCKED : NULL;
1704 r1_bio->read_disk = disk;
1705 bio_put(bio);
1706 bio = bio_clone(r1_bio->master_bio, GFP_NOIO);
1707 r1_bio->bios[r1_bio->read_disk] = bio;
1708 rdev = conf->mirrors[disk].rdev;
1709 if (printk_ratelimit())
1710 printk(KERN_ERR "md/raid1:%s: redirecting sector %llu to"
1711 " other mirror: %s\n",
1712 mdname(mddev),
1713 (unsigned long long)r1_bio->sector,
1714 bdevname(rdev->bdev,b));
1715 bio->bi_sector = r1_bio->sector + rdev->data_offset;
1716 bio->bi_bdev = rdev->bdev;
1717 bio->bi_end_io = raid1_end_read_request;
1700 r1_bio->bios[r1_bio->read_disk] =
1701 mddev->ro ? IO_BLOCKED : NULL;
1702 r1_bio->read_disk = disk;
1703 bio_put(bio);
1704 bio = bio_clone(r1_bio->master_bio, GFP_NOIO);
1705 r1_bio->bios[r1_bio->read_disk] = bio;
1706 rdev = conf->mirrors[disk].rdev;
1707 if (printk_ratelimit())
1708 printk(KERN_ERR "md/raid1:%s: redirecting sector %llu to"
1709 " other mirror: %s\n",
1710 mdname(mddev),
1711 (unsigned long long)r1_bio->sector,
1712 bdevname(rdev->bdev,b));
1713 bio->bi_sector = r1_bio->sector + rdev->data_offset;
1714 bio->bi_bdev = rdev->bdev;
1715 bio->bi_end_io = raid1_end_read_request;
1718 bio->bi_rw = READ | (do_sync << BIO_RW_SYNCIO);
1716 bio->bi_rw = READ | do_sync;
1719 bio->bi_private = r1_bio;
1720 unplug = 1;
1721 generic_make_request(bio);
1722 }
1723 }
1724 cond_resched();
1725 }
1726 if (unplug)

--- 667 unchanged lines hidden ---
1717 bio->bi_private = r1_bio;
1718 unplug = 1;
1719 generic_make_request(bio);
1720 }
1721 }
1722 cond_resched();
1723 }
1724 if (unplug)

--- 667 unchanged lines hidden ---