Skip to content

Commit 0357794

Browse files
sandeennamjaejeon
authored andcommitted
exfat: use iter_file_splice_write
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: Eric Sandeen <[email protected]> Signed-off-by: Namjae Jeon <[email protected]>
1 parent b9bbe6e commit 0357794

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

fs/exfat/file.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -348,12 +348,13 @@ int exfat_setattr(struct dentry *dentry, struct iattr *attr)
348348
}
349349

350350
const struct file_operations exfat_file_operations = {
351-
.llseek = generic_file_llseek,
352-
.read_iter = generic_file_read_iter,
353-
.write_iter = generic_file_write_iter,
354-
.mmap = generic_file_mmap,
355-
.fsync = generic_file_fsync,
356-
.splice_read = generic_file_splice_read,
351+
.llseek = generic_file_llseek,
352+
.read_iter = generic_file_read_iter,
353+
.write_iter = generic_file_write_iter,
354+
.mmap = generic_file_mmap,
355+
.fsync = generic_file_fsync,
356+
.splice_read = generic_file_splice_read,
357+
.splice_write = iter_file_splice_write,
357358
};
358359

359360
const struct inode_operations exfat_file_inode_operations = {

0 commit comments

Comments
 (0)