mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-11 13:04:03 +08:00
xfs: add DAX IO path support
DAX does not do buffered IO (can't buffer direct access!) and hence all read/write IO is vectored through the direct IO path. Hence we need to add the DAX IO path callouts to the direct IO infrastructure. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
parent
9969441f9f
commit
6e1ba0bcb8
@ -1657,6 +1657,29 @@ xfs_end_io_dax_write(
|
||||
void xfs_end_io_dax_write(struct buffer_head *bh, int uptodate) { }
|
||||
#endif
|
||||
|
||||
static inline ssize_t
|
||||
xfs_vm_do_dio(
|
||||
struct inode *inode,
|
||||
struct kiocb *iocb,
|
||||
struct iov_iter *iter,
|
||||
loff_t offset,
|
||||
void (*endio)(struct kiocb *iocb,
|
||||
loff_t offset,
|
||||
ssize_t size,
|
||||
void *private),
|
||||
int flags)
|
||||
{
|
||||
struct block_device *bdev;
|
||||
|
||||
if (IS_DAX(inode))
|
||||
return dax_do_io(iocb, inode, iter, offset,
|
||||
xfs_get_blocks_direct, endio, 0);
|
||||
|
||||
bdev = xfs_find_bdev_for_inode(inode);
|
||||
return __blockdev_direct_IO(iocb, inode, bdev, iter, offset,
|
||||
xfs_get_blocks_direct, endio, NULL, flags);
|
||||
}
|
||||
|
||||
STATIC ssize_t
|
||||
xfs_vm_direct_IO(
|
||||
struct kiocb *iocb,
|
||||
@ -1664,16 +1687,11 @@ xfs_vm_direct_IO(
|
||||
loff_t offset)
|
||||
{
|
||||
struct inode *inode = iocb->ki_filp->f_mapping->host;
|
||||
struct block_device *bdev = xfs_find_bdev_for_inode(inode);
|
||||
|
||||
if (iov_iter_rw(iter) == WRITE) {
|
||||
return __blockdev_direct_IO(iocb, inode, bdev, iter, offset,
|
||||
xfs_get_blocks_direct,
|
||||
xfs_end_io_direct_write, NULL,
|
||||
DIO_ASYNC_EXTEND);
|
||||
}
|
||||
return __blockdev_direct_IO(iocb, inode, bdev, iter, offset,
|
||||
xfs_get_blocks_direct, NULL, NULL, 0);
|
||||
if (iov_iter_rw(iter) == WRITE)
|
||||
return xfs_vm_do_dio(inode, iocb, iter, offset,
|
||||
xfs_end_io_direct_write, DIO_ASYNC_EXTEND);
|
||||
return xfs_vm_do_dio(inode, iocb, iter, offset, NULL, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user