|
@@ -2854,6 +2854,12 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb,
|
|
|
struct inode *inode = file->f_mapping->host;
|
|
|
ssize_t ret;
|
|
|
|
|
|
+ /*
|
|
|
+ * If we are doing data journalling we don't support O_DIRECT
|
|
|
+ */
|
|
|
+ if (ext4_should_journal_data(inode))
|
|
|
+ return 0;
|
|
|
+
|
|
|
trace_ext4_direct_IO_enter(inode, offset, iov_length(iov, nr_segs), rw);
|
|
|
if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
|
|
|
ret = ext4_ext_direct_IO(rw, iocb, iov, offset, nr_segs);
|
|
@@ -2923,6 +2929,7 @@ static const struct address_space_operations ext4_journalled_aops = {
|
|
|
.bmap = ext4_bmap,
|
|
|
.invalidatepage = ext4_invalidatepage,
|
|
|
.releasepage = ext4_releasepage,
|
|
|
+ .direct_IO = ext4_direct_IO,
|
|
|
.is_partially_uptodate = block_is_partially_uptodate,
|
|
|
.error_remove_page = generic_error_remove_page,
|
|
|
};
|