Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'md-next' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md into for-5.13/drivers

Pull MD updates from Song:

"The major changes are:

1. Performance improvement for raid10 discard requests, from Xiao Ni.
2. Fix missing information of /proc/mdstat, from Jan Glauber."

* 'md-next' of https://git.kernel.org/pub/scm/linux/kernel/git/song/md:
md: Fix missing unused status line of /proc/mdstat
md/raid10: improve discard request for far layout
md/raid10: improve raid10 discard request
md/raid10: pull the code that wait for blocked dev into one function
md/raid10: extend r10bio devs to raid disks
md: add md_submit_discard_bio() for submitting discard bio

+407 -70
+25 -1
drivers/md/md.c
··· 8153 8153 loff_t l = *pos; 8154 8154 struct mddev *mddev; 8155 8155 8156 - if (l >= 0x10000) 8156 + if (l == 0x10000) { 8157 + ++*pos; 8158 + return (void *)2; 8159 + } 8160 + if (l > 0x10000) 8157 8161 return NULL; 8158 8162 if (!l--) 8159 8163 /* header */ ··· 8578 8574 } 8579 8575 8580 8576 EXPORT_SYMBOL(md_write_end); 8577 + 8578 + /* This is used by raid0 and raid10 */ 8579 + void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev, 8580 + struct bio *bio, sector_t start, sector_t size) 8581 + { 8582 + struct bio *discard_bio = NULL; 8583 + 8584 + if (__blkdev_issue_discard(rdev->bdev, start, size, GFP_NOIO, 0, 8585 + &discard_bio) || !discard_bio) 8586 + return; 8587 + 8588 + bio_chain(discard_bio, bio); 8589 + bio_clone_blkg_association(discard_bio, bio); 8590 + if (mddev->gendisk) 8591 + trace_block_bio_remap(discard_bio, 8592 + disk_devt(mddev->gendisk), 8593 + bio->bi_iter.bi_sector); 8594 + submit_bio_noacct(discard_bio); 8595 + } 8596 + EXPORT_SYMBOL_GPL(md_submit_discard_bio); 8581 8597 8582 8598 /* md_allow_write(mddev) 8583 8599 * Calling this ensures that the array is marked 'active' so that writes
+2
drivers/md/md.h
··· 713 713 extern void md_done_sync(struct mddev *mddev, int blocks, int ok); 714 714 extern void md_error(struct mddev *mddev, struct md_rdev *rdev); 715 715 extern void md_finish_reshape(struct mddev *mddev); 716 + void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev, 717 + struct bio *bio, sector_t start, sector_t size); 716 718 717 719 extern bool __must_check md_flush_request(struct mddev *mddev, struct bio *bio); 718 720 extern void md_super_write(struct mddev *mddev, struct md_rdev *rdev,
+2 -12
drivers/md/raid0.c
··· 477 477 478 478 for (disk = 0; disk < zone->nb_dev; disk++) { 479 479 sector_t dev_start, dev_end; 480 - struct bio *discard_bio = NULL; 481 480 struct md_rdev *rdev; 482 481 483 482 if (disk < start_disk_index) ··· 499 500 500 501 rdev = conf->devlist[(zone - conf->strip_zone) * 501 502 conf->strip_zone[0].nb_dev + disk]; 502 - if (__blkdev_issue_discard(rdev->bdev, 503 + md_submit_discard_bio(mddev, rdev, bio, 503 504 dev_start + zone->dev_start + rdev->data_offset, 504 - dev_end - dev_start, GFP_NOIO, 0, &discard_bio) || 505 - !discard_bio) 506 - continue; 507 - bio_chain(discard_bio, bio); 508 - bio_clone_blkg_association(discard_bio, bio); 509 - if (mddev->gendisk) 510 - trace_block_bio_remap(discard_bio, 511 - disk_devt(mddev->gendisk), 512 - bio->bi_iter.bi_sector); 513 - submit_bio_noacct(discard_bio); 505 + dev_end - dev_start); 514 506 } 515 507 bio_endio(bio); 516 508 }
+377 -57
drivers/md/raid10.c
··· 91 91 static void * r10bio_pool_alloc(gfp_t gfp_flags, void *data) 92 92 { 93 93 struct r10conf *conf = data; 94 - int size = offsetof(struct r10bio, devs[conf->copies]); 94 + int size = offsetof(struct r10bio, devs[conf->geo.raid_disks]); 95 95 96 96 /* allocate a r10bio with room for raid_disks entries in the 97 97 * bios array */ ··· 238 238 { 239 239 int i; 240 240 241 - for (i = 0; i < conf->copies; i++) { 241 + for (i = 0; i < conf->geo.raid_disks; i++) { 242 242 struct bio **bio = & r10_bio->devs[i].bio; 243 243 if (!BIO_SPECIAL(*bio)) 244 244 bio_put(*bio); ··· 327 327 int slot; 328 328 int repl = 0; 329 329 330 - for (slot = 0; slot < conf->copies; slot++) { 330 + for (slot = 0; slot < conf->geo.raid_disks; slot++) { 331 331 if (r10_bio->devs[slot].bio == bio) 332 332 break; 333 333 if (r10_bio->devs[slot].repl_bio == bio) { ··· 336 336 } 337 337 } 338 338 339 - BUG_ON(slot == conf->copies); 340 339 update_head_pos(slot, r10_bio); 341 340 342 341 if (slotp) ··· 1273 1274 } 1274 1275 } 1275 1276 1277 + static void wait_blocked_dev(struct mddev *mddev, struct r10bio *r10_bio) 1278 + { 1279 + int i; 1280 + struct r10conf *conf = mddev->private; 1281 + struct md_rdev *blocked_rdev; 1282 + 1283 + retry_wait: 1284 + blocked_rdev = NULL; 1285 + rcu_read_lock(); 1286 + for (i = 0; i < conf->copies; i++) { 1287 + struct md_rdev *rdev = rcu_dereference(conf->mirrors[i].rdev); 1288 + struct md_rdev *rrdev = rcu_dereference( 1289 + conf->mirrors[i].replacement); 1290 + if (rdev == rrdev) 1291 + rrdev = NULL; 1292 + if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) { 1293 + atomic_inc(&rdev->nr_pending); 1294 + blocked_rdev = rdev; 1295 + break; 1296 + } 1297 + if (rrdev && unlikely(test_bit(Blocked, &rrdev->flags))) { 1298 + atomic_inc(&rrdev->nr_pending); 1299 + blocked_rdev = rrdev; 1300 + break; 1301 + } 1302 + 1303 + if (rdev && test_bit(WriteErrorSeen, &rdev->flags)) { 1304 + sector_t first_bad; 1305 + sector_t dev_sector = r10_bio->devs[i].addr; 1306 + int bad_sectors; 1307 + int is_bad; 1308 + 1309 + /* 1310 + * Discard request doesn't care the write result 1311 + * so it doesn't need to wait blocked disk here. 1312 + */ 1313 + if (!r10_bio->sectors) 1314 + continue; 1315 + 1316 + is_bad = is_badblock(rdev, dev_sector, r10_bio->sectors, 1317 + &first_bad, &bad_sectors); 1318 + if (is_bad < 0) { 1319 + /* 1320 + * Mustn't write here until the bad block 1321 + * is acknowledged 1322 + */ 1323 + atomic_inc(&rdev->nr_pending); 1324 + set_bit(BlockedBadBlocks, &rdev->flags); 1325 + blocked_rdev = rdev; 1326 + break; 1327 + } 1328 + } 1329 + } 1330 + rcu_read_unlock(); 1331 + 1332 + if (unlikely(blocked_rdev)) { 1333 + /* Have to wait for this device to get unblocked, then retry */ 1334 + allow_barrier(conf); 1335 + raid10_log(conf->mddev, "%s wait rdev %d blocked", 1336 + __func__, blocked_rdev->raid_disk); 1337 + md_wait_for_blocked_rdev(blocked_rdev, mddev); 1338 + wait_barrier(conf); 1339 + goto retry_wait; 1340 + } 1341 + } 1342 + 1276 1343 static void raid10_write_request(struct mddev *mddev, struct bio *bio, 1277 1344 struct r10bio *r10_bio) 1278 1345 { 1279 1346 struct r10conf *conf = mddev->private; 1280 1347 int i; 1281 - struct md_rdev *blocked_rdev; 1282 1348 sector_t sectors; 1283 1349 int max_sectors; 1284 1350 ··· 1401 1337 1402 1338 r10_bio->read_slot = -1; /* make sure repl_bio gets freed */ 1403 1339 raid10_find_phys(conf, r10_bio); 1404 - retry_write: 1405 - blocked_rdev = NULL; 1340 + 1341 + wait_blocked_dev(mddev, r10_bio); 1342 + 1406 1343 rcu_read_lock(); 1407 1344 max_sectors = r10_bio->sectors; 1408 1345 ··· 1414 1349 conf->mirrors[d].replacement); 1415 1350 if (rdev == rrdev) 1416 1351 rrdev = NULL; 1417 - if (rdev && unlikely(test_bit(Blocked, &rdev->flags))) { 1418 - atomic_inc(&rdev->nr_pending); 1419 - blocked_rdev = rdev; 1420 - break; 1421 - } 1422 - if (rrdev && unlikely(test_bit(Blocked, &rrdev->flags))) { 1423 - atomic_inc(&rrdev->nr_pending); 1424 - blocked_rdev = rrdev; 1425 - break; 1426 - } 1427 1352 if (rdev && (test_bit(Faulty, &rdev->flags))) 1428 1353 rdev = NULL; 1429 1354 if (rrdev && (test_bit(Faulty, &rrdev->flags))) ··· 1434 1379 1435 1380 is_bad = is_badblock(rdev, dev_sector, max_sectors, 1436 1381 &first_bad, &bad_sectors); 1437 - if (is_bad < 0) { 1438 - /* Mustn't write here until the bad block 1439 - * is acknowledged 1440 - */ 1441 - atomic_inc(&rdev->nr_pending); 1442 - set_bit(BlockedBadBlocks, &rdev->flags); 1443 - blocked_rdev = rdev; 1444 - break; 1445 - } 1446 1382 if (is_bad && first_bad <= dev_sector) { 1447 1383 /* Cannot write here at all */ 1448 1384 bad_sectors -= (dev_sector - first_bad); ··· 1468 1422 } 1469 1423 } 1470 1424 rcu_read_unlock(); 1471 - 1472 - if (unlikely(blocked_rdev)) { 1473 - /* Have to wait for this device to get unblocked, then retry */ 1474 - int j; 1475 - int d; 1476 - 1477 - for (j = 0; j < i; j++) { 1478 - if (r10_bio->devs[j].bio) { 1479 - d = r10_bio->devs[j].devnum; 1480 - rdev_dec_pending(conf->mirrors[d].rdev, mddev); 1481 - } 1482 - if (r10_bio->devs[j].repl_bio) { 1483 - struct md_rdev *rdev; 1484 - d = r10_bio->devs[j].devnum; 1485 - rdev = conf->mirrors[d].replacement; 1486 - if (!rdev) { 1487 - /* Race with remove_disk */ 1488 - smp_mb(); 1489 - rdev = conf->mirrors[d].rdev; 1490 - } 1491 - rdev_dec_pending(rdev, mddev); 1492 - } 1493 - } 1494 - allow_barrier(conf); 1495 - raid10_log(conf->mddev, "wait rdev %d blocked", blocked_rdev->raid_disk); 1496 - md_wait_for_blocked_rdev(blocked_rdev, mddev); 1497 - wait_barrier(conf); 1498 - goto retry_write; 1499 - } 1500 1425 1501 1426 if (max_sectors < r10_bio->sectors) 1502 1427 r10_bio->sectors = max_sectors; ··· 1509 1492 r10_bio->sector = bio->bi_iter.bi_sector; 1510 1493 r10_bio->state = 0; 1511 1494 r10_bio->read_slot = -1; 1512 - memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * conf->copies); 1495 + memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * 1496 + conf->geo.raid_disks); 1513 1497 1514 1498 if (bio_data_dir(bio) == READ) 1515 1499 raid10_read_request(mddev, bio, r10_bio); 1516 1500 else 1517 1501 raid10_write_request(mddev, bio, r10_bio); 1502 + } 1503 + 1504 + static void raid_end_discard_bio(struct r10bio *r10bio) 1505 + { 1506 + struct r10conf *conf = r10bio->mddev->private; 1507 + struct r10bio *first_r10bio; 1508 + 1509 + while (atomic_dec_and_test(&r10bio->remaining)) { 1510 + 1511 + allow_barrier(conf); 1512 + 1513 + if (!test_bit(R10BIO_Discard, &r10bio->state)) { 1514 + first_r10bio = (struct r10bio *)r10bio->master_bio; 1515 + free_r10bio(r10bio); 1516 + r10bio = first_r10bio; 1517 + } else { 1518 + md_write_end(r10bio->mddev); 1519 + bio_endio(r10bio->master_bio); 1520 + free_r10bio(r10bio); 1521 + break; 1522 + } 1523 + } 1524 + } 1525 + 1526 + static void raid10_end_discard_request(struct bio *bio) 1527 + { 1528 + struct r10bio *r10_bio = bio->bi_private; 1529 + struct r10conf *conf = r10_bio->mddev->private; 1530 + struct md_rdev *rdev = NULL; 1531 + int dev; 1532 + int slot, repl; 1533 + 1534 + /* 1535 + * We don't care the return value of discard bio 1536 + */ 1537 + if (!test_bit(R10BIO_Uptodate, &r10_bio->state)) 1538 + set_bit(R10BIO_Uptodate, &r10_bio->state); 1539 + 1540 + dev = find_bio_disk(conf, r10_bio, bio, &slot, &repl); 1541 + if (repl) 1542 + rdev = conf->mirrors[dev].replacement; 1543 + if (!rdev) { 1544 + /* 1545 + * raid10_remove_disk uses smp_mb to make sure rdev is set to 1546 + * replacement before setting replacement to NULL. It can read 1547 + * rdev first without barrier protect even replacment is NULL 1548 + */ 1549 + smp_rmb(); 1550 + rdev = conf->mirrors[dev].rdev; 1551 + } 1552 + 1553 + raid_end_discard_bio(r10_bio); 1554 + rdev_dec_pending(rdev, conf->mddev); 1555 + } 1556 + 1557 + /* 1558 + * There are some limitations to handle discard bio 1559 + * 1st, the discard size is bigger than stripe_size*2. 1560 + * 2st, if the discard bio spans reshape progress, we use the old way to 1561 + * handle discard bio 1562 + */ 1563 + static int raid10_handle_discard(struct mddev *mddev, struct bio *bio) 1564 + { 1565 + struct r10conf *conf = mddev->private; 1566 + struct geom *geo = &conf->geo; 1567 + int far_copies = geo->far_copies; 1568 + bool first_copy = true; 1569 + struct r10bio *r10_bio, *first_r10bio; 1570 + struct bio *split; 1571 + int disk; 1572 + sector_t chunk; 1573 + unsigned int stripe_size; 1574 + unsigned int stripe_data_disks; 1575 + sector_t split_size; 1576 + sector_t bio_start, bio_end; 1577 + sector_t first_stripe_index, last_stripe_index; 1578 + sector_t start_disk_offset; 1579 + unsigned int start_disk_index; 1580 + sector_t end_disk_offset; 1581 + unsigned int end_disk_index; 1582 + unsigned int remainder; 1583 + 1584 + if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) 1585 + return -EAGAIN; 1586 + 1587 + wait_barrier(conf); 1588 + 1589 + /* 1590 + * Check reshape again to avoid reshape happens after checking 1591 + * MD_RECOVERY_RESHAPE and before wait_barrier 1592 + */ 1593 + if (test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery)) 1594 + goto out; 1595 + 1596 + if (geo->near_copies) 1597 + stripe_data_disks = geo->raid_disks / geo->near_copies + 1598 + geo->raid_disks % geo->near_copies; 1599 + else 1600 + stripe_data_disks = geo->raid_disks; 1601 + 1602 + stripe_size = stripe_data_disks << geo->chunk_shift; 1603 + 1604 + bio_start = bio->bi_iter.bi_sector; 1605 + bio_end = bio_end_sector(bio); 1606 + 1607 + /* 1608 + * Maybe one discard bio is smaller than strip size or across one 1609 + * stripe and discard region is larger than one stripe size. For far 1610 + * offset layout, if the discard region is not aligned with stripe 1611 + * size, there is hole when we submit discard bio to member disk. 1612 + * For simplicity, we only handle discard bio which discard region 1613 + * is bigger than stripe_size * 2 1614 + */ 1615 + if (bio_sectors(bio) < stripe_size*2) 1616 + goto out; 1617 + 1618 + /* 1619 + * Keep bio aligned with strip size. 1620 + */ 1621 + div_u64_rem(bio_start, stripe_size, &remainder); 1622 + if (remainder) { 1623 + split_size = stripe_size - remainder; 1624 + split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split); 1625 + bio_chain(split, bio); 1626 + allow_barrier(conf); 1627 + /* Resend the fist split part */ 1628 + submit_bio_noacct(split); 1629 + wait_barrier(conf); 1630 + } 1631 + div_u64_rem(bio_end, stripe_size, &remainder); 1632 + if (remainder) { 1633 + split_size = bio_sectors(bio) - remainder; 1634 + split = bio_split(bio, split_size, GFP_NOIO, &conf->bio_split); 1635 + bio_chain(split, bio); 1636 + allow_barrier(conf); 1637 + /* Resend the second split part */ 1638 + submit_bio_noacct(bio); 1639 + bio = split; 1640 + wait_barrier(conf); 1641 + } 1642 + 1643 + bio_start = bio->bi_iter.bi_sector; 1644 + bio_end = bio_end_sector(bio); 1645 + 1646 + /* 1647 + * Raid10 uses chunk as the unit to store data. It's similar like raid0. 1648 + * One stripe contains the chunks from all member disk (one chunk from 1649 + * one disk at the same HBA address). For layout detail, see 'man md 4' 1650 + */ 1651 + chunk = bio_start >> geo->chunk_shift; 1652 + chunk *= geo->near_copies; 1653 + first_stripe_index = chunk; 1654 + start_disk_index = sector_div(first_stripe_index, geo->raid_disks); 1655 + if (geo->far_offset) 1656 + first_stripe_index *= geo->far_copies; 1657 + start_disk_offset = (bio_start & geo->chunk_mask) + 1658 + (first_stripe_index << geo->chunk_shift); 1659 + 1660 + chunk = bio_end >> geo->chunk_shift; 1661 + chunk *= geo->near_copies; 1662 + last_stripe_index = chunk; 1663 + end_disk_index = sector_div(last_stripe_index, geo->raid_disks); 1664 + if (geo->far_offset) 1665 + last_stripe_index *= geo->far_copies; 1666 + end_disk_offset = (bio_end & geo->chunk_mask) + 1667 + (last_stripe_index << geo->chunk_shift); 1668 + 1669 + retry_discard: 1670 + r10_bio = mempool_alloc(&conf->r10bio_pool, GFP_NOIO); 1671 + r10_bio->mddev = mddev; 1672 + r10_bio->state = 0; 1673 + r10_bio->sectors = 0; 1674 + memset(r10_bio->devs, 0, sizeof(r10_bio->devs[0]) * geo->raid_disks); 1675 + wait_blocked_dev(mddev, r10_bio); 1676 + 1677 + /* 1678 + * For far layout it needs more than one r10bio to cover all regions. 1679 + * Inspired by raid10_sync_request, we can use the first r10bio->master_bio 1680 + * to record the discard bio. Other r10bio->master_bio record the first 1681 + * r10bio. The first r10bio only release after all other r10bios finish. 1682 + * The discard bio returns only first r10bio finishes 1683 + */ 1684 + if (first_copy) { 1685 + r10_bio->master_bio = bio; 1686 + set_bit(R10BIO_Discard, &r10_bio->state); 1687 + first_copy = false; 1688 + first_r10bio = r10_bio; 1689 + } else 1690 + r10_bio->master_bio = (struct bio *)first_r10bio; 1691 + 1692 + rcu_read_lock(); 1693 + for (disk = 0; disk < geo->raid_disks; disk++) { 1694 + struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev); 1695 + struct md_rdev *rrdev = rcu_dereference( 1696 + conf->mirrors[disk].replacement); 1697 + 1698 + r10_bio->devs[disk].bio = NULL; 1699 + r10_bio->devs[disk].repl_bio = NULL; 1700 + 1701 + if (rdev && (test_bit(Faulty, &rdev->flags))) 1702 + rdev = NULL; 1703 + if (rrdev && (test_bit(Faulty, &rrdev->flags))) 1704 + rrdev = NULL; 1705 + if (!rdev && !rrdev) 1706 + continue; 1707 + 1708 + if (rdev) { 1709 + r10_bio->devs[disk].bio = bio; 1710 + atomic_inc(&rdev->nr_pending); 1711 + } 1712 + if (rrdev) { 1713 + r10_bio->devs[disk].repl_bio = bio; 1714 + atomic_inc(&rrdev->nr_pending); 1715 + } 1716 + } 1717 + rcu_read_unlock(); 1718 + 1719 + atomic_set(&r10_bio->remaining, 1); 1720 + for (disk = 0; disk < geo->raid_disks; disk++) { 1721 + sector_t dev_start, dev_end; 1722 + struct bio *mbio, *rbio = NULL; 1723 + struct md_rdev *rdev = rcu_dereference(conf->mirrors[disk].rdev); 1724 + struct md_rdev *rrdev = rcu_dereference( 1725 + conf->mirrors[disk].replacement); 1726 + 1727 + /* 1728 + * Now start to calculate the start and end address for each disk. 1729 + * The space between dev_start and dev_end is the discard region. 1730 + * 1731 + * For dev_start, it needs to consider three conditions: 1732 + * 1st, the disk is before start_disk, you can imagine the disk in 1733 + * the next stripe. So the dev_start is the start address of next 1734 + * stripe. 1735 + * 2st, the disk is after start_disk, it means the disk is at the 1736 + * same stripe of first disk 1737 + * 3st, the first disk itself, we can use start_disk_offset directly 1738 + */ 1739 + if (disk < start_disk_index) 1740 + dev_start = (first_stripe_index + 1) * mddev->chunk_sectors; 1741 + else if (disk > start_disk_index) 1742 + dev_start = first_stripe_index * mddev->chunk_sectors; 1743 + else 1744 + dev_start = start_disk_offset; 1745 + 1746 + if (disk < end_disk_index) 1747 + dev_end = (last_stripe_index + 1) * mddev->chunk_sectors; 1748 + else if (disk > end_disk_index) 1749 + dev_end = last_stripe_index * mddev->chunk_sectors; 1750 + else 1751 + dev_end = end_disk_offset; 1752 + 1753 + /* 1754 + * It only handles discard bio which size is >= stripe size, so 1755 + * dev_end > dev_start all the time 1756 + */ 1757 + if (r10_bio->devs[disk].bio) { 1758 + mbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set); 1759 + mbio->bi_end_io = raid10_end_discard_request; 1760 + mbio->bi_private = r10_bio; 1761 + r10_bio->devs[disk].bio = mbio; 1762 + r10_bio->devs[disk].devnum = disk; 1763 + atomic_inc(&r10_bio->remaining); 1764 + md_submit_discard_bio(mddev, rdev, mbio, 1765 + dev_start + choose_data_offset(r10_bio, rdev), 1766 + dev_end - dev_start); 1767 + bio_endio(mbio); 1768 + } 1769 + if (r10_bio->devs[disk].repl_bio) { 1770 + rbio = bio_clone_fast(bio, GFP_NOIO, &mddev->bio_set); 1771 + rbio->bi_end_io = raid10_end_discard_request; 1772 + rbio->bi_private = r10_bio; 1773 + r10_bio->devs[disk].repl_bio = rbio; 1774 + r10_bio->devs[disk].devnum = disk; 1775 + atomic_inc(&r10_bio->remaining); 1776 + md_submit_discard_bio(mddev, rrdev, rbio, 1777 + dev_start + choose_data_offset(r10_bio, rrdev), 1778 + dev_end - dev_start); 1779 + bio_endio(rbio); 1780 + } 1781 + } 1782 + 1783 + if (!geo->far_offset && --far_copies) { 1784 + first_stripe_index += geo->stride >> geo->chunk_shift; 1785 + start_disk_offset += geo->stride; 1786 + last_stripe_index += geo->stride >> geo->chunk_shift; 1787 + end_disk_offset += geo->stride; 1788 + atomic_inc(&first_r10bio->remaining); 1789 + raid_end_discard_bio(r10_bio); 1790 + wait_barrier(conf); 1791 + goto retry_discard; 1792 + } 1793 + 1794 + raid_end_discard_bio(r10_bio); 1795 + 1796 + return 0; 1797 + out: 1798 + allow_barrier(conf); 1799 + return -EAGAIN; 1518 1800 } 1519 1801 1520 1802 static bool raid10_make_request(struct mddev *mddev, struct bio *bio) ··· 1829 1513 1830 1514 if (!md_write_start(mddev, bio)) 1831 1515 return false; 1516 + 1517 + if (unlikely(bio_op(bio) == REQ_OP_DISCARD)) 1518 + if (!raid10_handle_discard(mddev, bio)) 1519 + return true; 1832 1520 1833 1521 /* 1834 1522 * If this request crosses a chunk boundary, we need to split ··· 4073 3753 4074 3754 if (mddev->queue) { 4075 3755 blk_queue_max_discard_sectors(mddev->queue, 4076 - mddev->chunk_sectors); 3756 + UINT_MAX); 4077 3757 blk_queue_max_write_same_sectors(mddev->queue, 0); 4078 3758 blk_queue_max_write_zeroes_sectors(mddev->queue, 0); 4079 3759 blk_queue_io_min(mddev->queue, mddev->chunk_sectors << 9);
+1
drivers/md/raid10.h
··· 179 179 R10BIO_Previous, 180 180 /* failfast devices did receive failfast requests. */ 181 181 R10BIO_FailFast, 182 + R10BIO_Discard, 182 183 }; 183 184 #endif