• Tao Ma's avatar
    ext4: don't check io->flag when setting EXT4_STATE_DIO_UNWRITTEN inode state · b3ff0569
    Tao Ma authored
    When we want to convert the unitialized extent in direct write, we can
    either do it in ext4_end_io_nolock(AIO case) or in
    ext4_ext_direct_IO(non AIO case) and EXT4_I(inode)->cur_aio_dio is a
    guard for ext4_ext_map_blocks to find the right case.  In e9e3bcec,
    we mistakenly change it by:
    
    -			if (io)
    +			if (io && !(io->flag & EXT4_IO_END_UNWRITTEN)) {
     				io->flag = EXT4_IO_END_UNWRITTEN;
    -			else
    +				atomic_inc(&EXT4_I(inode)->i_aiodio_unwritten);
    +			} else
     				ext4_set_inode_state(inode,
     						     EXT4_STATE_DIO_UNWRITTEN);
    
    So now if we map 2 blocks, and the first one set the
    EXT_IO_END_UNWRITTEN, the 2nd mapping will set inode state because of
    the check for the flag. This is wrong.
    
    Cc: Eric Sandeen <sandeen@redhat.com>
    Signed-off-by: default avatarTao Ma <boyu.mt@taobao.com>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    b3ff0569
extents.c 130 KB