On Mon 03-04-17 13:53:05, Goldwyn Rodrigues wrote: > From: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> > > Return EAGAIN if any of the following checks fail for direct I/O: > + i_rwsem is lockable > + Writing beyond end of file (will trigger allocation) > + Blocks are not allocated at the write location Patches seem to be missing your Signed-off-by tag... > @@ -235,9 +237,21 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter *from) > > iocb->private = &overwrite; > /* Check whether we do a DIO overwrite or not */ > - if (o_direct && ext4_should_dioread_nolock(inode) && !unaligned_aio && > - ext4_overwrite_io(inode, iocb->ki_pos, iov_iter_count(from))) > - overwrite = 1; > + if (o_direct && !unaligned_aio) { > + struct ext4_map_blocks map; > + if (ext4_blocks_mapped(inode, iocb->ki_pos, > + iov_iter_count(from), &map)) { > + /* To exclude unwritten extents, we need to check > + * m_flags. > + */ > + if (ext4_should_dioread_nolock(inode) && > + (map.m_flags & EXT4_MAP_MAPPED)) > + overwrite = 1; > + } else if (iocb->ki_flags & IOCB_NOWAIT) { > + ret = -EAGAIN; > + goto out; > + } > + } Actually, overwriting unwritten extents is relatively complex in ext4 as well. In particular we need to start a transaction and split out the written part of the extent. So I don't think we can easily support this without blocking. As a result I'd keep the condition for IOCB_NOWAIT the same as for overwrite IO. > --- a/fs/ext4/super.c > +++ b/fs/ext4/super.c > @@ -117,7 +117,7 @@ static struct file_system_type ext2_fs_type = { > .name = "ext2", > .mount = ext4_mount, > .kill_sb = kill_block_super, > - .fs_flags = FS_REQUIRES_DEV, > + .fs_flags = FS_REQUIRES_DEV | FS_NOWAIT, FS_NOWAIT looks a bit too generic given these are filesystem feature flags. Can we call it FS_NOWAIT_IO? Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR