iomap: implement direct I/O
authorChristoph Hellwig <hch@lst.de>
Wed, 30 Nov 2016 03:36:01 +0000 (14:36 +1100)
committerDave Chinner <david@fromorbit.com>
Wed, 30 Nov 2016 03:36:01 +0000 (14:36 +1100)
commitff6a9292e6f633d596826be5ba70d3ef90cc3300
tree5de08d6a9487d52036499b8ae9713f32e545b048
parentec1b826097f30858f9ed201cb78f1a762c50d0aa
iomap: implement direct I/O

This adds a full fledget direct I/O implementation using the iomap
interface. Full fledged in this case means all features are supported:
AIO, vectored I/O, any iov_iter type including kernel pointers, bvecs
and pipes, support for hole filling and async apending writes.  It does
not mean supporting all the warts of the old generic code.  We expect
i_rwsem to be held over the duration of the call, and we expect to
maintain i_dio_count ourselves, and we pass on any kinds of mapping
to the file system for now.

The algorithm used is very simple: We use iomap_apply to iterate over
the range of the I/O, and then we use the new bio_iov_iter_get_pages
helper to lock down the user range for the size of the extent.
bio_iov_iter_get_pages can currently lock down twice as many pages as
the old direct I/O code did, which means that we will have a better
batch factor for everything but overwrites of badly fragmented files.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Kent Overstreet <kent.overstreet@gmail.com>
Tested-by: Jens Axboe <axboe@fb.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/iomap.c
include/linux/iomap.h