svn commit: samba r7416 - in trunk/source: include lib smbd
jra at samba.org
jra at samba.org
Wed Jun 8 23:01:39 GMT 2005
Author: jra
Date: 2005-06-08 23:01:38 +0000 (Wed, 08 Jun 2005)
New Revision: 7416
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=7416
Log:
Only do aio reads/writes on non-chained non-write cached calls.
Add abstract types for aiocb struct and wrapper functions for 64-bit aio.
Jeremy.
Modified:
trunk/source/include/includes.h
trunk/source/lib/system.c
trunk/source/smbd/aio.c
Changeset:
Modified: trunk/source/include/includes.h
===================================================================
--- trunk/source/include/includes.h 2005-06-08 22:10:34 UTC (rev 7415)
+++ trunk/source/include/includes.h 2005-06-08 23:01:38 UTC (rev 7416)
@@ -765,6 +765,18 @@
# endif
#endif
+/*
+ * Type for aiocb structure.
+ */
+
+#ifndef SMB_STRUCT_AIOCB
+# if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64)
+# define SMB_STRUCT_AIOCB struct aiocb64
+# else
+# define SMB_STRUCT_AIOCB struct aiocb
+# endif
+#endif
+
#ifndef MIN
#define MIN(a,b) ((a)<(b)?(a):(b))
#endif
Modified: trunk/source/lib/system.c
===================================================================
--- trunk/source/lib/system.c 2005-06-08 22:10:34 UTC (rev 7415)
+++ trunk/source/lib/system.c 2005-06-08 23:01:38 UTC (rev 7416)
@@ -1846,3 +1846,67 @@
return (uint32)(dev & 0xff);
#endif
}
+
+/*******************************************************************
+ An aio_read wrapper that will deal with 64-bit sizes.
+********************************************************************/
+
+int sys_aio_read(SMB_STRUCT_AIOCB *aiocb)
+{
+#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_READ64)
+ return aio_read64(aiocb);
+#elif defined(HAVE_AIO_READ)
+ return aio_read(aiocb);
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
+
+/*******************************************************************
+ An aio_write wrapper that will deal with 64-bit sizes.
+********************************************************************/
+
+int sys_aio_write(SMB_STRUCT_AIOCB *aiocb)
+{
+#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_WRITE64)
+ return aio_write64(aiocb);
+#elif defined(HAVE_AIO_WRITE)
+ return aio_write(aiocb);
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
+
+/*******************************************************************
+ An aio_return wrapper that will deal with 64-bit sizes.
+********************************************************************/
+
+ssize_t sys_aio_return(SMB_STRUCT_AIOCB *aiocb)
+{
+#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_RETURN64)
+ return aio_return64(aiocb);
+#elif defined(HAVE_AIO_RETURN)
+ return aio_return(aiocb);
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
+
+/*******************************************************************
+ An aio_cancel wrapper that will deal with 64-bit sizes.
+********************************************************************/
+
+int sys_aio_cancel(int fd, SMB_STRUCT_AIOCB *aiocb)
+{
+#if defined(HAVE_EXPLICIT_LARGEFILE_SUPPORT) && defined(HAVE_AIOCB64) && defined(HAVE_AIO_CANCEL64)
+ return aio_cancel64(aiocb);
+#elif defined(HAVE_AIO_CANCEL)
+ return aio_cancel(aiocb);
+#else
+ errno = ENOSYS;
+ return -1;
+#endif
+}
Modified: trunk/source/smbd/aio.c
===================================================================
--- trunk/source/smbd/aio.c 2005-06-08 22:10:34 UTC (rev 7415)
+++ trunk/source/smbd/aio.c 2005-06-08 23:01:38 UTC (rev 7416)
@@ -29,9 +29,6 @@
#define RT_SIGNAL_AIO (SIGRTMIN+3)
#endif
-/* Until we have detection of 64-bit aio structs... */
-#define SMB_STRUCT_AIOCB struct aiocb
-
/****************************************************************************
The buffer we keep around whilst an aio request is in process.
*****************************************************************************/
@@ -208,6 +205,11 @@
return False;
}
+ /* Only do this on non-chained and non-chaining reads not using the write cache. */
+ if (chain_size !=0 || (CVAL(inbuf,smb_vwv0) != 0xFF) || (lp_write_cache_size(SNUM(conn)) != 0) ) {
+ return False;
+ }
+
if (outstanding_aio_calls >= AIO_PENDING_SIZE) {
DEBUG(10,("schedule_aio_read_and_X: Already have %d aio activities outstanding.\n",
outstanding_aio_calls ));
@@ -279,6 +281,11 @@
return False;
}
+ /* Only do this on non-chained and non-chaining reads not using the write cache. */
+ if (chain_size !=0 || (CVAL(inbuf,smb_vwv0) != 0xFF) || (lp_write_cache_size(SNUM(conn)) != 0) ) {
+ return False;
+ }
+
if (outstanding_aio_calls >= AIO_PENDING_SIZE) {
DEBUG(10,("schedule_aio_write_and_X: Already have %d aio activities outstanding.\n",
outstanding_aio_calls ));
More information about the samba-cvs
mailing list