diff options
Diffstat (limited to 'fs/ext4/indirect.c')
| -rw-r--r-- | fs/ext4/indirect.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/fs/ext4/indirect.c b/fs/ext4/indirect.c index 36b369697a13..6b9878a24182 100644 --- a/fs/ext4/indirect.c +++ b/fs/ext4/indirect.c | |||
| @@ -689,14 +689,22 @@ retry: | |||
| 689 | inode_dio_done(inode); | 689 | inode_dio_done(inode); |
| 690 | goto locked; | 690 | goto locked; |
| 691 | } | 691 | } |
| 692 | ret = __blockdev_direct_IO(rw, iocb, inode, | 692 | if (IS_DAX(inode)) |
| 693 | inode->i_sb->s_bdev, iter, offset, | 693 | ret = dax_do_io(rw, iocb, inode, iter, offset, |
| 694 | ext4_get_block, NULL, NULL, 0); | 694 | ext4_get_block, NULL, 0); |
| 695 | else | ||
| 696 | ret = __blockdev_direct_IO(rw, iocb, inode, | ||
| 697 | inode->i_sb->s_bdev, iter, offset, | ||
| 698 | ext4_get_block, NULL, NULL, 0); | ||
| 695 | inode_dio_done(inode); | 699 | inode_dio_done(inode); |
| 696 | } else { | 700 | } else { |
| 697 | locked: | 701 | locked: |
| 698 | ret = blockdev_direct_IO(rw, iocb, inode, iter, | 702 | if (IS_DAX(inode)) |
| 699 | offset, ext4_get_block); | 703 | ret = dax_do_io(rw, iocb, inode, iter, offset, |
| 704 | ext4_get_block, NULL, DIO_LOCKING); | ||
| 705 | else | ||
| 706 | ret = blockdev_direct_IO(rw, iocb, inode, iter, | ||
| 707 | offset, ext4_get_block); | ||
| 700 | 708 | ||
| 701 | if (unlikely((rw & WRITE) && ret < 0)) { | 709 | if (unlikely((rw & WRITE) && ret < 0)) { |
| 702 | loff_t isize = i_size_read(inode); | 710 | loff_t isize = i_size_read(inode); |
