|
@@ -991,6 +991,7 @@ dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
|
|
|
struct iov_iter *iter = data;
|
|
|
loff_t end = pos + length, done = 0;
|
|
|
ssize_t ret = 0;
|
|
|
+ size_t xfer;
|
|
|
int id;
|
|
|
|
|
|
if (iov_iter_rw(iter) == READ) {
|
|
@@ -1054,19 +1055,20 @@ dax_iomap_actor(struct inode *inode, loff_t pos, loff_t length, void *data,
|
|
|
* vfs_write(), depending on which operation we are doing.
|
|
|
*/
|
|
|
if (iov_iter_rw(iter) == WRITE)
|
|
|
- map_len = dax_copy_from_iter(dax_dev, pgoff, kaddr,
|
|
|
+ xfer = dax_copy_from_iter(dax_dev, pgoff, kaddr,
|
|
|
map_len, iter);
|
|
|
else
|
|
|
- map_len = dax_copy_to_iter(dax_dev, pgoff, kaddr,
|
|
|
+ xfer = dax_copy_to_iter(dax_dev, pgoff, kaddr,
|
|
|
map_len, iter);
|
|
|
- if (map_len <= 0) {
|
|
|
- ret = map_len ? map_len : -EFAULT;
|
|
|
- break;
|
|
|
- }
|
|
|
|
|
|
- pos += map_len;
|
|
|
- length -= map_len;
|
|
|
- done += map_len;
|
|
|
+ pos += xfer;
|
|
|
+ length -= xfer;
|
|
|
+ done += xfer;
|
|
|
+
|
|
|
+ if (xfer == 0)
|
|
|
+ ret = -EFAULT;
|
|
|
+ if (xfer < map_len)
|
|
|
+ break;
|
|
|
}
|
|
|
dax_read_unlock(id);
|
|
|
|