dax: guarantee page aligned results from bdev_direct_access()
If a ->direct_access() implementation ever returns a map count less than
PAGE_SIZE, catch the error in bdev_direct_access(). This simplifies
error checking in upper layers.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Reported-by: Ross Zwisler <ross.zwisler@linux.intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 81c0705..ddc6cdd 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -494,6 +494,8 @@
avail = ops->direct_access(bdev, sector, addr, pfn);
if (!avail)
return -ERANGE;
+ if (avail > 0 && avail & ~PAGE_MASK)
+ return -ENXIO;
return min(avail, size);
}
EXPORT_SYMBOL_GPL(bdev_direct_access);
diff --git a/fs/dax.c b/fs/dax.c
index 11721c0..1080fb5 100644
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -52,7 +52,6 @@
sz = min_t(long, count, SZ_128K);
clear_pmem(addr, sz);
size -= sz;
- BUG_ON(sz & 511);
sector += sz / 512;
cond_resched();
} while (size);