aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/raid10.c127
1 files changed, 65 insertions, 62 deletions
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
index fe6692e62215..c489b5c6ed6d 100644
--- a/drivers/md/raid10.c
+++ b/drivers/md/raid10.c
@@ -1533,80 +1533,83 @@ static void fix_read_error(conf_t *conf, mddev_t *mddev, r10bio_t *r10_bio)
1533 sl--; 1533 sl--;
1534 d = r10_bio->devs[sl].devnum; 1534 d = r10_bio->devs[sl].devnum;
1535 rdev = rcu_dereference(conf->mirrors[d].rdev); 1535 rdev = rcu_dereference(conf->mirrors[d].rdev);
1536 if (rdev && 1536 if (!rdev ||
1537 test_bit(In_sync, &rdev->flags)) { 1537 !test_bit(In_sync, &rdev->flags))
1538 atomic_inc(&rdev->nr_pending); 1538 continue;
1539 rcu_read_unlock(); 1539
1540 if (sync_page_io(rdev, 1540 atomic_inc(&rdev->nr_pending);
1541 r10_bio->devs[sl].addr + 1541 rcu_read_unlock();
1542 sect, 1542 if (sync_page_io(rdev,
1543 s<<9, conf->tmppage, WRITE, false) 1543 r10_bio->devs[sl].addr +
1544 == 0) { 1544 sect,
1545 /* Well, this device is dead */ 1545 s<<9, conf->tmppage, WRITE, false)
1546 printk(KERN_NOTICE 1546 == 0) {
1547 "md/raid10:%s: read correction " 1547 /* Well, this device is dead */
1548 "write failed" 1548 printk(KERN_NOTICE
1549 " (%d sectors at %llu on %s)\n", 1549 "md/raid10:%s: read correction "
1550 mdname(mddev), s, 1550 "write failed"
1551 (unsigned long long)( 1551 " (%d sectors at %llu on %s)\n",
1552 sect + rdev->data_offset), 1552 mdname(mddev), s,
1553 bdevname(rdev->bdev, b)); 1553 (unsigned long long)(
1554 printk(KERN_NOTICE "md/raid10:%s: %s: failing " 1554 sect + rdev->data_offset),
1555 "drive\n", 1555 bdevname(rdev->bdev, b));
1556 mdname(mddev), 1556 printk(KERN_NOTICE "md/raid10:%s: %s: failing "
1557 bdevname(rdev->bdev, b)); 1557 "drive\n",
1558 md_error(mddev, rdev); 1558 mdname(mddev),
1559 } 1559 bdevname(rdev->bdev, b));
1560 rdev_dec_pending(rdev, mddev); 1560 md_error(mddev, rdev);
1561 rcu_read_lock();
1562 } 1561 }
1562 rdev_dec_pending(rdev, mddev);
1563 rcu_read_lock();
1563 } 1564 }
1564 sl = start; 1565 sl = start;
1565 while (sl != r10_bio->read_slot) { 1566 while (sl != r10_bio->read_slot) {
1567 char b[BDEVNAME_SIZE];
1566 1568
1567 if (sl==0) 1569 if (sl==0)
1568 sl = conf->copies; 1570 sl = conf->copies;
1569 sl--; 1571 sl--;
1570 d = r10_bio->devs[sl].devnum; 1572 d = r10_bio->devs[sl].devnum;
1571 rdev = rcu_dereference(conf->mirrors[d].rdev); 1573 rdev = rcu_dereference(conf->mirrors[d].rdev);
1572 if (rdev && 1574 if (!rdev ||
1573 test_bit(In_sync, &rdev->flags)) { 1575 !test_bit(In_sync, &rdev->flags))
1574 char b[BDEVNAME_SIZE]; 1576 continue;
1575 atomic_inc(&rdev->nr_pending);
1576 rcu_read_unlock();
1577 if (sync_page_io(rdev,
1578 r10_bio->devs[sl].addr +
1579 sect,
1580 s<<9, conf->tmppage,
1581 READ, false) == 0) {
1582 /* Well, this device is dead */
1583 printk(KERN_NOTICE
1584 "md/raid10:%s: unable to read back "
1585 "corrected sectors"
1586 " (%d sectors at %llu on %s)\n",
1587 mdname(mddev), s,
1588 (unsigned long long)(
1589 sect + rdev->data_offset),
1590 bdevname(rdev->bdev, b));
1591 printk(KERN_NOTICE "md/raid10:%s: %s: failing drive\n",
1592 mdname(mddev),
1593 bdevname(rdev->bdev, b));
1594
1595 md_error(mddev, rdev);
1596 } else {
1597 printk(KERN_INFO
1598 "md/raid10:%s: read error corrected"
1599 " (%d sectors at %llu on %s)\n",
1600 mdname(mddev), s,
1601 (unsigned long long)(
1602 sect + rdev->data_offset),
1603 bdevname(rdev->bdev, b));
1604 atomic_add(s, &rdev->corrected_errors);
1605 }
1606 1577
1607 rdev_dec_pending(rdev, mddev); 1578 atomic_inc(&rdev->nr_pending);
1608 rcu_read_lock(); 1579 rcu_read_unlock();
1580 if (sync_page_io(rdev,
1581 r10_bio->devs[sl].addr +
1582 sect,
1583 s<<9, conf->tmppage,
1584 READ, false) == 0) {
1585 /* Well, this device is dead */
1586 printk(KERN_NOTICE
1587 "md/raid10:%s: unable to read back "
1588 "corrected sectors"
1589 " (%d sectors at %llu on %s)\n",
1590 mdname(mddev), s,
1591 (unsigned long long)(
1592 sect + rdev->data_offset),
1593 bdevname(rdev->bdev, b));
1594 printk(KERN_NOTICE "md/raid10:%s: %s: failing "
1595 "drive\n",
1596 mdname(mddev),
1597 bdevname(rdev->bdev, b));
1598
1599 md_error(mddev, rdev);
1600 } else {
1601 printk(KERN_INFO
1602 "md/raid10:%s: read error corrected"
1603 " (%d sectors at %llu on %s)\n",
1604 mdname(mddev), s,
1605 (unsigned long long)(
1606 sect + rdev->data_offset),
1607 bdevname(rdev->bdev, b));
1608 atomic_add(s, &rdev->corrected_errors);
1609 } 1609 }
1610
1611 rdev_dec_pending(rdev, mddev);
1612 rcu_read_lock();
1610 } 1613 }
1611 rcu_read_unlock(); 1614 rcu_read_unlock();
1612 1615