Merge branch 'for-4.2/drivers' of git://git.kernel.dk/linux-block
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 25 Jun 2015 22:12:50 +0000 (15:12 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 25 Jun 2015 22:12:50 +0000 (15:12 -0700)
Pull block driver updates from Jens Axboe:
 "This contains:

   - a few race fixes for null_blk, from Akinobu Mita.

   - a series of fixes for mtip32xx, from Asai Thambi and Selvan Mani at
     Micron.

   - NVMe:
        * Fix for missing error return on allocation failure, from Axel
          Lin.

        * Code consolidation and cleanups from Christoph.

        * Memory barrier addition, syncing queue count and queue
          pointers. From Jon Derrick.

        * Various fixes from Keith, an addition to support user
          issue reset from sysfs or ioctl, and automatic namespace
          rescan.

        * Fix from Matias, avoiding losing some request flags when
          marking the request failfast.

   - small cleanups and sparse fixups for ps3vram.  From Geert
     Uytterhoeven and Geoff Lavand.

   - s390/dasd dead code removal, from Jarod Wilson.

   - a set of fixes and optimizations for loop, from Ming Lei.

   - conversion to blkdev_reread_part() of loop, dasd, ndb.  From Ming
     Lei.

   - updates to cciss.  From Tomas Henzl"

* 'for-4.2/drivers' of git://git.kernel.dk/linux-block: (44 commits)
  mtip32xx: Fix accessing freed memory
  block: nvme-scsi: Catch kcalloc failure
  NVMe: Fix IO for extended metadata formats
  nvme: don't overwrite req->cmd_flags on sync cmd
  mtip32xx: increase wait time for hba reset
  mtip32xx: fix minor number
  mtip32xx: remove unnecessary sleep in mtip_ftl_rebuild_poll()
  mtip32xx: fix crash on surprise removal of the drive
  mtip32xx: Abort I/O during secure erase operation
  mtip32xx: fix incorrectly setting MTIP_DDF_SEC_LOCK_BIT
  mtip32xx: remove unused variable 'port->allocated'
  mtip32xx: fix rmmod issue
  MAINTAINERS: Update ps3vram block driver
  block/ps3vram: Remove obsolete reference to MTD
  block/ps3vram: Fix sparse warnings
  NVMe: Automatic namespace rescan
  NVMe: Memory barrier before queue_count is incremented
  NVMe: add sysfs and ioctl controller reset
  null_blk: restart request processing on completion handler
  null_blk: prevent timer handler running on a different CPU where started
  ...

1  2 
MAINTAINERS
drivers/block/loop.c
drivers/block/nvme-core.c
drivers/block/nvme-scsi.c

diff --cc MAINTAINERS
@@@ -7982,7 -7852,9 +7982,8 @@@ F:      sound/ppc/snd_ps3
  
  PS3VRAM DRIVER
  M:    Jim Paris <jim@jtan.com>
+ M:    Geoff Levand <geoff@infradead.org>
  L:    linuxppc-dev@lists.ozlabs.org
 -L:    cbe-oss-dev@lists.ozlabs.org
  S:    Maintained
  F:    drivers/block/ps3vram.c
  
Simple merge
@@@ -1745,12 -1727,10 +1727,11 @@@ static int nvme_submit_io(struct nvme_n
        struct nvme_dev *dev = ns->dev;
        struct nvme_user_io io;
        struct nvme_command c;
-       unsigned length, meta_len, prp_len;
+       unsigned length, meta_len;
        int status, write;
-       struct nvme_iod *iod;
        dma_addr_t meta_dma = 0;
        void *meta = NULL;
 +      void __user *metadata;
  
        if (copy_from_user(&io, uio, sizeof(io)))
                return -EFAULT;
                return -EINVAL;
        }
  
-       if (IS_ERR(iod))
-               return PTR_ERR(iod);
+       length = (io.nblocks + 1) << ns->lba_shift;
+       meta_len = (io.nblocks + 1) * ns->ms;
++      metadata = (void __user *)(unsigned long)io.metadata;
+       write = io.opcode & 1;
  
-       prp_len = nvme_setup_prps(dev, iod, length, GFP_KERNEL);
-       if (length != prp_len) {
-               status = -ENOMEM;
-               goto unmap;
+       if (ns->ext) {
+               length += meta_len;
+               meta_len = 0;
        }
        if (meta_len) {
-               meta = dma_alloc_coherent(&dev->pci_dev->dev, meta_len,
+               if (((io.metadata & 3) || !io.metadata) && !ns->ext)
+                       return -EINVAL;
+               meta = dma_alloc_coherent(dev->dev, meta_len,
                                                &meta_dma, GFP_KERNEL);
 +
                if (!meta) {
                        status = -ENOMEM;
                        goto unmap;
        c.rw.reftag = cpu_to_le32(io.reftag);
        c.rw.apptag = cpu_to_le16(io.apptag);
        c.rw.appmask = cpu_to_le16(io.appmask);
-       c.rw.prp1 = cpu_to_le64(sg_dma_address(iod->sg));
-       c.rw.prp2 = cpu_to_le64(iod->first_dma);
        c.rw.metadata = cpu_to_le64(meta_dma);
-       status = nvme_submit_io_cmd(dev, ns, &c, NULL);
+       status = __nvme_submit_sync_cmd(ns->queue, &c, NULL,
+                       (void __user *)io.addr, length, NULL, 0);
   unmap:
-       nvme_unmap_user_pages(dev, write, iod);
-       nvme_free_iod(dev, iod);
        if (meta) {
                if (status == NVME_SC_SUCCESS && !write) {
 -                      if (copy_to_user((void __user *)io.metadata, meta,
 -                                                              meta_len))
 +                      if (copy_to_user(metadata, meta, meta_len))
                                status = -EFAULT;
                }
-               dma_free_coherent(&dev->pci_dev->dev, meta_len, meta, meta_dma);
+               dma_free_coherent(dev->dev, meta_len, meta, meta_dma);
        }
        return status;
  }
@@@ -2253,12 -1832,11 +1833,12 @@@ static int nvme_trans_inquiry(struct nv
        int alloc_len;
        u8 *inq_response;
  
-       evpd = GET_INQ_EVPD_BIT(cmd);
-       page_code = GET_INQ_PAGE_CODE(cmd);
-       alloc_len = GET_INQ_ALLOC_LENGTH(cmd);
+       evpd = cmd[1] & 0x01;
+       page_code = cmd[2];
+       alloc_len = get_unaligned_be16(&cmd[3]);
  
 -      inq_response = kmalloc(alloc_len, GFP_KERNEL);
 +      inq_response = kmalloc(max(alloc_len, STANDARD_INQUIRY_LENGTH),
 +                              GFP_KERNEL);
        if (inq_response == NULL) {
                res = -ENOMEM;
                goto out_mem;