[Pvfs2-cvs] commit by pw in pvfs2/src/kernel/linux-2.6: devpvfs2-req.c file.c pvfs2-cache.c

CVS commit program cvs at parl.clemson.edu
Sat Dec 2 22:33:20 EST 2006


Update of /projects/cvsroot/pvfs2/src/kernel/linux-2.6
In directory parlweb1:/tmp/cvs-serv9222/src/kernel/linux-2.6

Modified Files:
	devpvfs2-req.c file.c pvfs2-cache.c 
Log Message:
port kernel mod to 2.6.19


Index: devpvfs2-req.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/kernel/linux-2.6/devpvfs2-req.c,v
diff -u -p -p -u -r1.66 -r1.67
--- devpvfs2-req.c	13 Sep 2006 20:22:55 -0000	1.66
+++ devpvfs2-req.c	3 Dec 2006 03:33:20 -0000	1.67
@@ -544,6 +544,18 @@ static ssize_t pvfs2_devreq_writev(
     return count;
 }
 
+#ifdef HAVE_COMBINED_AIO_AND_VECTOR
+/*
+ * Kernels >= 2.6.19 have no writev, use this instead with SYNC_KEY.
+ */
+static ssize_t pvfs2_devreq_aio_write(struct kiocb *kiocb,
+                                      const struct iovec *iov,
+                                      unsigned long count, loff_t offset)
+{
+    return pvfs2_devreq_writev(kiocb->ki_filp, iov, count, &kiocb->ki_pos);
+}
+#endif
+
 /* Returns whether any FS are still pending remounted */
 static int mark_all_pending_mounts(void)
 {
@@ -1003,7 +1015,11 @@ struct file_operations pvfs2_devreq_file
     poll : pvfs2_devreq_poll
 #else
     .read = pvfs2_devreq_read,
+#ifdef HAVE_COMBINED_AIO_AND_VECTOR
+    .aio_write = pvfs2_devreq_aio_write,
+#else
     .writev = pvfs2_devreq_writev,
+#endif
     .open = pvfs2_devreq_open,
     .release = pvfs2_devreq_release,
     .ioctl = pvfs2_devreq_ioctl,

Index: file.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/kernel/linux-2.6/file.c,v
diff -u -p -p -u -r1.132 -r1.133
--- file.c	1 Dec 2006 17:15:50 -0000	1.132
+++ file.c	3 Dec 2006 03:33:20 -0000	1.133
@@ -39,6 +39,10 @@ do {                                    
   wake_up_interruptible(&op->io_completion_waitq);\
 } while(0)
 
+#ifndef HAVE_COMBINED_AIO_AND_VECTOR
+/* <2.6.19 called it this instead */
+#define do_sync_read generic_file_read
+#endif
 
 /** Called when a process requests to open a file.
  */
@@ -124,7 +128,7 @@ struct rw_options {
     struct kiocb *iocb;
     union {
         struct {
-            struct iovec *iov;
+            const struct iovec *iov;
             unsigned long nr_segs;
         } address;
         struct {
@@ -470,7 +474,7 @@ static ssize_t do_direct_readv_writev(st
     struct file *file;
     unsigned int to_free;
     size_t count;
-    struct iovec *iov;
+    const struct iovec *iov;
     unsigned long nr_segs, seg, new_nr_segs = 0;
     unsigned long max_new_nr_segs = 0;
     unsigned long  seg_count = 0;
@@ -737,7 +741,7 @@ ssize_t pvfs2_file_read(
     if (IS_IMMUTABLE(rw.inode)) 
     {
         rw.readahead_size = (rw.inode)->i_size;
-        return generic_file_read(file, buf, count, offset);
+        return do_sync_read(file, buf, count, offset);
     }
     else 
     {
@@ -776,6 +780,8 @@ static ssize_t pvfs2_file_write(
     return do_direct_readv_writev(&rw);
 }
 
+/* compat code, < 2.6.19 */
+#ifndef HAVE_COMBINED_AIO_AND_VECTOR
 /** Reads data to several contiguous user buffers (an iovec) from a file at a
  * specified offset.
  */
@@ -831,6 +837,7 @@ static ssize_t pvfs2_file_writev(
 
     return do_direct_readv_writev(&rw);
 }
+#endif
 
 
 /* Construct a trailer of <file offsets, length pairs> in a buffer that we
@@ -1207,7 +1214,7 @@ static ssize_t do_direct_readx_writex(st
     struct inode *inode = NULL;
     pvfs2_inode_t *pvfs2_inode = NULL;
     unsigned int to_free;
-    struct iovec *iov; 
+    const struct iovec *iov; 
     unsigned long seg, nr_segs, xtnr_segs;
     struct xtvec *xtvec; 
     unsigned long max_new_nr_segs_mem, max_new_nr_segs_stream;
@@ -1877,7 +1884,7 @@ static ssize_t do_direct_aio_read_write(
     struct inode *inode;
     ssize_t error;
     pvfs2_inode_t *pvfs2_inode;
-    struct iovec *iov;
+    const struct iovec *iov;
     unsigned long nr_segs, max_new_nr_segs;
     size_t count;
     struct kiocb *iocb;
@@ -2091,12 +2098,12 @@ out_error:
     return error;
 }
 
-static ssize_t 
-pvfs2_file_aio_read(struct kiocb *iocb, char __user *buffer,
-        size_t count, loff_t offset)
+static ssize_t pvfs2_file_aio_read_iovec(struct kiocb *iocb,
+                                         const struct iovec *iov,
+                                         unsigned long nr_segs, loff_t offset)
 {
     struct rw_options rw;
-    struct iovec vec;
+
     memset(&rw, 0, sizeof(rw));
     rw.async = !is_sync_kiocb(iocb);
     rw.type = IO_READ;
@@ -2105,8 +2112,6 @@ pvfs2_file_aio_read(struct kiocb *iocb, 
     rw.copy_to_user = 1;
     rw.fnstr = __FUNCTION__;
     rw.iocb = iocb;
-    vec.iov_base = (char __user *) buffer;
-    vec.iov_len  = count;
     rw.file = iocb->ki_filp;
     if (!rw.file || !(rw.file)->f_mapping)
     {
@@ -2114,13 +2119,19 @@ pvfs2_file_aio_read(struct kiocb *iocb, 
     }
     rw.inode = (rw.file)->f_mapping->host;
     rw.pvfs2_inode = PVFS2_I(rw.inode);
-    rw.dest.address.iov = &vec;
-    rw.dest.address.nr_segs = 1;
+    rw.dest.address.iov = iov;
+    rw.dest.address.nr_segs = nr_segs;
 
     if (IS_IMMUTABLE(rw.inode)) 
     {
         rw.readahead_size = (rw.inode)->i_size;
-        return generic_file_aio_read(iocb, buffer, count, offset);
+#ifdef HAVE_COMBINED_AIO_AND_VECTOR
+        return generic_file_aio_read(iocb, iov, nr_segs, offset);
+#else
+        /* compatibility code; know nr_segs == 1 as only caller is the
+         * compat function below */
+        return generic_file_aio_read(iocb, iov->iov_base, iov->iov_len, offset);
+#endif
     }
     else 
     {
@@ -2129,12 +2140,11 @@ pvfs2_file_aio_read(struct kiocb *iocb, 
     }
 }
 
-static ssize_t 
-pvfs2_file_aio_write(struct kiocb *iocb, const char __user *buffer,
-        size_t count, loff_t offset)
+static ssize_t pvfs2_file_aio_write_iovec(struct kiocb *iocb,
+                                          const struct iovec *iov,
+                                          unsigned long nr_segs, loff_t offset)
 {
     struct rw_options rw;
-    struct iovec vec;
 
     memset(&rw, 0, sizeof(rw));
     rw.async = !is_sync_kiocb(iocb);
@@ -2145,8 +2155,6 @@ pvfs2_file_aio_write(struct kiocb *iocb,
     rw.copy_to_user = 1;
     rw.fnstr = __FUNCTION__;
     rw.iocb = iocb;
-    vec.iov_base = (char __user *) buffer;
-    vec.iov_len  = count;
     rw.file = iocb->ki_filp;
     if (!rw.file || !(rw.file)->f_mapping)
     {
@@ -2154,12 +2162,37 @@ pvfs2_file_aio_write(struct kiocb *iocb,
     }
     rw.inode = (rw.file)->f_mapping->host;
     rw.pvfs2_inode = PVFS2_I(rw.inode);
-    rw.dest.address.iov = &vec;
-    rw.dest.address.nr_segs = 1;
+    rw.dest.address.iov = iov;
+    rw.dest.address.nr_segs = nr_segs;
     return do_direct_aio_read_write(&rw);
 }
 
+/* compat functions for < 2.6.19 */
+#ifndef HAVE_COMBINED_AIO_AND_VECTOR
+static ssize_t 
+pvfs2_file_aio_read(struct kiocb *iocb, char __user *buffer,
+        size_t count, loff_t offset)
+
+{
+    struct iovec iov = {
+        .iov_base = buffer,
+        .iov_len = count,
+    };
+    return pvfs2_file_aio_read_iovec(iocb, &iov, 1, offset);
+}
+
+static ssize_t 
+pvfs2_file_aio_write(struct kiocb *iocb, const char __user *buffer,
+        size_t count, loff_t offset)
+{
+    struct iovec iov = {
+        .iov_base = (void __user *) buffer,  /* discard const so it fits */
+        .iov_len = count,
+    };
+    return pvfs2_file_aio_write_iovec(iocb, &iov, 1, offset);
+}
 #endif
+#endif  /* HAVE_AIO_VFS_SUPPORT */
 
 /** Perform a miscellaneous operation on a file.
  */
@@ -2486,11 +2519,17 @@ struct file_operations pvfs2_file_operat
     .llseek = pvfs2_file_llseek,
     .read = pvfs2_file_read,
     .write = pvfs2_file_write,
+#ifdef HAVE_COMBINED_AIO_AND_VECTOR
+    /* for >= 2.6.19 */
+    .aio_read = pvfs2_file_aio_read_iovec,
+    .aio_write = pvfs2_file_aio_write_iovec,
+#else
     .readv = pvfs2_file_readv,
     .writev = pvfs2_file_writev,
-#ifdef HAVE_AIO_VFS_SUPPORT
+#  ifdef HAVE_AIO_VFS_SUPPORT
     .aio_read = pvfs2_file_aio_read,
     .aio_write = pvfs2_file_aio_write,
+#  endif
 #endif
     .ioctl = pvfs2_ioctl,
     .mmap = pvfs2_file_mmap,

Index: pvfs2-cache.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/kernel/linux-2.6/pvfs2-cache.c,v
diff -u -p -p -u -r1.36 -r1.37
--- pvfs2-cache.c	20 Sep 2006 22:59:53 -0000	1.36
+++ pvfs2-cache.c	3 Dec 2006 03:33:20 -0000	1.37
@@ -27,6 +27,17 @@ static kmem_cache_t *pvfs2_inode_cache =
 static kmem_cache_t *pvfs2_kiocb_cache = NULL;
 #endif
 
+#ifdef HAVE_KMEM_CACHE_DESTROY_INT_RETURN
+#define pvfs_kmem_cache_destroy kmem_cache_destroy
+#else
+/* recent kernels do not return a value */
+static int pvfs_kmem_cache_destroy(void *x)
+{
+    kmem_cache_destroy(x);
+    return 0;
+}
+#endif
+
 int op_cache_initialize(void)
 {
     op_cache = kmem_cache_create(
@@ -48,7 +59,7 @@ int op_cache_initialize(void)
 
 int op_cache_finalize(void)
 {
-    if (kmem_cache_destroy(op_cache) != 0)
+    if (pvfs_kmem_cache_destroy(op_cache) != 0)
     {
         gossip_err("Failed to destroy pvfs2_op_cache\n");
         return -EINVAL;
@@ -212,7 +223,7 @@ int dev_req_cache_initialize(void)
 
 int dev_req_cache_finalize(void)
 {
-    if (kmem_cache_destroy(dev_req_cache) != 0)
+    if (pvfs_kmem_cache_destroy(dev_req_cache) != 0)
     {
         gossip_err("Failed to destroy pvfs2_devreqcache\n");
         return -EINVAL;
@@ -336,7 +347,7 @@ int pvfs2_inode_cache_finalize(void)
             kmem_cache_free(pvfs2_inode_cache, pinode);
         }
     }
-    if (kmem_cache_destroy(pvfs2_inode_cache) != 0)
+    if (pvfs_kmem_cache_destroy(pvfs2_inode_cache) != 0)
     {
         gossip_err("Failed to destroy pvfs2_inode_cache\n");
         return -EINVAL;
@@ -413,7 +424,7 @@ int kiocb_cache_initialize(void)
 
 int kiocb_cache_finalize(void)
 {
-    if (kmem_cache_destroy(pvfs2_kiocb_cache) != 0)
+    if (pvfs_kmem_cache_destroy(pvfs2_kiocb_cache) != 0)
     {
         gossip_err("Failed to destroy pvfs2_devreqcache\n");
         return -EINVAL;



More information about the Pvfs2-cvs mailing list