Index: configure.in
===================================================================
RCS file: /server/cvs-server/squid/squid/configure.in,v
retrieving revision 1.319
diff -u -r1.319 configure.in
--- configure.in	18 May 2006 04:03:22 -0000	1.319
+++ configure.in	18 May 2006 09:33:24 -0000
@@ -780,6 +780,27 @@
   esac
 ])
 
+
+dnl Enable pread()/pwrite()
+AC_ARG_ENABLE(pread,
+[  --enable-pread         Enable using pread/pwrite for Squid Async IO.
+                         This is slightly more efficient and is required
+                         for COSS under Linux.
+  --disable-pread        Disable the use of pread/pwrite.],
+[
+  case "$enableval" in
+  yes)
+    echo "Forcing pread()/pwrite() to be enabled"
+    ac_cv_func_pread='yes'
+    AC_DEFINE_UNQUOTED(USE_PREAD, 1)
+    ;;
+  no)
+    echo "Forcing pread()/pwrite() to be disabled"
+    ac_cv_func_pread='no'
+    ;;
+  esac
+])
+
 dnl Disable HTTP violations
 AC_ARG_ENABLE(http-violations,
 [  --disable-http-violations
Index: include/autoconf.h.in
===================================================================
RCS file: /server/cvs-server/squid/squid/include/autoconf.h.in,v
retrieving revision 1.136
diff -u -r1.136 autoconf.h.in
--- include/autoconf.h.in	18 May 2006 04:32:19 -0000	1.136
+++ include/autoconf.h.in	18 May 2006 09:33:24 -0000
@@ -938,5 +938,7 @@
 /* Enable hostname sanity checks */
 #undef CHECK_HOSTNAMES
 
+/* Enable using pread/write */
+#undef USE_PREAD
 
 #endif /* __CONFIGURE_H__ */
Index: src/fs/aufs/aiops.c
===================================================================
RCS file: /server/cvs-server/squid/squid/src/fs/aufs/aiops.c,v
retrieving revision 1.23
diff -u -r1.23 aiops.c
--- src/fs/aufs/aiops.c	16 May 2006 05:42:14 -0000	1.23
+++ src/fs/aufs/aiops.c	18 May 2006 09:33:24 -0000
@@ -669,8 +669,12 @@
 static void
 squidaio_do_read(squidaio_request_t * requestp)
 {
+#if USE_PREAD
+    requestp->ret = pread(requestp->fd, requestp->bufferp, requestp->buflen, requestp->offset);
+#else
     lseek(requestp->fd, requestp->offset, requestp->whence);
     requestp->ret = read(requestp->fd, requestp->bufferp, requestp->buflen);
+#endif
     requestp->err = errno;
 }
 
@@ -698,7 +702,12 @@
 static void
 squidaio_do_write(squidaio_request_t * requestp)
 {
+#if USE_PREAD
+    assert(requestp->offset > 0);
+    requestp->ret = pwrite(requestp->fd, requestp->bufferp, requestp->buflen, requestp->offset);
+#else
     requestp->ret = write(requestp->fd, requestp->bufferp, requestp->buflen);
+#endif
     requestp->err = errno;
 }
 

