block, dax: convert bdev_dax_supported() to dax_direct_access()
authorDan Williams <dan.j.williams@intel.com>
Sat, 1 Apr 2017 23:02:38 +0000 (16:02 -0700)
committerDan Williams <dan.j.williams@intel.com>
Tue, 25 Apr 2017 20:20:46 +0000 (13:20 -0700)
Kill of the final user of bdev_direct_access() and struct blk_dax_ctl.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
fs/block_dev.c

index 2f78857..ecbdc8f 100644 (file)
@@ -788,35 +788,43 @@ EXPORT_SYMBOL(bdev_dax_pgoff);
  */
 int bdev_dax_supported(struct super_block *sb, int blocksize)
 {
-       struct blk_dax_ctl dax = {
-               .sector = 0,
-               .size = PAGE_SIZE,
-       };
-       int err;
+       struct block_device *bdev = sb->s_bdev;
+       struct dax_device *dax_dev;
+       pgoff_t pgoff;
+       int err, id;
+       void *kaddr;
+       pfn_t pfn;
+       long len;
 
        if (blocksize != PAGE_SIZE) {
                vfs_msg(sb, KERN_ERR, "error: unsupported blocksize for dax");
                return -EINVAL;
        }
 
-       err = bdev_direct_access(sb->s_bdev, &dax);
-       if (err < 0) {
-               switch (err) {
-               case -EOPNOTSUPP:
-                       vfs_msg(sb, KERN_ERR,
-                               "error: device does not support dax");
-                       break;
-               case -EINVAL:
-                       vfs_msg(sb, KERN_ERR,
-                               "error: unaligned partition for dax");
-                       break;
-               default:
-                       vfs_msg(sb, KERN_ERR,
-                               "error: dax access failed (%d)", err);
-               }
+       err = bdev_dax_pgoff(bdev, 0, PAGE_SIZE, &pgoff);
+       if (err) {
+               vfs_msg(sb, KERN_ERR, "error: unaligned partition for dax");
                return err;
        }
 
+       dax_dev = dax_get_by_host(bdev->bd_disk->disk_name);
+       if (!dax_dev) {
+               vfs_msg(sb, KERN_ERR, "error: device does not support dax");
+               return -EOPNOTSUPP;
+       }
+
+       id = dax_read_lock();
+       len = dax_direct_access(dax_dev, pgoff, 1, &kaddr, &pfn);
+       dax_read_unlock(id);
+
+       put_dax(dax_dev);
+
+       if (len < 1) {
+               vfs_msg(sb, KERN_ERR,
+                               "error: dax access failed (%d)", len);
+               return len < 0 ? len : -EIO;
+       }
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(bdev_dax_supported);