Blame SOURCES/cups-synconclose.patch

5e7041
diff -up cups-1.6.3/conf/cups-files.conf.in.synconclose cups-1.6.3/conf/cups-files.conf.in
5e7041
--- cups-1.6.3/conf/cups-files.conf.in.synconclose	2013-06-07 02:12:52.000000000 +0100
5e7041
+++ cups-1.6.3/conf/cups-files.conf.in	2013-11-04 11:37:32.063897669 +0000
5e7041
@@ -8,6 +8,9 @@
5e7041
 # List of events that are considered fatal errors for the scheduler...
5e7041
 #FatalErrors @CUPS_FATAL_ERRORS@
5e7041
 
5e7041
+# Do we call fsync() after writing configuration or status files?
5e7041
+#SyncOnClose Yes
5e7041
+
5e7041
 # Default user and group for filters/backends/helper programs; this cannot be
5e7041
 # any user or group that resolves to ID 0 for security reasons...
5e7041
 #User @CUPS_USER@
5e7041
diff -up cups-1.6.3/doc/help/ref-cups-files-conf.html.in.synconclose cups-1.6.3/doc/help/ref-cups-files-conf.html.in
5e7041
--- cups-1.6.3/doc/help/ref-cups-files-conf.html.in.synconclose	2013-05-10 17:52:10.000000000 +0100
5e7041
+++ cups-1.6.3/doc/help/ref-cups-files-conf.html.in	2013-11-04 11:39:51.104528571 +0000
5e7041
@@ -437,6 +437,31 @@ to resolve relative paths in the cu
5e7041
 default server directory is /etc/cups.

5e7041
 
5e7041
 
5e7041
+

CUPS 1.6.4SyncOnClose

5e7041
+
5e7041
+

Examples

5e7041
+
5e7041
+
5e7041
+SyncOnClose No
5e7041
+SyncOnClose Yes
5e7041
+
5e7041
+
5e7041
+

Description

5e7041
+
5e7041
+

The SyncOnClose directive determines whether the scheduler

5e7041
+flushes changes to configuration and state files to disk. The default is
5e7041
+Yes. The option No relies on the operating
5e7041
+system to schedule a suitable time to write changes to disk.

5e7041
+
5e7041
+
Note:
5e7041
+
5e7041
+

Setting SyncOnClose to Yes makes the scheduler use the fsync(2) system call to write all changes to disk, however the drive or network file system server may still delay writing data to disk. Do not depend on this functionality to prevent data loss in the event of unexpected hardware failure.

5e7041
+
5e7041
+

Enabling SyncOnClose may also cause the scheduler to periodically become unresponsive while it waits for changes to be written.

5e7041
+
5e7041
+
5e7041
+
5e7041
+
5e7041
 

SystemGroup

5e7041
 
5e7041
 

Examples

5e7041
diff -up cups-1.6.3/man/cups-files.conf.man.in.synconclose cups-1.6.3/man/cups-files.conf.man.in
5e7041
--- cups-1.6.3/man/cups-files.conf.man.in.synconclose	2013-06-07 02:12:52.000000000 +0100
5e7041
+++ cups-1.6.3/man/cups-files.conf.man.in	2013-11-04 11:39:51.104528571 +0000
5e7041
@@ -122,6 +122,12 @@ ServerRoot directory
5e7041
 .br
5e7041
 Specifies the directory where the server configuration files can be found.
5e7041
 .TP 5
5e7041
+SyncOnClose Yes
5e7041
+.TP 5
5e7041
+SyncOnClose No
5e7041
+Specifies whether the scheduler calls \fIfsync(2)\fR after writing configuration
5e7041
+or state files. The default is Yes.
5e7041
+.TP 5
5e7041
 SystemGroup group-name [group-name ...]
5e7041
 .br
5e7041
 Specifies the group(s) to use for System class authentication.
5e7041
diff -up cups-1.6.3/scheduler/conf.c.synconclose cups-1.6.3/scheduler/conf.c
5e7041
--- cups-1.6.3/scheduler/conf.c.synconclose	2013-11-04 11:37:21.497849726 +0000
5e7041
+++ cups-1.6.3/scheduler/conf.c	2013-11-04 11:39:51.106528580 +0000
5e7041
@@ -174,6 +174,7 @@ static const cupsd_var_t	cupsfiles_vars[
5e7041
   { "ServerRoot",		&ServerRoot,		CUPSD_VARTYPE_PATHNAME },
5e7041
   { "SMBConfigFile",		&SMBConfigFile,		CUPSD_VARTYPE_STRING },
5e7041
   { "StateDir",			&StateDir,		CUPSD_VARTYPE_STRING },
5e7041
+  { "SyncOnClose",		&SyncOnClose,		CUPSD_VARTYPE_BOOLEAN },
5e7041
 #ifdef HAVE_AUTHORIZATION_H
5e7041
   { "SystemGroupAuthKey",	&SystemGroupAuthKey,	CUPSD_VARTYPE_STRING },
5e7041
 #endif /* HAVE_AUTHORIZATION_H */
5e7041
@@ -738,6 +739,7 @@ cupsdReadConfiguration(void)
5e7041
   ReloadTimeout	           = DEFAULT_KEEPALIVE;
5e7041
   RootCertDuration         = 300;
5e7041
   StrictConformance        = FALSE;
5e7041
+  SyncOnClose              = TRUE;
5e7041
   Timeout                  = DEFAULT_TIMEOUT;
5e7041
   WebInterface             = CUPS_DEFAULT_WEBIF;
5e7041
 
5e7041
diff -up cups-1.6.3/scheduler/conf.h.synconclose cups-1.6.3/scheduler/conf.h
5e7041
--- cups-1.6.3/scheduler/conf.h.synconclose	2013-11-04 11:37:21.498849730 +0000
5e7041
+++ cups-1.6.3/scheduler/conf.h	2013-11-04 11:37:32.064897673 +0000
5e7041
@@ -177,6 +177,8 @@ VAR int			ClassifyOverride	VALUE(0),
5e7041
 					/* Which errors are fatal? */
5e7041
 			StrictConformance	VALUE(FALSE),
5e7041
 					/* Require strict IPP conformance? */
5e7041
+			SyncOnClose		VALUE(FALSE),
5e7041
+					/* Call fsync() when closing files? */
5e7041
 			LogFilePerm		VALUE(0644);
5e7041
 					/* Permissions for log files */
5e7041
 VAR cupsd_loglevel_t	LogLevel		VALUE(CUPSD_LOG_WARN);
5e7041
diff -up cups-1.6.3/scheduler/file.c.synconclose cups-1.6.3/scheduler/file.c
5e7041
--- cups-1.6.3/scheduler/file.c.synconclose	2013-06-07 02:12:52.000000000 +0100
5e7041
+++ cups-1.6.3/scheduler/file.c	2013-11-04 11:37:32.064897673 +0000
5e7041
@@ -109,6 +109,29 @@ cupsdCloseCreatedConfFile(
5e7041
 
5e7041
 
5e7041
  /*
5e7041
+  * Synchronize changes to disk if SyncOnClose is enabled.
5e7041
+  */
5e7041
+
5e7041
+  if (SyncOnClose)
5e7041
+  {
5e7041
+    if (cupsFileFlush(fp))
5e7041
+    {
5e7041
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to write changes to \"%s\": %s",
5e7041
+		      filename, strerror(errno));
5e7041
+      cupsFileClose(fp);
5e7041
+      return (-1);
5e7041
+    }
5e7041
+
5e7041
+    if (fsync(cupsFileNumber(fp)))
5e7041
+    {
5e7041
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to sync changes to \"%s\": %s",
5e7041
+		      filename, strerror(errno));
5e7041
+      cupsFileClose(fp);
5e7041
+      return (-1);
5e7041
+    }
5e7041
+  }
5e7041
+
5e7041
+ /*
5e7041
   * First close the file...
5e7041
   */
5e7041