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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'block-6.11-20240824' of git://git.kernel.dk/linux

Pull block fixes from Jens Axboe:

- Fix corruption issues with s390/dasd (Eric, Stefan)

- Fix a misuse of non irq locking grab of a lock (Li)

- MD pull request with a single data corruption fix for raid1 (Yu)

* tag 'block-6.11-20240824' of git://git.kernel.dk/linux:
block: Fix lockdep warning in blk_mq_mark_tag_wait
md/raid1: Fix data corruption for degraded array with slow disk
s390/dasd: fix error recovery leading to data corruption on ESE devices
s390/dasd: Remove DMA alignment

+64 -61
+3 -2
block/blk-mq-tag.c
··· 38 38 void __blk_mq_tag_busy(struct blk_mq_hw_ctx *hctx) 39 39 { 40 40 unsigned int users; 41 + unsigned long flags; 41 42 struct blk_mq_tags *tags = hctx->tags; 42 43 43 44 /* ··· 57 56 return; 58 57 } 59 58 60 - spin_lock_irq(&tags->lock); 59 + spin_lock_irqsave(&tags->lock, flags); 61 60 users = tags->active_queues + 1; 62 61 WRITE_ONCE(tags->active_queues, users); 63 62 blk_mq_update_wake_batch(tags, users); 64 - spin_unlock_irq(&tags->lock); 63 + spin_unlock_irqrestore(&tags->lock, flags); 65 64 } 66 65 67 66 /*
+10 -4
drivers/md/raid1.c
··· 617 617 return -1; 618 618 } 619 619 620 + static bool rdev_in_recovery(struct md_rdev *rdev, struct r1bio *r1_bio) 621 + { 622 + return !test_bit(In_sync, &rdev->flags) && 623 + rdev->recovery_offset < r1_bio->sector + r1_bio->sectors; 624 + } 625 + 620 626 static int choose_bb_rdev(struct r1conf *conf, struct r1bio *r1_bio, 621 627 int *max_sectors) 622 628 { ··· 641 635 642 636 rdev = conf->mirrors[disk].rdev; 643 637 if (!rdev || test_bit(Faulty, &rdev->flags) || 638 + rdev_in_recovery(rdev, r1_bio) || 644 639 test_bit(WriteMostly, &rdev->flags)) 645 640 continue; 646 641 ··· 680 673 681 674 rdev = conf->mirrors[disk].rdev; 682 675 if (!rdev || test_bit(Faulty, &rdev->flags) || 683 - !test_bit(WriteMostly, &rdev->flags)) 676 + !test_bit(WriteMostly, &rdev->flags) || 677 + rdev_in_recovery(rdev, r1_bio)) 684 678 continue; 685 679 686 680 /* there are no bad blocks, we can use this disk */ ··· 741 733 if (!rdev || test_bit(Faulty, &rdev->flags)) 742 734 return false; 743 735 744 - /* still in recovery */ 745 - if (!test_bit(In_sync, &rdev->flags) && 746 - rdev->recovery_offset < r1_bio->sector + r1_bio->sectors) 736 + if (rdev_in_recovery(rdev, r1_bio)) 747 737 return false; 748 738 749 739 /* don't read from slow disk unless have to */
+23 -13
drivers/s390/block/dasd.c
··· 1601 1601 if (!sense) 1602 1602 return 0; 1603 1603 1604 - return !!(sense[1] & SNS1_NO_REC_FOUND) || 1605 - !!(sense[1] & SNS1_FILE_PROTECTED) || 1606 - scsw_cstat(&irb->scsw) == SCHN_STAT_INCORR_LEN; 1604 + if (sense[1] & SNS1_NO_REC_FOUND) 1605 + return 1; 1606 + 1607 + if ((sense[1] & SNS1_INV_TRACK_FORMAT) && 1608 + scsw_is_tm(&irb->scsw) && 1609 + !(sense[2] & SNS2_ENV_DATA_PRESENT)) 1610 + return 1; 1611 + 1612 + return 0; 1607 1613 } 1608 1614 1609 1615 static int dasd_ese_oos_cond(u8 *sense) ··· 1630 1624 struct dasd_device *device; 1631 1625 unsigned long now; 1632 1626 int nrf_suppressed = 0; 1633 - int fp_suppressed = 0; 1627 + int it_suppressed = 0; 1634 1628 struct request *req; 1635 1629 u8 *sense = NULL; 1636 1630 int expires; ··· 1685 1679 */ 1686 1680 sense = dasd_get_sense(irb); 1687 1681 if (sense) { 1688 - fp_suppressed = (sense[1] & SNS1_FILE_PROTECTED) && 1689 - test_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags); 1682 + it_suppressed = (sense[1] & SNS1_INV_TRACK_FORMAT) && 1683 + !(sense[2] & SNS2_ENV_DATA_PRESENT) && 1684 + test_bit(DASD_CQR_SUPPRESS_IT, &cqr->flags); 1690 1685 nrf_suppressed = (sense[1] & SNS1_NO_REC_FOUND) && 1691 1686 test_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); 1692 1687 ··· 1702 1695 return; 1703 1696 } 1704 1697 } 1705 - if (!(fp_suppressed || nrf_suppressed)) 1698 + if (!(it_suppressed || nrf_suppressed)) 1706 1699 device->discipline->dump_sense_dbf(device, irb, "int"); 1707 1700 1708 1701 if (device->features & DASD_FEATURE_ERPLOG) ··· 2466 2459 rc = 0; 2467 2460 list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) { 2468 2461 /* 2469 - * In some cases the 'File Protected' or 'Incorrect Length' 2470 - * error might be expected and error recovery would be 2471 - * unnecessary in these cases. Check if the according suppress 2472 - * bit is set. 2462 + * In some cases certain errors might be expected and 2463 + * error recovery would be unnecessary in these cases. 2464 + * Check if the according suppress bit is set. 2473 2465 */ 2474 2466 sense = dasd_get_sense(&cqr->irb); 2475 - if (sense && sense[1] & SNS1_FILE_PROTECTED && 2476 - test_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags)) 2467 + if (sense && (sense[1] & SNS1_INV_TRACK_FORMAT) && 2468 + !(sense[2] & SNS2_ENV_DATA_PRESENT) && 2469 + test_bit(DASD_CQR_SUPPRESS_IT, &cqr->flags)) 2470 + continue; 2471 + if (sense && (sense[1] & SNS1_NO_REC_FOUND) && 2472 + test_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags)) 2477 2473 continue; 2478 2474 if (scsw_cstat(&cqr->irb.scsw) == 0x40 && 2479 2475 test_bit(DASD_CQR_SUPPRESS_IL, &cqr->flags))
+2 -8
drivers/s390/block/dasd_3990_erp.c
··· 1386 1386 1387 1387 struct dasd_device *device = erp->startdev; 1388 1388 1389 - /* 1390 - * In some cases the 'File Protected' error might be expected and 1391 - * log messages shouldn't be written then. 1392 - * Check if the according suppress bit is set. 1393 - */ 1394 - if (!test_bit(DASD_CQR_SUPPRESS_FP, &erp->flags)) 1395 - dev_err(&device->cdev->dev, 1396 - "Accessing the DASD failed because of a hardware error\n"); 1389 + dev_err(&device->cdev->dev, 1390 + "Accessing the DASD failed because of a hardware error\n"); 1397 1391 1398 1392 return dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED); 1399 1393
+25 -32
drivers/s390/block/dasd_eckd.c
··· 2275 2275 cqr->status = DASD_CQR_FILLED; 2276 2276 /* Set flags to suppress output for expected errors */ 2277 2277 set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); 2278 + set_bit(DASD_CQR_SUPPRESS_IT, &cqr->flags); 2278 2279 2279 2280 return cqr; 2280 2281 } ··· 2557 2556 cqr->buildclk = get_tod_clock(); 2558 2557 cqr->status = DASD_CQR_FILLED; 2559 2558 /* Set flags to suppress output for expected errors */ 2560 - set_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags); 2561 2559 set_bit(DASD_CQR_SUPPRESS_IL, &cqr->flags); 2562 2560 2563 2561 return cqr; ··· 4130 4130 4131 4131 /* Set flags to suppress output for expected errors */ 4132 4132 if (dasd_eckd_is_ese(basedev)) { 4133 - set_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags); 4134 - set_bit(DASD_CQR_SUPPRESS_IL, &cqr->flags); 4135 4133 set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); 4136 4134 } 4137 4135 ··· 4631 4633 4632 4634 /* Set flags to suppress output for expected errors */ 4633 4635 if (dasd_eckd_is_ese(basedev)) { 4634 - set_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags); 4635 - set_bit(DASD_CQR_SUPPRESS_IL, &cqr->flags); 4636 4636 set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); 4637 + set_bit(DASD_CQR_SUPPRESS_IT, &cqr->flags); 4637 4638 } 4638 4639 4639 4640 return cqr; ··· 5777 5780 { 5778 5781 u8 *sense = dasd_get_sense(irb); 5779 5782 5780 - if (scsw_is_tm(&irb->scsw)) { 5781 - /* 5782 - * In some cases the 'File Protected' or 'Incorrect Length' 5783 - * error might be expected and log messages shouldn't be written 5784 - * then. Check if the according suppress bit is set. 5785 - */ 5786 - if (sense && (sense[1] & SNS1_FILE_PROTECTED) && 5787 - test_bit(DASD_CQR_SUPPRESS_FP, &req->flags)) 5788 - return; 5789 - if (scsw_cstat(&irb->scsw) == 0x40 && 5790 - test_bit(DASD_CQR_SUPPRESS_IL, &req->flags)) 5791 - return; 5783 + /* 5784 + * In some cases certain errors might be expected and 5785 + * log messages shouldn't be written then. 5786 + * Check if the according suppress bit is set. 5787 + */ 5788 + if (sense && (sense[1] & SNS1_INV_TRACK_FORMAT) && 5789 + !(sense[2] & SNS2_ENV_DATA_PRESENT) && 5790 + test_bit(DASD_CQR_SUPPRESS_IT, &req->flags)) 5791 + return; 5792 5792 5793 + if (sense && sense[0] & SNS0_CMD_REJECT && 5794 + test_bit(DASD_CQR_SUPPRESS_CR, &req->flags)) 5795 + return; 5796 + 5797 + if (sense && sense[1] & SNS1_NO_REC_FOUND && 5798 + test_bit(DASD_CQR_SUPPRESS_NRF, &req->flags)) 5799 + return; 5800 + 5801 + if (scsw_cstat(&irb->scsw) == 0x40 && 5802 + test_bit(DASD_CQR_SUPPRESS_IL, &req->flags)) 5803 + return; 5804 + 5805 + if (scsw_is_tm(&irb->scsw)) 5793 5806 dasd_eckd_dump_sense_tcw(device, req, irb); 5794 - } else { 5795 - /* 5796 - * In some cases the 'Command Reject' or 'No Record Found' 5797 - * error might be expected and log messages shouldn't be 5798 - * written then. Check if the according suppress bit is set. 5799 - */ 5800 - if (sense && sense[0] & SNS0_CMD_REJECT && 5801 - test_bit(DASD_CQR_SUPPRESS_CR, &req->flags)) 5802 - return; 5803 - 5804 - if (sense && sense[1] & SNS1_NO_REC_FOUND && 5805 - test_bit(DASD_CQR_SUPPRESS_NRF, &req->flags)) 5806 - return; 5807 - 5807 + else 5808 5808 dasd_eckd_dump_sense_ccw(device, req, irb); 5809 - } 5810 5809 } 5811 5810 5812 5811 static int dasd_eckd_reload_device(struct dasd_device *device)
-1
drivers/s390/block/dasd_genhd.c
··· 41 41 */ 42 42 .max_segment_size = PAGE_SIZE, 43 43 .seg_boundary_mask = PAGE_SIZE - 1, 44 - .dma_alignment = PAGE_SIZE - 1, 45 44 .max_segments = USHRT_MAX, 46 45 }; 47 46 struct gendisk *gdp;
+1 -1
drivers/s390/block/dasd_int.h
··· 196 196 * The following flags are used to suppress output of certain errors. 197 197 */ 198 198 #define DASD_CQR_SUPPRESS_NRF 4 /* Suppress 'No Record Found' error */ 199 - #define DASD_CQR_SUPPRESS_FP 5 /* Suppress 'File Protected' error*/ 199 + #define DASD_CQR_SUPPRESS_IT 5 /* Suppress 'Invalid Track' error*/ 200 200 #define DASD_CQR_SUPPRESS_IL 6 /* Suppress 'Incorrect Length' error */ 201 201 #define DASD_CQR_SUPPRESS_CR 7 /* Suppress 'Command Reject' error */ 202 202