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 'ata-6.14-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux

Pull more ata updates from Niklas Cassel:

- Add ATA_QUIRK_NOLPM for Samsung SSD 870 QVO drives (Daniel)

- Ensure that PIO transfers using libata-sff cannot write outside the
allocated buffer (me)

* tag 'ata-6.14-rc1-part2' of git://git.kernel.org/pub/scm/linux/kernel/git/libata/linux:
ata: libata-sff: Ensure that we cannot write outside the allocated buffer
ata: libata-core: Add ATA_QUIRK_NOLPM for Samsung SSD 870 QVO drives

+14 -8
+4
drivers/ata/libata-core.c
··· 4143 4143 { "Samsung SSD 860*", NULL, ATA_QUIRK_NO_NCQ_TRIM | 4144 4144 ATA_QUIRK_ZERO_AFTER_TRIM | 4145 4145 ATA_QUIRK_NO_NCQ_ON_ATI }, 4146 + { "Samsung SSD 870 QVO*", NULL, ATA_QUIRK_NO_NCQ_TRIM | 4147 + ATA_QUIRK_ZERO_AFTER_TRIM | 4148 + ATA_QUIRK_NO_NCQ_ON_ATI | 4149 + ATA_QUIRK_NOLPM }, 4146 4150 { "Samsung SSD 870*", NULL, ATA_QUIRK_NO_NCQ_TRIM | 4147 4151 ATA_QUIRK_ZERO_AFTER_TRIM | 4148 4152 ATA_QUIRK_NO_NCQ_ON_ATI },
+10 -8
drivers/ata/libata-sff.c
··· 601 601 { 602 602 struct ata_port *ap = qc->ap; 603 603 struct page *page; 604 - unsigned int offset; 604 + unsigned int offset, count; 605 605 606 606 if (!qc->cursg) { 607 607 qc->curbytes = qc->nbytes; ··· 617 617 page = nth_page(page, (offset >> PAGE_SHIFT)); 618 618 offset %= PAGE_SIZE; 619 619 620 - trace_ata_sff_pio_transfer_data(qc, offset, qc->sect_size); 620 + /* don't overrun current sg */ 621 + count = min(qc->cursg->length - qc->cursg_ofs, qc->sect_size); 622 + 623 + trace_ata_sff_pio_transfer_data(qc, offset, count); 621 624 622 625 /* 623 626 * Split the transfer when it splits a page boundary. Note that the 624 627 * split still has to be dword aligned like all ATA data transfers. 625 628 */ 626 629 WARN_ON_ONCE(offset % 4); 627 - if (offset + qc->sect_size > PAGE_SIZE) { 630 + if (offset + count > PAGE_SIZE) { 628 631 unsigned int split_len = PAGE_SIZE - offset; 629 632 630 633 ata_pio_xfer(qc, page, offset, split_len); 631 - ata_pio_xfer(qc, nth_page(page, 1), 0, 632 - qc->sect_size - split_len); 634 + ata_pio_xfer(qc, nth_page(page, 1), 0, count - split_len); 633 635 } else { 634 - ata_pio_xfer(qc, page, offset, qc->sect_size); 636 + ata_pio_xfer(qc, page, offset, count); 635 637 } 636 638 637 - qc->curbytes += qc->sect_size; 638 - qc->cursg_ofs += qc->sect_size; 639 + qc->curbytes += count; 640 + qc->cursg_ofs += count; 639 641 640 642 if (qc->cursg_ofs == qc->cursg->length) { 641 643 qc->cursg = sg_next(qc->cursg);