changeset 4499:eb82259f265d

Port write-region-inhibit-sync, allowing avoidance of bad FS performance. See http://shaver.off.net/diary/2008/05/25/fsyncers-and-curveballs/ for more details. 2008-08-09 Aidan Kehoe <kehoea@parhasard.net> Integrate Romain Francoise' 2005-09-14 (pre-GPLV3) GNU change, which can allow much better performace with some stupid filesystems: * fileio.c (write_region_inhibit_fsync): New variable. (Fwrite_region): Use it to skip call to fsync. (syms_of_fileio): Initialize it.
author Aidan Kehoe <kehoea@parhasard.net>
date Sat, 09 Aug 2008 16:44:46 +0200
parents 89406c31b125
children c86a3c1b7416
files src/ChangeLog src/fileio.c
diffstat 2 files changed, 24 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/ChangeLog	Sat Aug 09 12:13:19 2008 +0200
+++ b/src/ChangeLog	Sat Aug 09 16:44:46 2008 +0200
@@ -1,3 +1,12 @@
+2008-08-09  Aidan Kehoe  <kehoea@parhasard.net>
+
+	Integrate Romain Francoise' 2005-09-14 (pre-GPLV3) GNU change,
+	which can allow much better performace with some stupid
+	filesystems:
+	* fileio.c (write_region_inhibit_fsync): New variable.
+	(Fwrite_region): Use it to skip call to fsync.
+	(syms_of_fileio): Initialize it.
+
 2008-08-05  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* mule-charset.c (complex_vars_of_mule_charset): 
--- a/src/fileio.c	Sat Aug 09 12:13:19 2008 +0200
+++ b/src/fileio.c	Sat Aug 09 16:44:46 2008 +0200
@@ -111,6 +111,11 @@
 
 Lisp_Object Vdirectory_sep_char;
 
+#ifdef HAVE_FSYNC
+/* Nonzero means skip the call to fsync in Fwrite-region.  */
+int write_region_inhibit_fsync;
+#endif
+
 /* These variables describe handlers that have "already" had a chance
    to handle the current operation.
 
@@ -3568,7 +3573,7 @@
        Disk full in NFS may be reported here.  */
     /* mib says that closing the file will try to write as fast as NFS can do
        it, and that means the fsync here is not crucial for autosave files.  */
-    if (!auto_saving && fsync (desc) < 0
+    if (!auto_saving && !write_region_inhibit_fsync && fsync (desc) < 0
 	/* If fsync fails with EINTR, don't treat that as serious.  */
 	&& errno != EINTR)
       {
@@ -4560,6 +4565,15 @@
 */ );
   Vauto_save_list_file_name = Qnil;
 
+#ifdef HAVE_FSYNC
+  DEFVAR_BOOL ("write-region-inhibit-fsync", &write_region_inhibit_fsync /*
+*Non-nil means don't call fsync in `write-region'.
+This variable affects calls to `write-region' as well as save commands.
+A non-nil value may result in data loss!
+*/ );
+  write_region_inhibit_fsync = 0;
+#endif
+
   DEFVAR_LISP ("auto-save-list-file-prefix", &Vauto_save_list_file_prefix /*
 Prefix for generating auto-save-list-file-name.
 Emacs's pid and the system name will be appended to