[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    KDE/kdelibs
From:       Oswald Buddenhagen <ossi () kde ! org>
Date:       2009-04-04 12:51:44
Message-ID: 1238849504.651794.13868.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 949059 by ossi:

re-introduce KDE_EXTRA_FSYNC for the poor XFS/Ext4/... users

setting this env variable to anything (before kde starts!) will avoid
getting those pesky 0-byte sized files after system crashes - at a
potentially non-trivial performance cost.

kinda fixes bug 187172


 M  +1 -0      ConfigureChecks.cmake  
 M  +1 -0      config.h.cmake  
 M  +31 -0     kdecore/io/ksavefile.cpp  


--- trunk/KDE/kdelibs/ConfigureChecks.cmake #949058:949059
@@ -102,6 +102,7 @@
 check_function_exists(backtrace        HAVE_BACKTRACE)                # kdecore, kio
 check_function_exists(getpagesize      HAVE_GETPAGESIZE)              # khtml
 check_function_exists(getpeereid       HAVE_GETPEEREID)               # kdesu
+check_function_exists(fdatasync        HAVE_FDATASYNC)                # kdecore
 check_function_exists(madvise         HAVE_MADVISE)                   # kdecore
 check_function_exists(mmap            HAVE_MMAP)                      # kdecore, khtml
 if(NOT WIN32)
--- trunk/KDE/kdelibs/config.h.cmake #949058:949059
@@ -88,6 +88,7 @@
 #cmakedefine   HAVE_GETMNTINFO 1
 #cmakedefine   HAVE_GETPAGESIZE 1
 #cmakedefine   HAVE_INITGROUPS 1
+#cmakedefine   HAVE_FDATASYNC 1
 #cmakedefine   HAVE_MADVISE 1
 #cmakedefine   HAVE_MMAP 1
 #cmakedefine   HAVE_MKSTEMPS 1
--- trunk/KDE/kdelibs/kdecore/io/ksavefile.cpp #949058:949059
@@ -36,6 +36,9 @@
 #include <kconfiggroup.h>
 #include <kcomponentdata.h>
 
+#include <stdlib.h>
+#include <errno.h>
+
 class KSaveFile::Private
 {
 public:
@@ -182,11 +185,37 @@
     d->wasFinalized = true;
 }
 
+#ifdef HAVE_FDATASYNC
+#  define FDATASYNC fdatasync
+#else
+#  define FDATASYNC fsync
+#endif
+
 bool KSaveFile::finalize()
 {
     bool success = false;
 
     if ( !d->wasFinalized ) {
+
+#ifdef Q_OS_UNIX
+        static int extraSync = -1;
+        if (extraSync < 0)
+            extraSync = getenv("KDE_EXTRA_FSYNC") != 0 ? 1 : 0;
+        if (extraSync) {
+            if (flush()) {
+                forever {
+                    if (!FDATASYNC(handle()))
+                        break;
+                    if (errno != EINTR) {
+                        d->error = QFile::WriteError;
+                        d->errorString = i18n("Synchronization to disk failed");
+                        break;
+                    }
+                }
+            }
+        }
+#endif
+
         close();
         
         if( error() != NoError ) {
@@ -213,6 +242,8 @@
     return success;
 }
 
+#undef FDATASYNC
+
 bool KSaveFile::backupFile( const QString& qFilename, const QString& backupDir )
 {
     // get backup type from config, by default use "simple"
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic