Commit fa8d972d authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Dave Chinner

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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent f1285ff0
...@@ -1336,7 +1336,7 @@ xfs_get_blocks_dax_fault( ...@@ -1336,7 +1336,7 @@ xfs_get_blocks_dax_fault(
* whereas if we have flags set we will always be called in task context * whereas if we have flags set we will always be called in task context
* (i.e. from a workqueue). * (i.e. from a workqueue).
*/ */
STATIC int int
xfs_end_io_direct_write( xfs_end_io_direct_write(
struct kiocb *iocb, struct kiocb *iocb,
loff_t offset, loff_t offset,
...@@ -1407,24 +1407,10 @@ xfs_vm_direct_IO( ...@@ -1407,24 +1407,10 @@ xfs_vm_direct_IO(
struct kiocb *iocb, struct kiocb *iocb,
struct iov_iter *iter) struct iov_iter *iter)
{ {
struct inode *inode = iocb->ki_filp->f_mapping->host; /*
dio_iodone_t *endio = NULL; * We just need the method present so that open/fcntl allow direct I/O.
int flags = 0; */
struct block_device *bdev; return -EINVAL;
if (iov_iter_rw(iter) == WRITE) {
endio = xfs_end_io_direct_write;
flags = DIO_ASYNC_EXTEND;
}
if (IS_DAX(inode)) {
return dax_do_io(iocb, inode, iter,
xfs_get_blocks_direct, endio, 0);
}
bdev = xfs_find_bdev_for_inode(inode);
return __blockdev_direct_IO(iocb, inode, bdev, iter,
xfs_get_blocks_direct, endio, NULL, flags);
} }
/* /*
......
...@@ -60,6 +60,9 @@ int xfs_get_blocks_direct(struct inode *inode, sector_t offset, ...@@ -60,6 +60,9 @@ int xfs_get_blocks_direct(struct inode *inode, sector_t offset,
int xfs_get_blocks_dax_fault(struct inode *inode, sector_t offset, int xfs_get_blocks_dax_fault(struct inode *inode, sector_t offset,
struct buffer_head *map_bh, int create); struct buffer_head *map_bh, int create);
int xfs_end_io_direct_write(struct kiocb *iocb, loff_t offset,
ssize_t size, void *private);
extern void xfs_count_page_state(struct page *, int *, int *); extern void xfs_count_page_state(struct page *, int *, int *);
extern struct block_device *xfs_find_bdev_for_inode(struct inode *); extern struct block_device *xfs_find_bdev_for_inode(struct inode *);
......
...@@ -360,7 +360,13 @@ xfs_file_dio_aio_read( ...@@ -360,7 +360,13 @@ xfs_file_dio_aio_read(
} }
data = *to; 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) { if (ret > 0) {
iocb->ki_pos += ret; iocb->ki_pos += ret;
iov_iter_advance(to, ret); iov_iter_advance(to, ret);
...@@ -819,7 +825,14 @@ xfs_file_dio_aio_write( ...@@ -819,7 +825,14 @@ xfs_file_dio_aio_write(
trace_xfs_file_direct_write(ip, count, iocb->ki_pos); trace_xfs_file_direct_write(ip, count, iocb->ki_pos);
data = *from; 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 */ /* see generic_file_direct_write() for why this is necessary */
if (mapping->nrpages) { if (mapping->nrpages) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment