[PATCH 2/2] PMFS: Add support for AIO and direct_IO

Vishal Verma vishal.l.verma at linux.intel.com
Fri Aug 23 19:21:18 EDT 2013


Signed-off-by: Vishal Verma <vishal.l.verma at linux.intel.com>
Signed-off-by: Ross Zwisler <ross.zwisler at linux.intel.com>
Reviewed-by: Matthew Wilcox <matthew.r.wilcox at intel.com>
---
 fs/pmfs/file.c  |    2 ++
 fs/pmfs/inode.c |   37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 0 deletions(-)

diff --git a/fs/pmfs/file.c b/fs/pmfs/file.c
index fa49037..e5805c5 100644
--- a/fs/pmfs/file.c
+++ b/fs/pmfs/file.c
@@ -318,6 +318,8 @@ const struct file_operations pmfs_xip_file_operations = {
 	.llseek			= pmfs_llseek,
 	.read			= pmfs_xip_file_read,
 	.write			= pmfs_xip_file_write,
+	.aio_read		= xip_file_aio_read,
+	.aio_write		= xip_file_aio_write,
 	.mmap			= pmfs_xip_file_mmap,
 	.open			= generic_file_open,
 	.fsync			= pmfs_fsync,
diff --git a/fs/pmfs/inode.c b/fs/pmfs/inode.c
index fc6e513..0e20089 100644
--- a/fs/pmfs/inode.c
+++ b/fs/pmfs/inode.c
@@ -1587,7 +1587,44 @@ void pmfs_get_inode_flags(struct inode *inode, struct pmfs_inode *pi)
 	pi->i_flags = cpu_to_le32(pmfs_flags);
 }
 
+static ssize_t pmfs_direct_IO(int rw, struct kiocb *iocb,
+	const struct iovec *iov, loff_t offset, unsigned long nr_segs)
+{
+	struct file *filp = iocb->ki_filp;
+	struct inode *inode = filp->f_mapping->host;
+	loff_t end = offset;
+	ssize_t err = -EINVAL;
+	unsigned long seg;
+
+	for (seg = 0; seg < nr_segs; seg++)
+		end += iov[seg].iov_len;
+
+	if ((rw == WRITE) && end > i_size_read(inode)) {
+		/* FIXME: Do we need to check for out of bounds IO for R/W */
+		printk(KERN_ERR "pmfs: needs to grow (size = %lld)\n", end);
+		return err;
+	}
+
+	for (seg = 0; seg < nr_segs; seg++) {
+		const struct iovec *iv = &iov[seg];
+		if (rw == READ)
+			err = pmfs_xip_file_read(filp, iv->iov_base,
+					iv->iov_len, &offset);
+		else if (rw == WRITE)
+			err = pmfs_xip_file_write(filp, iv->iov_base,
+					iv->iov_len, &offset);
+		if (err <= 0)
+			goto err;
+	}
+	if (offset != end)
+		printk(KERN_ERR "pmfs: direct_IO: end = %lld"
+			"but offset = %lld\n", end, offset);
+err:
+	return err;
+}
+
 const struct address_space_operations pmfs_aops_xip = {
 	.get_xip_mem		= pmfs_get_xip_mem,
+	.direct_IO		= pmfs_direct_IO,
 	/*.xip_mem_protect	= pmfs_xip_mem_protect,*/
 };
-- 
1.7.0.4




More information about the Linux-pmfs mailing list