• Goldwyn Rodrigues's avatar
    btrfs: switch to iomap for direct IO · f85781fb
    Goldwyn Rodrigues authored
    We're using direct io implementation based on buffer heads. This patch
    switches to the new iomap infrastructure.
    
    Switch from __blockdev_direct_IO() to iomap_dio_rw().  Rename
    btrfs_get_blocks_direct() to btrfs_dio_iomap_begin() and use it as
    iomap_begin() for iomap direct I/O functions. This function allocates
    and locks all the blocks required for the I/O.  btrfs_submit_direct() is
    used as the submit_io() hook for direct I/O ops.
    
    Since we need direct I/O reads to go through iomap_dio_rw(), we change
    file_operations.read_iter() to a btrfs_file_read_iter() which calls
    btrfs_direct_IO() for direct reads and falls back to
    generic_file_buffered_read() for incomplete reads and buffered reads.
    
    We don't need address_space.direct_IO() anymore: set it to noop.
    
    Similarly, we don't need flags used in __blockdev_direct_IO(). iomap is
    capable of direct I/O reads from a hole, so we don't need to return
    -ENOENT.
    
    Btrfs direct I/O is now done under i_rwsem, shared in case of reads and
    exclusive in case of writes. This guards against simultaneous truncates.
    
    Use iomap->iomap_end() to check for failed or incomplete direct I/O:
    
      - for writes, call __endio_write_update_ordered()
      - for reads, unlock extents
    
    btrfs_dio_data is now hooked in iomap->private and not
    current->journal_info. It carries the reservation variable and the
    amount of data submitted, so we can calculate the amount of data to call
    __endio_write_update_ordered in case of an error.
    
    This patch removes last use of struct buffer_head from btrfs.
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarGoldwyn Rodrigues <rgoldwyn@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    f85781fb
Kconfig 3.33 KB