ext4: fake direct I/O mode for data=journal
Currently attempts to open a file with O_DIRECT in data=journal mode causes the open to fail with -EINVAL. This makes it very hard to test data=journal mode. So we will let the open succeed, but then always fall back to O_DSYNC buffered writes. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
@@ -2854,6 +2854,12 @@ static ssize_t ext4_direct_IO(int rw, struct kiocb *iocb,
|
|||||||
struct inode *inode = file->f_mapping->host;
|
struct inode *inode = file->f_mapping->host;
|
||||||
ssize_t ret;
|
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);
|
trace_ext4_direct_IO_enter(inode, offset, iov_length(iov, nr_segs), rw);
|
||||||
if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
|
if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
|
||||||
ret = ext4_ext_direct_IO(rw, iocb, iov, offset, nr_segs);
|
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,
|
.bmap = ext4_bmap,
|
||||||
.invalidatepage = ext4_invalidatepage,
|
.invalidatepage = ext4_invalidatepage,
|
||||||
.releasepage = ext4_releasepage,
|
.releasepage = ext4_releasepage,
|
||||||
|
.direct_IO = ext4_direct_IO,
|
||||||
.is_partially_uptodate = block_is_partially_uptodate,
|
.is_partially_uptodate = block_is_partially_uptodate,
|
||||||
.error_remove_page = generic_error_remove_page,
|
.error_remove_page = generic_error_remove_page,
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user