• Eric Sandeen's avatar
    exfat: use iter_file_splice_write · 03577948
    Eric Sandeen authored
    Doing copy_file_range() on exfat with a file opened for direct IO leads
    to an -EFAULT:
    
    # xfs_io -f -d -c "truncate 32768" \
           -c "copy_range -d 16384 -l 16384 -f 0" /mnt/test/junk
    copy_range: Bad address
    
    and the reason seems to be that we go through:
    
    default_file_splice_write
     splice_from_pipe
      __splice_from_pipe
       write_pipe_buf
        __kernel_write
         new_sync_write
          generic_file_write_iter
           generic_file_direct_write
            exfat_direct_IO
             do_blockdev_direct_IO
              iov_iter_get_pages
    
    and land in iterate_all_kinds(), which does "return -EFAULT" for our kvec
    iter.
    
    Setting exfat's splice_write to iter_file_splice_write fixes this and lets
    fsx (which originally detected the problem) run to success from
    the xfstests harness.
    Signed-off-by: default avatarEric Sandeen <sandeen@sandeen.net>
    Signed-off-by: default avatarNamjae Jeon <namjae.jeon@samsung.com>
    03577948
file.c 9.12 KB