Merge tag 'fuse-update-5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/mszered...
[platform/kernel/linux-rpi.git] / drivers / dax / super.c
index f508285..edc279b 100644 (file)
@@ -46,7 +46,8 @@ EXPORT_SYMBOL_GPL(dax_read_unlock);
 int bdev_dax_pgoff(struct block_device *bdev, sector_t sector, size_t size,
                pgoff_t *pgoff)
 {
-       phys_addr_t phys_off = (get_start_sect(bdev) + sector) * 512;
+       sector_t start_sect = bdev ? get_start_sect(bdev) : 0;
+       phys_addr_t phys_off = (start_sect + sector) * 512;
 
        if (pgoff)
                *pgoff = PHYS_PFN(phys_off);
@@ -80,14 +81,20 @@ bool __generic_fsdax_supported(struct dax_device *dax_dev,
        int err, id;
 
        if (blocksize != PAGE_SIZE) {
-               pr_debug("%s: error: unsupported blocksize for dax\n",
+               pr_info("%s: error: unsupported blocksize for dax\n",
+                               bdevname(bdev, buf));
+               return false;
+       }
+
+       if (!dax_dev) {
+               pr_debug("%s: error: dax unsupported by block device\n",
                                bdevname(bdev, buf));
                return false;
        }
 
        err = bdev_dax_pgoff(bdev, start, PAGE_SIZE, &pgoff);
        if (err) {
-               pr_debug("%s: error: unaligned partition for dax\n",
+               pr_info("%s: error: unaligned partition for dax\n",
                                bdevname(bdev, buf));
                return false;
        }
@@ -95,7 +102,7 @@ bool __generic_fsdax_supported(struct dax_device *dax_dev,
        last_page = PFN_DOWN((start + sectors - 1) * 512) * PAGE_SIZE / 512;
        err = bdev_dax_pgoff(bdev, last_page, PAGE_SIZE, &pgoff_end);
        if (err) {
-               pr_debug("%s: error: unaligned partition for dax\n",
+               pr_info("%s: error: unaligned partition for dax\n",
                                bdevname(bdev, buf));
                return false;
        }
@@ -103,11 +110,11 @@ bool __generic_fsdax_supported(struct dax_device *dax_dev,
        id = dax_read_lock();
        len = dax_direct_access(dax_dev, pgoff, 1, &kaddr, &pfn);
        len2 = dax_direct_access(dax_dev, pgoff_end, 1, &end_kaddr, &end_pfn);
-       dax_read_unlock(id);
 
        if (len < 1 || len2 < 1) {
-               pr_debug("%s: error: dax access failed (%ld)\n",
+               pr_info("%s: error: dax access failed (%ld)\n",
                                bdevname(bdev, buf), len < 1 ? len : len2);
+               dax_read_unlock(id);
                return false;
        }
 
@@ -137,9 +144,10 @@ bool __generic_fsdax_supported(struct dax_device *dax_dev,
                put_dev_pagemap(end_pgmap);
 
        }
+       dax_read_unlock(id);
 
        if (!dax_enabled) {
-               pr_debug("%s: error: dax support not enabled\n",
+               pr_info("%s: error: dax support not enabled\n",
                                bdevname(bdev, buf));
                return false;
        }
@@ -318,11 +326,15 @@ EXPORT_SYMBOL_GPL(dax_direct_access);
 bool dax_supported(struct dax_device *dax_dev, struct block_device *bdev,
                int blocksize, sector_t start, sector_t len)
 {
+       if (!dax_dev)
+               return false;
+
        if (!dax_alive(dax_dev))
                return false;
 
        return dax_dev->ops->dax_supported(dax_dev, bdev, blocksize, start, len);
 }
+EXPORT_SYMBOL_GPL(dax_supported);
 
 size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
                size_t bytes, struct iov_iter *i)