aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-04-09 13:52:01 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2015-04-11 22:30:22 -0400
commit2ba48ce513c4e545318d22b138861d5876edf906 (patch)
tree0e2a5130ead5c71f0b079b1acd620fba98f99256 /fs/ext4
parent3309dd04cbcd2cdad168485af5cf3576b5051e49 (diff)
mirror O_APPEND and O_DIRECT into iocb->ki_flags
... avoiding write_iter/fcntl races. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/file.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index c10785f10d1d..53bbc0b1995f 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -95,7 +95,7 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
95 struct inode *inode = file_inode(iocb->ki_filp); 95 struct inode *inode = file_inode(iocb->ki_filp);
96 struct mutex *aio_mutex = NULL; 96 struct mutex *aio_mutex = NULL;
97 struct blk_plug plug; 97 struct blk_plug plug;
98 int o_direct = io_is_direct(file); 98 int o_direct = iocb->ki_flags & IOCB_DIRECT;
99 int overwrite = 0; 99 int overwrite = 0;
100 ssize_t ret; 100 ssize_t ret;
101 101
@@ -106,7 +106,7 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
106 if (o_direct && 106 if (o_direct &&
107 ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS) && 107 ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS) &&
108 !is_sync_kiocb(iocb) && 108 !is_sync_kiocb(iocb) &&
109 (file->f_flags & O_APPEND || 109 (iocb->ki_flags & IOCB_APPEND ||
110 ext4_unaligned_aio(inode, from, iocb->ki_pos))) { 110 ext4_unaligned_aio(inode, from, iocb->ki_pos))) {
111 aio_mutex = ext4_aio_mutex(inode); 111 aio_mutex = ext4_aio_mutex(inode);
112 mutex_lock(aio_mutex); 112 mutex_lock(aio_mutex);