]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Added a SyncOnClose directive to cups-files.conf to force cupsd to call fsync
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Fri, 26 Jul 2013 21:27:27 +0000 (21:27 +0000)
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Fri, 26 Jul 2013 21:27:27 +0000 (21:27 +0000)
before closing any configuration/state files it writes
(<rdar://problem/14523043>)

git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@11201 a1ca3aef-8c08-0410-bb20-df032aa958be

CHANGES-1.6.txt
conf/cups-files.conf.in
doc/help/ref-cups-files-conf.html.in
man/cups-files.conf.man.in
scheduler/conf.c
scheduler/conf.h
scheduler/file.c

index 76ac07ec8722d54d810a2a5c1702b48efc50966d..5e2b8c087d82e02277ae7daeb59ebbda8af65d10 100644 (file)
@@ -3,6 +3,9 @@ CHANGES-1.6.txt
 
 CHANGES IN CUPS V1.6.4
 
+       - Added a SyncOnClose directive to cups-files.conf to force cupsd to
+         call fsync before closing any configuration/state files it writes
+         (<rdar://problem/14523043>)
        - Added USB quirk rule for Lexmark E238 (<rdar://problem/14493054>)
        - Closed server connections were still not always detected
          (<rdar://problem/14484313>)
index 123812cf87aecf805e09d840e7a36bbc8e86f211..36afecc40fccfd0f6d1d392b2280f85f5f0e35b9 100644 (file)
@@ -8,6 +8,9 @@
 # List of events that are considered fatal errors for the scheduler...
 #FatalErrors @CUPS_FATAL_ERRORS@
 
+# Do we call fsync() after writing configuration or status files?
+#SyncOnClose No
+
 # Default user and group for filters/backends/helper programs; this cannot be
 # any user or group that resolves to ID 0 for security reasons...
 #User @CUPS_USER@
index 171950c54eddb726a711c4b35ce7612d9edc3cb0..70c996f4a3b7f2d6c2f636cad35b11764c1213b0 100644 (file)
@@ -429,6 +429,31 @@ to resolve relative paths in the <VAR>cupsd.conf</VAR> file. The
 default server directory is <VAR>/etc/cups</VAR>.</P>
 
 
+<H2 CLASS="title"><SPAN CLASS="info">CUPS 1.6.4</SPAN><A NAME="SyncOnClose">SyncOnClose</A></H2>
+
+<H3>Examples</H3>
+
+<PRE CLASS="command">
+SyncOnClose No
+SyncOnClose Yes
+</PRE>
+
+<H3>Description</H3>
+
+<P>The <CODE>SyncOnClose</CODE> directive determines whether the scheduler
+flushes changes to configuration and state files to disk. The default is
+<CODE>No</CODE> which relies on the operating system to schedule a suitable
+time to write changes to disk.</P>
+
+<BLOCKQUOTE><B>Note:</B>
+
+<P>Setting <CODE>SyncOnClose</CODE> to <CODE>Yes</CODE> makes the scheduler use the <CODE>fsync(2)</CODE> 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.</P>
+
+<P>Enabling <CODE>SyncOnClose</CODE> may also cause the scheduler to periodically become unresponsive while it waits for changes to be written.</P>
+
+</BLOCKQUOTE>
+
+
 <H2 CLASS="title"><A NAME="SystemGroup">SystemGroup</A></H2>
 
 <H3>Examples</H3>
index 294dc0b33ad2d48b11aafcb029de0d042c7d0051..c17490cf15aa493e85c2d4eed8e59a766784b3de 100644 (file)
@@ -12,7 +12,7 @@
 .\"   which should have been included with this file.  If this file is
 .\"   file is missing or damaged, see the license at "http://www.cups.org/".
 .\"
-.TH cups-files.conf 5 "CUPS" "8 July 2013" "Apple Inc."
+.TH cups-files.conf 5 "CUPS" "26 July 2013" "Apple Inc."
 .SH NAME
 cups-files.conf \- file and directory configuration file for cups
 .SH DESCRIPTION
@@ -122,6 +122,12 @@ ServerRoot directory
 .br
 Specifies the directory where the server configuration files can be found.
 .TP 5
+SyncOnClose Yes
+.TP 5
+SyncOnClose No
+Specifies whether the scheduler calls \fIfsync(2)\fR after writing configuration
+or state files. The default is No.
+.TP 5
 SystemGroup group-name [group-name ...]
 .br
 Specifies the group(s) to use for System class authentication.
index b812119356605c2e960fc30966759fdaa32c95db..fd1c0c02775103a88b720b2f23fb9066f4ea4665 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Configuration routines for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
+ *   Copyright 2007-2013 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -174,6 +174,7 @@ static const cupsd_var_t    cupsfiles_vars[] =
   { "ServerRoot",              &ServerRoot,            CUPSD_VARTYPE_PATHNAME },
   { "SMBConfigFile",           &SMBConfigFile,         CUPSD_VARTYPE_STRING },
   { "StateDir",                        &StateDir,              CUPSD_VARTYPE_STRING },
+  { "SyncOnClose",             &SyncOnClose,           CUPSD_VARTYPE_BOOLEAN },
 #ifdef HAVE_AUTHORIZATION_H
   { "SystemGroupAuthKey",      &SystemGroupAuthKey,    CUPSD_VARTYPE_STRING },
 #endif /* HAVE_AUTHORIZATION_H */
@@ -734,6 +735,7 @@ cupsdReadConfiguration(void)
   ReloadTimeout                   = DEFAULT_KEEPALIVE;
   RootCertDuration         = 300;
   StrictConformance        = FALSE;
+  SyncOnClose              = FALSE;
   Timeout                  = DEFAULT_TIMEOUT;
   WebInterface             = CUPS_DEFAULT_WEBIF;
 
index e095ecfaaaa4c1a6c418d7c5e8eeb3c8442d389d..23a93d6efde9964a8aaa5a1d0a09ecb8f48bbfb5 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Configuration file definitions for the CUPS scheduler.
  *
- *   Copyright 2007-2012 by Apple Inc.
+ *   Copyright 2007-2013 by Apple Inc.
  *   Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -172,6 +172,8 @@ VAR int                     ClassifyOverride        VALUE(0),
                                        /* Which errors are fatal? */
                        StrictConformance       VALUE(FALSE),
                                        /* Require strict IPP conformance? */
+                       SyncOnClosee            VALUE(FALSE),
+                                       /* Call fsync() when closing files? */
                        LogFilePerm             VALUE(0644);
                                        /* Permissions for log files */
 VAR cupsd_loglevel_t   LogLevel                VALUE(CUPSD_LOG_WARN);
index ca5aa5e2c5284f8d191431fae6fac89b7695014c..0d236c918bd4b0f951bbee1ccec220157c688781 100644 (file)
@@ -108,6 +108,29 @@ cupsdCloseCreatedConfFile(
        oldfile[1024];                  /* filename.O */
 
 
+ /*
+  * Synchronize changes to disk if SyncOnClose is enabled.
+  */
+
+  if (SyncOnClose)
+  {
+    if (cupsFileFlush(fp))
+    {
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to write changes to \"%s\": %s",
+                     filename, strerror(errno));
+      cupsFileClose(fp);
+      return (-1);
+    }
+
+    if (fsync(cupsFileNumber(fp)))
+    {
+      cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to sync changes to \"%s\": %s",
+                     filename, strerror(errno));
+      cupsFileClose(fp);
+      return (-1);
+    }
+  }
+
  /*
   * First close the file...
   */