Skip to content
  • Dmitry Monakhov's avatar
    ext4: serialize truncate with owerwrite DIO workers · 1f555cfa
    Dmitry Monakhov authored
    
    
    Jan Kara have spotted interesting issue:
    There are  potential data corruption issue with  direct IO overwrites
    racing with truncate:
     Like:
      dio write                      truncate_task
      ->ext4_ext_direct_IO
       ->overwrite == 1
        ->down_read(&EXT4_I(inode)->i_data_sem);
        ->mutex_unlock(&inode->i_mutex);
                                   ->ext4_setattr()
                                    ->inode_dio_wait()
                                    ->truncate_setsize()
                                    ->ext4_truncate()
                                     ->down_write(&EXT4_I(inode)->i_data_sem);
        ->__blockdev_direct_IO
         ->ext4_get_block
         ->submit_io()
        ->up_read(&EXT4_I(inode)->i_data_sem);
                                     # truncate data blocks, allocate them to
                                     # other inode - bad stuff happens because
                                     # dio is still in flight.
    
    In order to serialize with truncate dio worker should grab extra i_dio_count
    reference before drop i_mutex.
    
    Reviewed-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarDmitry Monakhov <dmonakhov@openvz.org>
    Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
    1f555cfa