Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 31b14039 authored by Al Viro's avatar Al Viro
Browse files

switch {__,}blockdev_direct_IO() to iov_iter



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent a6cbcd4a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -171,8 +171,8 @@ blkdev_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
	struct file *file = iocb->ki_filp;
	struct inode *inode = file->f_mapping->host;

	return __blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iter->iov,
				    offset, iter->nr_segs, blkdev_get_block,
	return __blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iter,
				    offset, blkdev_get_block,
				    NULL, NULL, 0);
}

+1 −2
Original line number Diff line number Diff line
@@ -7483,8 +7483,7 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,

	ret = __blockdev_direct_IO(rw, iocb, inode,
			BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev,
			iter->iov, offset, iter->nr_segs,
			btrfs_get_blocks_direct, NULL,
			iter, offset, btrfs_get_blocks_direct, NULL,
			btrfs_submit_direct, flags);
	if (rw & WRITE) {
		if (ret < 0 && ret != -EIOCBQUEUED)
+16 −17
Original line number Diff line number Diff line
@@ -1107,8 +1107,8 @@ static inline int drop_refcount(struct dio *dio)
 */
static inline ssize_t
do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
	struct block_device *bdev, const struct iovec *iov, loff_t offset, 
	unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io,
	struct block_device *bdev, struct iov_iter *iter, loff_t offset, 
	get_block_t get_block, dio_iodone_t end_io,
	dio_submit_t submit_io,	int flags)
{
	int seg;
@@ -1143,9 +1143,9 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
	}

	/* Check the memory alignment.  Blocks cannot straddle pages */
	for (seg = 0; seg < nr_segs; seg++) {
		addr = (unsigned long)iov[seg].iov_base;
		size = iov[seg].iov_len;
	for (seg = 0; seg < iter->nr_segs; seg++) {
		addr = (unsigned long)iter->iov[seg].iov_base;
		size = iter->iov[seg].iov_len;
		end += size;
		if (unlikely((addr & blocksize_mask) ||
			     (size & blocksize_mask))) {
@@ -1256,18 +1256,18 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
	if (unlikely(sdio.blkfactor))
		sdio.pages_in_io = 2;

	for (seg = 0; seg < nr_segs; seg++) {
		user_addr = (unsigned long)iov[seg].iov_base;
	for (seg = 0; seg < iter->nr_segs; seg++) {
		user_addr = (unsigned long)iter->iov[seg].iov_base;
		sdio.pages_in_io +=
			((user_addr + iov[seg].iov_len + PAGE_SIZE-1) /
			((user_addr + iter->iov[seg].iov_len + PAGE_SIZE-1) /
				PAGE_SIZE - user_addr / PAGE_SIZE);
	}

	blk_start_plug(&plug);

	for (seg = 0; seg < nr_segs; seg++) {
		user_addr = (unsigned long)iov[seg].iov_base;
		sdio.size += bytes = iov[seg].iov_len;
	for (seg = 0; seg < iter->nr_segs; seg++) {
		user_addr = (unsigned long)iter->iov[seg].iov_base;
		sdio.size += bytes = iter->iov[seg].iov_len;

		/* Index into the first page of the first block */
		sdio.first_block_in_page = (user_addr & ~PAGE_MASK) >> blkbits;
@@ -1288,7 +1288,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,

		retval = do_direct_IO(dio, &sdio, &map_bh);

		dio->result += iov[seg].iov_len -
		dio->result += iter->iov[seg].iov_len -
			((sdio.final_block_in_request - sdio.block_in_file) <<
					blkbits);

@@ -1365,8 +1365,8 @@ out:

ssize_t
__blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
	struct block_device *bdev, const struct iovec *iov, loff_t offset,
	unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io,
	struct block_device *bdev, struct iov_iter *iter, loff_t offset,
	get_block_t get_block, dio_iodone_t end_io,
	dio_submit_t submit_io,	int flags)
{
	/*
@@ -1381,9 +1381,8 @@ __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
	prefetch(bdev->bd_queue);
	prefetch((char *)bdev->bd_queue + SMP_CACHE_BYTES);

	return do_blockdev_direct_IO(rw, iocb, inode, bdev, iov, offset,
				     nr_segs, get_block, end_io,
				     submit_io, flags);
	return do_blockdev_direct_IO(rw, iocb, inode, bdev, iter, offset,
				     get_block, end_io, submit_io, flags);
}

EXPORT_SYMBOL(__blockdev_direct_IO);
+1 −2
Original line number Diff line number Diff line
@@ -859,8 +859,7 @@ ext2_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
	size_t count = iov_iter_count(iter);
	ssize_t ret;

	ret = blockdev_direct_IO(rw, iocb, inode, iter->iov, offset,
				 iter->nr_segs, ext2_get_block);
	ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, ext2_get_block);
	if (ret < 0 && (rw & WRITE))
		ext2_write_failed(mapping, offset + count);
	return ret;
+1 −2
Original line number Diff line number Diff line
@@ -1855,8 +1855,7 @@ static ssize_t ext3_direct_IO(int rw, struct kiocb *iocb,
	}

retry:
	ret = blockdev_direct_IO(rw, iocb, inode, iter->iov, offset,
				 iter->nr_segs, ext3_get_block);
	ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, ext3_get_block);
	/*
	 * In case of error extending write may have instantiated a few
	 * blocks outside i_size. Trim these off again.
Loading