On Mon 03-04-17 13:53:05, Goldwyn Rodrigues wrote:
> From: Goldwyn Rodrigues <rgold...@suse.com>
> 
> 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 <j...@suse.com>
SUSE Labs, CR
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to