Message ID | 20190210094754.56355-1-houtao1@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | fat: enable .splice_write to support splice on O_DIRECT file | expand |
ping ? On 2019/2/10 17:47, Hou Tao wrote: > Now splice() on O_DIRECT-opened fat file will return -EFAULT, that is > because the default .splice_write, namely default_file_splice_write(), > will construct an ITER_KVEC iov_iter and dio_refill_pages() in dio path > can not handle it. > > Fix it by implementing .splice_write through iter_file_splice_write(). > > Spotted by xfs-tests generic/091. > > Signed-off-by: Hou Tao <houtao1@huawei.com> > --- > fs/fat/file.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/fat/file.c b/fs/fat/file.c > index 13935ee99e1e..b3bed32946b1 100644 > --- a/fs/fat/file.c > +++ b/fs/fat/file.c > @@ -214,6 +214,7 @@ const struct file_operations fat_file_operations = { > #endif > .fsync = fat_file_fsync, > .splice_read = generic_file_splice_read, > + .splice_write = iter_file_splice_write, > .fallocate = fat_fallocate, > }; > >
Hou Tao <houtao1@huawei.com> writes: > Now splice() on O_DIRECT-opened fat file will return -EFAULT, that is > because the default .splice_write, namely default_file_splice_write(), > will construct an ITER_KVEC iov_iter and dio_refill_pages() in dio path > can not handle it. > > Fix it by implementing .splice_write through iter_file_splice_write(). > > Spotted by xfs-tests generic/091. > > Signed-off-by: Hou Tao <houtao1@huawei.com> > --- > fs/fat/file.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/fs/fat/file.c b/fs/fat/file.c > index 13935ee99e1e..b3bed32946b1 100644 > --- a/fs/fat/file.c > +++ b/fs/fat/file.c > @@ -214,6 +214,7 @@ const struct file_operations fat_file_operations = { > #endif > .fsync = fat_file_fsync, > .splice_read = generic_file_splice_read, > + .splice_write = iter_file_splice_write, > .fallocate = fat_fallocate, > }; Looks good. Acked-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> Thanks.
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> writes: > Hou Tao <houtao1@huawei.com> writes: > >> Now splice() on O_DIRECT-opened fat file will return -EFAULT, that is >> because the default .splice_write, namely default_file_splice_write(), >> will construct an ITER_KVEC iov_iter and dio_refill_pages() in dio path >> can not handle it. >> >> Fix it by implementing .splice_write through iter_file_splice_write(). >> >> Spotted by xfs-tests generic/091. >> >> Signed-off-by: Hou Tao <houtao1@huawei.com> >> --- >> fs/fat/file.c | 1 + >> 1 file changed, 1 insertion(+) >> >> diff --git a/fs/fat/file.c b/fs/fat/file.c >> index 13935ee99e1e..b3bed32946b1 100644 >> --- a/fs/fat/file.c >> +++ b/fs/fat/file.c >> @@ -214,6 +214,7 @@ const struct file_operations fat_file_operations = { >> #endif >> .fsync = fat_file_fsync, >> .splice_read = generic_file_splice_read, >> + .splice_write = iter_file_splice_write, >> .fallocate = fat_fallocate, >> }; > > Looks good. > > Acked-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> > > Thanks. Forgot to include akpm to addresses.
diff --git a/fs/fat/file.c b/fs/fat/file.c index 13935ee99e1e..b3bed32946b1 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c @@ -214,6 +214,7 @@ const struct file_operations fat_file_operations = { #endif .fsync = fat_file_fsync, .splice_read = generic_file_splice_read, + .splice_write = iter_file_splice_write, .fallocate = fat_fallocate, };
Now splice() on O_DIRECT-opened fat file will return -EFAULT, that is because the default .splice_write, namely default_file_splice_write(), will construct an ITER_KVEC iov_iter and dio_refill_pages() in dio path can not handle it. Fix it by implementing .splice_write through iter_file_splice_write(). Spotted by xfs-tests generic/091. Signed-off-by: Hou Tao <houtao1@huawei.com> --- fs/fat/file.c | 1 + 1 file changed, 1 insertion(+)