summaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_file.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2016-07-20 11:38:01 +1000
committerDave Chinner <david@fromorbit.com>2016-07-20 11:38:01 +1000
commitfa8d972d055c723cc427e14d4d7919640f418730 (patch)
treebc369f3712fa66d86563a42344282d2ce9aa08a9 /fs/xfs/xfs_file.c
parentf1285ff0acf9040a39921355d07bd83a3308c402 (diff)
downloadlinux-fa8d972d055c723cc427e14d4d7919640f418730.tar.bz2
xfs: direct calls in the direct I/O path
We control both the callers and callees of ->direct_IO, so remove the indirect calls. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/xfs_file.c')
-rw-r--r--fs/xfs/xfs_file.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 440bb8b5c64d..dd5185dafc9f 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -360,7 +360,13 @@ xfs_file_dio_aio_read(
}
data = *to;
- ret = mapping->a_ops->direct_IO(iocb, &data);
+ if (IS_DAX(inode)) {
+ ret = dax_do_io(iocb, inode, &data, xfs_get_blocks_direct,
+ NULL, 0);
+ } else {
+ ret = __blockdev_direct_IO(iocb, inode, target->bt_bdev, &data,
+ xfs_get_blocks_direct, NULL, NULL, 0);
+ }
if (ret > 0) {
iocb->ki_pos += ret;
iov_iter_advance(to, ret);
@@ -819,7 +825,14 @@ xfs_file_dio_aio_write(
trace_xfs_file_direct_write(ip, count, iocb->ki_pos);
data = *from;
- ret = mapping->a_ops->direct_IO(iocb, &data);
+ if (IS_DAX(inode)) {
+ ret = dax_do_io(iocb, inode, &data, xfs_get_blocks_direct,
+ xfs_end_io_direct_write, 0);
+ } else {
+ ret = __blockdev_direct_IO(iocb, inode, target->bt_bdev, &data,
+ xfs_get_blocks_direct, xfs_end_io_direct_write,
+ NULL, DIO_ASYNC_EXTEND);
+ }
/* see generic_file_direct_write() for why this is necessary */
if (mapping->nrpages) {