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

Commit d8d3d94b authored by Al Viro's avatar Al Viro
Browse files

pass iov_iter to ->direct_IO()



unmodified, for now

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent cb66a7a1
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -196,8 +196,7 @@ prototypes:
	void (*invalidatepage) (struct page *, unsigned int, unsigned int);
	int (*releasepage) (struct page *, int);
	void (*freepage)(struct page *);
	int (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
			loff_t offset, unsigned long nr_segs);
	int (*direct_IO)(int, struct kiocb *, struct iov_iter *iter, loff_t offset);
	int (*get_xip_mem)(struct address_space *, pgoff_t, int, void **,
				unsigned long *);
	int (*migratepage)(struct address_space *, struct page *, struct page *);
+1 −2
Original line number Diff line number Diff line
@@ -589,8 +589,7 @@ struct address_space_operations {
	void (*invalidatepage) (struct page *, unsigned int, unsigned int);
	int (*releasepage) (struct page *, int);
	void (*freepage)(struct page *);
	ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
			loff_t offset, unsigned long nr_segs);
	ssize_t (*direct_IO)(int, struct kiocb *, struct iov_iter *iter, loff_t offset);
	struct page* (*get_xip_page)(struct address_space *, sector_t,
			int);
	/* migrate the contents of a page to the specified target */
+8 −9
Original line number Diff line number Diff line
@@ -363,15 +363,14 @@ static ssize_t ll_direct_IO_26_seg(const struct lu_env *env, struct cl_io *io,
#define MAX_DIO_SIZE ((MAX_MALLOC / sizeof(struct brw_page) * PAGE_CACHE_SIZE) & \
		      ~(DT_MAX_BRW_SIZE - 1))
static ssize_t ll_direct_IO_26(int rw, struct kiocb *iocb,
			       const struct iovec *iov, loff_t file_offset,
			       unsigned long nr_segs)
			       struct iov_iter *iter, loff_t file_offset)
{
	struct lu_env *env;
	struct cl_io *io;
	struct file *file = iocb->ki_filp;
	struct inode *inode = file->f_mapping->host;
	struct ccc_object *obj = cl_inode2ccc(inode);
	long count = iov_length(iov, nr_segs);
	long count = iov_length(iter->iov, iter->nr_segs);
	long tot_bytes = 0, result = 0;
	struct ll_inode_info *lli = ll_i2info(inode);
	unsigned long seg = 0;
@@ -392,9 +391,9 @@ static ssize_t ll_direct_IO_26(int rw, struct kiocb *iocb,
	       MAX_DIO_SIZE >> PAGE_CACHE_SHIFT);

	/* Check that all user buffers are aligned as well */
	for (seg = 0; seg < nr_segs; seg++) {
		if (((unsigned long)iov[seg].iov_base & ~CFS_PAGE_MASK) ||
		    (iov[seg].iov_len & ~CFS_PAGE_MASK))
	for (seg = 0; seg < iter->nr_segs; seg++) {
		if (((unsigned long)iter->iov[seg].iov_base & ~CFS_PAGE_MASK) ||
		    (iter->iov[seg].iov_len & ~CFS_PAGE_MASK))
			return -EINVAL;
	}

@@ -411,9 +410,9 @@ static ssize_t ll_direct_IO_26(int rw, struct kiocb *iocb,
		mutex_lock(&inode->i_mutex);

	LASSERT(obj->cob_transient_pages == 0);
	for (seg = 0; seg < nr_segs; seg++) {
		long iov_left = iov[seg].iov_len;
		unsigned long user_addr = (unsigned long)iov[seg].iov_base;
	for (seg = 0; seg < iter->nr_segs; seg++) {
		long iov_left = iter->iov[seg].iov_len;
		unsigned long user_addr = (unsigned long)iter->iov[seg].iov_base;

		if (rw == READ) {
			if (file_offset >= i_size_read(inode))
+2 −3
Original line number Diff line number Diff line
@@ -259,8 +259,7 @@ static int v9fs_launder_page(struct page *page)
 *
 */
static ssize_t
v9fs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
	       loff_t pos, unsigned long nr_segs)
v9fs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos)
{
	/*
	 * FIXME
@@ -269,7 +268,7 @@ v9fs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
	 */
	p9_debug(P9_DEBUG_VFS, "v9fs_direct_IO: v9fs_direct_IO (%s) off/no(%lld/%lu) EINVAL\n",
		 iocb->ki_filp->f_path.dentry->d_name.name,
		 (long long)pos, nr_segs);
		 (long long)pos, iter->nr_segs);

	return -EINVAL;
}
+5 −4
Original line number Diff line number Diff line
@@ -165,14 +165,15 @@ blkdev_get_block(struct inode *inode, sector_t iblock,
}

static ssize_t
blkdev_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
			loff_t offset, unsigned long nr_segs)
blkdev_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
			loff_t offset)
{
	struct file *file = iocb->ki_filp;
	struct inode *inode = file->f_mapping->host;

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

int __sync_blockdev(struct block_device *bdev, int wait)
Loading