[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