Merge tag 'for-linus-20180920' of git://git.kernel.dk/linux-block
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Sep 2018 07:41:05 +0000 (09:41 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 21 Sep 2018 07:41:05 +0000 (09:41 +0200)
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

1  2 
drivers/ata/libata-core.c

index 599e01bcdef22b7064853b30b31ad5f3e6a9b432,3893f9bde1e6bc0db2f081943b74233989366540..a9dd4ea7467df60912baca1fd7ebfeb91c9d2988
@@@ -5359,10 -5359,20 +5359,20 @@@ void ata_qc_complete(struct ata_queued_
   */
  int ata_qc_complete_multiple(struct ata_port *ap, u64 qc_active)
  {
+       u64 done_mask, ap_qc_active = ap->qc_active;
        int nr_done = 0;
-       u64 done_mask;
  
-       done_mask = ap->qc_active ^ qc_active;
+       /*
+        * If the internal tag is set on ap->qc_active, then we care about
+        * bit0 on the passed in qc_active mask. Move that bit up to match
+        * the internal tag.
+        */
+       if (ap_qc_active & (1ULL << ATA_TAG_INTERNAL)) {
+               qc_active |= (qc_active & 0x01) << ATA_TAG_INTERNAL;
+               qc_active ^= qc_active & 0x01;
+       }
+       done_mask = ap_qc_active ^ qc_active;
  
        if (unlikely(done_mask & qc_active)) {
                ata_port_err(ap, "illegal qc_active transition (%08llx->%08llx)\n",
@@@ -7394,4 -7404,4 +7404,4 @@@ EXPORT_SYMBOL_GPL(ata_cable_unknown)
  EXPORT_SYMBOL_GPL(ata_cable_ignore);
  EXPORT_SYMBOL_GPL(ata_cable_sata);
  EXPORT_SYMBOL_GPL(ata_host_get);
 -EXPORT_SYMBOL_GPL(ata_host_put);
 +EXPORT_SYMBOL_GPL(ata_host_put);