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

Commit fa8d972d authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Dave Chinner
Browse files

xfs: direct calls in the direct I/O path



We control both the callers and callees of ->direct_IO, so remove the
indirect calls.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
parent f1285ff0
Loading
Loading
Loading
Loading
+5 −19
Original line number Original line Diff line number Diff line
@@ -1336,7 +1336,7 @@ xfs_get_blocks_dax_fault(
 * whereas if we have flags set we will always be called in task context
 * whereas if we have flags set we will always be called in task context
 * (i.e. from a workqueue).
 * (i.e. from a workqueue).
 */
 */
STATIC int
int
xfs_end_io_direct_write(
xfs_end_io_direct_write(
	struct kiocb		*iocb,
	struct kiocb		*iocb,
	loff_t			offset,
	loff_t			offset,
@@ -1407,24 +1407,10 @@ xfs_vm_direct_IO(
	struct kiocb		*iocb,
	struct kiocb		*iocb,
	struct iov_iter		*iter)
	struct iov_iter		*iter)
{
{
	struct inode		*inode = iocb->ki_filp->f_mapping->host;
	/*
	dio_iodone_t		*endio = NULL;
	 * We just need the method present so that open/fcntl allow direct I/O.
	int			flags = 0;
	 */
	struct block_device	*bdev;
	return -EINVAL;

	if (iov_iter_rw(iter) == WRITE) {
		endio = xfs_end_io_direct_write;
		flags = DIO_ASYNC_EXTEND;
	}

	if (IS_DAX(inode)) {
		return dax_do_io(iocb, inode, iter,
				 xfs_get_blocks_direct, endio, 0);
	}

	bdev = xfs_find_bdev_for_inode(inode);
	return  __blockdev_direct_IO(iocb, inode, bdev, iter,
			xfs_get_blocks_direct, endio, NULL, flags);
}
}


/*
/*
+3 −0
Original line number Original line Diff line number Diff line
@@ -60,6 +60,9 @@ int xfs_get_blocks_direct(struct inode *inode, sector_t offset,
int	xfs_get_blocks_dax_fault(struct inode *inode, sector_t offset,
int	xfs_get_blocks_dax_fault(struct inode *inode, sector_t offset,
			         struct buffer_head *map_bh, int create);
			         struct buffer_head *map_bh, int create);


int	xfs_end_io_direct_write(struct kiocb *iocb, loff_t offset,
		ssize_t size, void *private);

extern void xfs_count_page_state(struct page *, int *, int *);
extern void xfs_count_page_state(struct page *, int *, int *);
extern struct block_device *xfs_find_bdev_for_inode(struct inode *);
extern struct block_device *xfs_find_bdev_for_inode(struct inode *);


+15 −2
Original line number Original line Diff line number Diff line
@@ -360,7 +360,13 @@ xfs_file_dio_aio_read(
	}
	}


	data = *to;
	data = *to;
	ret = mapping->a_ops->direct_IO(iocb, &data);
	if (IS_DAX(inode)) {
		ret = dax_do_io(iocb, inode, &data, xfs_get_blocks_direct,
				NULL, 0);
	} else {
		ret = __blockdev_direct_IO(iocb, inode, target->bt_bdev, &data,
				xfs_get_blocks_direct, NULL, NULL, 0);
	}
	if (ret > 0) {
	if (ret > 0) {
		iocb->ki_pos += ret;
		iocb->ki_pos += ret;
		iov_iter_advance(to, ret);
		iov_iter_advance(to, ret);
@@ -819,7 +825,14 @@ xfs_file_dio_aio_write(
	trace_xfs_file_direct_write(ip, count, iocb->ki_pos);
	trace_xfs_file_direct_write(ip, count, iocb->ki_pos);


	data = *from;
	data = *from;
	ret = mapping->a_ops->direct_IO(iocb, &data);
	if (IS_DAX(inode)) {
		ret = dax_do_io(iocb, inode, &data, xfs_get_blocks_direct,
				xfs_end_io_direct_write, 0);
	} else {
		ret = __blockdev_direct_IO(iocb, inode, target->bt_bdev, &data,
				xfs_get_blocks_direct, xfs_end_io_direct_write,
				NULL, DIO_ASYNC_EXTEND);
	}


	/* see generic_file_direct_write() for why this is necessary */
	/* see generic_file_direct_write() for why this is necessary */
	if (mapping->nrpages) {
	if (mapping->nrpages) {