You will have to incorporate the check for sendfile, but otherwise
this patch should avoid the most common kernel<->user space read/write
transitions.


m4/sendfile.m4:
===============
#serial 1

dnl From Kristofer Spinka <[EMAIL PROTECTED]>.
dnl Find out if this platform has sendfile support.
dnl

AC_CHECK_HEADER([sys/sendfile.h],
                [AC_DEFINE([HAVE_SYS_SENDFILE_H])],
                [AC_MSG_ERROR([No sendfile() system call support :(])])
===============


src/copy.c:
===========
--- copy.c      2003-03-24 02:33:07.000000000 -0500
+++ copy-sendfile.c     2003-03-24 02:31:24.000000000 -0500
@@ -217,6 +217,8 @@
   int *ip;
   int return_val = 0;
   off_t n_read_total = 0;
+  off_t always_zero_offset = 0;
+  ssize_t sendfile_bytes_written;
   int last_write_made_hole = 0;
   int make_holes = (x->sparse_mode == SPARSE_ALWAYS);
 
@@ -279,6 +281,26 @@
       goto close_src_desc;
     }
 
+#ifdef HAVE_SYS_SENDFILE_H
+  /* This is the way all copies should happen, let's try to avoid being
+     a Mexican jumping bean between the kernel and user spaces.
+     We need to have a sendfile() system call to make this possible.
+     Kristofer Spinka <[EMAIL PROTECTED]>  */
+
+  sendfile_bytes_written = sendfile (dest_desc, source_desc,
&always_zero_offset, src_open_sb.st_size);
+
+  if (sendfile_bytes_written == -1)
+    {
+      error (0, errno, _("sendfile zero-copy failed."));
+      return_val = -1;
+      goto close_src_and_dst_desc;
+    }
+  else
+    {
+      goto close_src_and_dst_desc;
+    }
+#endif
+
   /* Determine the optimal buffer size.  */
 
   if (fstat (dest_desc, &sb))
===========

   /kristofer



_______________________________________________
Bug-fileutils mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/bug-fileutils

Reply via email to