diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-09-21 03:41:05 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-09-21 03:41:05 -0400 |
commit | 211b100a5ceda9d1856a3f84334f9ca5f680b638 (patch) | |
tree | 551ec1760c5037e4ef27c36a56667f500137c392 /drivers/ata | |
parent | a38fd7d808e6a9dcc8fac30fc870ccb88ce07221 (diff) | |
parent | d611aaf336b2e8e81f98490eabf7b92889b15319 (diff) |
Merge tag 'for-linus-20180920' of git://git.kernel.dk/linux-block
Jens writes:
"Storage fixes for 4.19-rc5
- Fix for leaking kernel pointer in floppy ioctl (Andy Whitcroft)
- NVMe pull request from Christoph, and a single ANA log page fix
(Hannes)
- Regression fix for libata qd32 support, where we trigger an illegal
active command transition. This fixes a CD-ROM detection issue that
was reported, but could also trigger premature completion of the
internal tag (me)"
* tag 'for-linus-20180920' of git://git.kernel.dk/linux-block:
floppy: Do not copy a kernel pointer to user memory in FDGETPRM ioctl
libata: mask swap internal and hardware tag
nvme: count all ANA groups for ANA Log page
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libata-core.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 599e01bcdef2..a9dd4ea7467d 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -5359,10 +5359,20 @@ void ata_qc_complete(struct ata_queued_cmd *qc) | |||
5359 | */ | 5359 | */ |
5360 | int ata_qc_complete_multiple(struct ata_port *ap, u64 qc_active) | 5360 | int ata_qc_complete_multiple(struct ata_port *ap, u64 qc_active) |
5361 | { | 5361 | { |
5362 | u64 done_mask, ap_qc_active = ap->qc_active; | ||
5362 | int nr_done = 0; | 5363 | int nr_done = 0; |
5363 | u64 done_mask; | ||
5364 | 5364 | ||
5365 | done_mask = ap->qc_active ^ qc_active; | 5365 | /* |
5366 | * If the internal tag is set on ap->qc_active, then we care about | ||
5367 | * bit0 on the passed in qc_active mask. Move that bit up to match | ||
5368 | * the internal tag. | ||
5369 | */ | ||
5370 | if (ap_qc_active & (1ULL << ATA_TAG_INTERNAL)) { | ||
5371 | qc_active |= (qc_active & 0x01) << ATA_TAG_INTERNAL; | ||
5372 | qc_active ^= qc_active & 0x01; | ||
5373 | } | ||
5374 | |||
5375 | done_mask = ap_qc_active ^ qc_active; | ||
5366 | 5376 | ||
5367 | if (unlikely(done_mask & qc_active)) { | 5377 | if (unlikely(done_mask & qc_active)) { |
5368 | ata_port_err(ap, "illegal qc_active transition (%08llx->%08llx)\n", | 5378 | ata_port_err(ap, "illegal qc_active transition (%08llx->%08llx)\n", |