Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dax: Report bytes remaining in dax_iomap_actor()

In preparation for protecting the dax read(2) path from media errors
with copy_to_iter_mcsafe() (via dax_copy_to_iter()), convert the
implementation to report the bytes successfully transferred.

Cc: <x86@kernel.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>

+11 -9
+11 -9
fs/dax.c
··· 991 991 struct iov_iter *iter = data; 992 992 loff_t end = pos + length, done = 0; 993 993 ssize_t ret = 0; 994 + size_t xfer; 994 995 int id; 995 996 996 997 if (iov_iter_rw(iter) == READ) { ··· 1055 1054 * vfs_write(), depending on which operation we are doing. 1056 1055 */ 1057 1056 if (iov_iter_rw(iter) == WRITE) 1058 - map_len = dax_copy_from_iter(dax_dev, pgoff, kaddr, 1057 + xfer = dax_copy_from_iter(dax_dev, pgoff, kaddr, 1059 1058 map_len, iter); 1060 1059 else 1061 - map_len = dax_copy_to_iter(dax_dev, pgoff, kaddr, 1060 + xfer = dax_copy_to_iter(dax_dev, pgoff, kaddr, 1062 1061 map_len, iter); 1063 - if (map_len <= 0) { 1064 - ret = map_len ? map_len : -EFAULT; 1065 - break; 1066 - } 1067 1062 1068 - pos += map_len; 1069 - length -= map_len; 1070 - done += map_len; 1063 + pos += xfer; 1064 + length -= xfer; 1065 + done += xfer; 1066 + 1067 + if (xfer == 0) 1068 + ret = -EFAULT; 1069 + if (xfer < map_len) 1070 + break; 1071 1071 } 1072 1072 dax_read_unlock(id); 1073 1073