[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