]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - fs/block_dev.c
Merge tag 'armsoc-dt64' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[mirror_ubuntu-zesty-kernel.git] / fs / block_dev.c
index d878e4860fb7cb60b8588e5cc43837cec5ec6f58..ba762ea07f679c9bafd078bb316270a38e9a7d80 100644 (file)
@@ -400,7 +400,7 @@ int bdev_read_page(struct block_device *bdev, sector_t sector,
        if (!ops->rw_page || bdev_get_integrity(bdev))
                return result;
 
-       result = blk_queue_enter(bdev->bd_queue, GFP_KERNEL);
+       result = blk_queue_enter(bdev->bd_queue, false);
        if (result)
                return result;
        result = ops->rw_page(bdev, sector + get_start_sect(bdev), page, READ);
@@ -437,7 +437,7 @@ int bdev_write_page(struct block_device *bdev, sector_t sector,
 
        if (!ops->rw_page || bdev_get_integrity(bdev))
                return -EOPNOTSUPP;
-       result = blk_queue_enter(bdev->bd_queue, GFP_KERNEL);
+       result = blk_queue_enter(bdev->bd_queue, false);
        if (result)
                return result;
 
@@ -455,10 +455,7 @@ EXPORT_SYMBOL_GPL(bdev_write_page);
 /**
  * bdev_direct_access() - Get the address for directly-accessibly memory
  * @bdev: The device containing the memory
- * @sector: The offset within the device
- * @addr: Where to put the address of the memory
- * @pfn: The Page Frame Number for the memory
- * @size: The number of bytes requested
+ * @dax: control and output parameters for ->direct_access
  *
  * If a block device is made up of directly addressable memory, this function
  * will tell the caller the PFN and the address of the memory.  The address
@@ -469,10 +466,10 @@ EXPORT_SYMBOL_GPL(bdev_write_page);
  * Return: negative errno if an error occurs, otherwise the number of bytes
  * accessible at this address.
  */
-long bdev_direct_access(struct block_device *bdev, sector_t sector,
-                       void __pmem **addr, unsigned long *pfn, long size)
+long bdev_direct_access(struct block_device *bdev, struct blk_dax_ctl *dax)
 {
-       long avail;
+       sector_t sector = dax->sector;
+       long avail, size = dax->size;
        const struct block_device_operations *ops = bdev->bd_disk->fops;
 
        /*
@@ -491,9 +488,11 @@ long bdev_direct_access(struct block_device *bdev, sector_t sector,
        sector += get_start_sect(bdev);
        if (sector % (PAGE_SIZE / 512))
                return -EINVAL;
-       avail = ops->direct_access(bdev, sector, addr, pfn);
+       avail = ops->direct_access(bdev, sector, &dax->addr, &dax->pfn);
        if (!avail)
                return -ERANGE;
+       if (avail > 0 && avail & ~PAGE_MASK)
+               return -ENXIO;
        return min(avail, size);
 }
 EXPORT_SYMBOL_GPL(bdev_direct_access);
@@ -595,7 +594,7 @@ void __init bdev_cache_init(void)
 
        bdev_cachep = kmem_cache_create("bdev_cache", sizeof(struct bdev_inode),
                        0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
-                               SLAB_MEM_SPREAD|SLAB_PANIC),
+                               SLAB_MEM_SPREAD|SLAB_ACCOUNT|SLAB_PANIC),
                        init_once);
        err = register_filesystem(&bd_type);
        if (err)
@@ -701,7 +700,7 @@ static struct block_device *bd_acquire(struct inode *inode)
        spin_lock(&bdev_lock);
        bdev = inode->i_bdev;
        if (bdev) {
-               ihold(bdev->bd_inode);
+               bdgrab(bdev);
                spin_unlock(&bdev_lock);
                return bdev;
        }
@@ -717,7 +716,7 @@ static struct block_device *bd_acquire(struct inode *inode)
                         * So, we can access it via ->i_mapping always
                         * without igrab().
                         */
-                       ihold(bdev->bd_inode);
+                       bdgrab(bdev);
                        inode->i_bdev = bdev;
                        inode->i_mapping = bdev->bd_inode->i_mapping;
                        list_add(&inode->i_devices, &bdev->bd_inodes);
@@ -740,7 +739,7 @@ void bd_forget(struct inode *inode)
        spin_unlock(&bdev_lock);
 
        if (bdev)
-               iput(bdev->bd_inode);
+               bdput(bdev);
 }
 
 /**