diff options
author | Dan Williams <dan.j.williams@intel.com> | 2016-01-16 01:55:56 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-01-16 02:56:32 +0100 |
commit | fe683adabfe6629c0b6db32bbbc1ce6cacbf2117 (patch) | |
tree | 16798d03701b19665bcfcdfdf7796c4b52641242 /fs/block_dev.c | |
parent | dax: increase granularity of dax_clear_blocks() operations (diff) | |
download | linux-fe683adabfe6629c0b6db32bbbc1ce6cacbf2117.tar.xz linux-fe683adabfe6629c0b6db32bbbc1ce6cacbf2117.zip |
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>
Diffstat (limited to 'fs/block_dev.c')
-rw-r--r-- | fs/block_dev.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index 81c0705558be..ddc6cdd1860b 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -494,6 +494,8 @@ long bdev_direct_access(struct block_device *bdev, sector_t sector, 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); |