</listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>--no-sync</option></term>
+      <listitem>
+       <para>
+        By default, <command>pg_dump</command> will wait for all files
+        to be written safely to disk.  This option causes
+        <command>pg_dump</command> to return without waiting, which is
+        faster, but means that a subsequent operating system crash can leave
+        the dump corrupt.  Generally, this option is useful for testing
+        but should not be used when dumping data from production installation.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>--quote-all-identifiers</></term>
       <listitem>
 
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>--no-sync</option></term>
+      <listitem>
+       <para>
+        By default, <command>pg_dumpall</command> will wait for all files
+        to be written safely to disk.  This option causes
+        <command>pg_dumpall</command> to return without waiting, which is
+        faster, but means that a subsequent operating system crash can leave
+        the dump corrupt.  Generally, this option is useful for testing
+        but should not be used when dumping data from production installation.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>--no-tablespaces</option></term>
       <listitem>
 
 
 /* Create a new archive */
 extern Archive *CreateArchive(const char *FileSpec, const ArchiveFormat fmt,
-                         const int compression, ArchiveMode mode,
+                         const int compression, bool dosync, ArchiveMode mode,
                          SetupWorkerPtr setupDumpWorker);
 
 /* The --list option */
 
 
 
 static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt,
-        const int compression, ArchiveMode mode, SetupWorkerPtr setupWorkerPtr);
+        const int compression, bool dosync, ArchiveMode mode,
+        SetupWorkerPtr setupWorkerPtr);
 static void _getObjectDescription(PQExpBuffer buf, TocEntry *te,
                                          ArchiveHandle *AH);
 static void _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData, bool acl_pass);
 /* Public */
 Archive *
 CreateArchive(const char *FileSpec, const ArchiveFormat fmt,
-        const int compression, ArchiveMode mode, SetupWorkerPtr setupDumpWorker)
+                         const int compression, bool dosync, ArchiveMode mode,
+                         SetupWorkerPtr setupDumpWorker)
 
 {
-       ArchiveHandle *AH = _allocAH(FileSpec, fmt, compression, mode, setupDumpWorker);
+       ArchiveHandle *AH = _allocAH(FileSpec, fmt, compression, dosync,
+                                                                mode, setupDumpWorker);
 
        return (Archive *) AH;
 }
 Archive *
 OpenArchive(const char *FileSpec, const ArchiveFormat fmt)
 {
-       ArchiveHandle *AH = _allocAH(FileSpec, fmt, 0, archModeRead, setupRestoreWorker);
+       ArchiveHandle *AH = _allocAH(FileSpec, fmt, 0, true, archModeRead, setupRestoreWorker);
 
        return (Archive *) AH;
 }
  */
 static ArchiveHandle *
 _allocAH(const char *FileSpec, const ArchiveFormat fmt,
-         const int compression, ArchiveMode mode, SetupWorkerPtr setupWorkerPtr)
+                const int compression, bool dosync, ArchiveMode mode,
+                SetupWorkerPtr setupWorkerPtr)
 {
        ArchiveHandle *AH;
 
 
        AH->mode = mode;
        AH->compression = compression;
+       AH->dosync = dosync;
 
        memset(&(AH->sqlparse), 0, sizeof(AH->sqlparse));
 
 
                                                                 * values for compression: -1
                                                                 * Z_DEFAULT_COMPRESSION 0      COMPRESSION_NONE
                                                                 * 1-9 levels for gzip compression */
+       bool            dosync;                 /* data requested to be synced on sight */
        ArchiveMode mode;                       /* File mode - r or w */
        void       *formatData;         /* Header data specific to file format */
 
 
 #include "compress_io.h"
 #include "parallel.h"
 #include "pg_backup_utils.h"
+#include "common/file_utils.h"
 
 /*--------
  * Routines in the format interface
        if (fclose(AH->FH) != 0)
                exit_horribly(modulename, "could not close archive file: %s\n", strerror(errno));
 
+       /* Sync the output file if one is defined */
+       if (AH->dosync && AH->mode == archModeWrite && AH->fSpec)
+               (void) fsync_fname(AH->fSpec, false, progname);
+
        AH->FH = NULL;
 }
 
 
 #include "compress_io.h"
 #include "parallel.h"
 #include "pg_backup_utils.h"
+#include "common/file_utils.h"
 
 #include <dirent.h>
 #include <sys/stat.h>
                WriteDataChunks(AH, ctx->pstate);
 
                ParallelBackupEnd(AH, ctx->pstate);
+
+               /*
+                * In directory mode, there is no need to sync all the entries
+                * individually. Just recurse once through all the files generated.
+                */
+               if (AH->dosync)
+                       fsync_dir_recurse(ctx->directory, progname);
        }
        AH->FH = NULL;
 }
 
 #include "pg_backup_tar.h"
 #include "pg_backup_utils.h"
 #include "pgtar.h"
+#include "common/file_utils.h"
 #include "fe_utils/string_utils.h"
 
 #include <sys/stat.h>
                        if (fputc(0, ctx->tarFH) == EOF)
                                WRITE_ERROR_EXIT;
                }
+
+               /* Sync the output file if one is defined */
+               if (AH->dosync && AH->fSpec)
+                       (void) fsync_fname(AH->fSpec, false, progname);
        }
 
        AH->FH = NULL;
 
 /* global decls */
 bool           g_verbose;                      /* User wants verbose narration of our
                                                                 * activities. */
+static bool dosync = true;             /* Issue fsync() to make dump durable
+                                                                * on disk. */
 
 /* subquery used to convert user ID (eg, datdba) to user name */
 static const char *username_subquery;
                {"no-security-labels", no_argument, &dopt.no_security_labels, 1},
                {"no-synchronized-snapshots", no_argument, &dopt.no_synchronized_snapshots, 1},
                {"no-unlogged-table-data", no_argument, &dopt.no_unlogged_table_data, 1},
+               {"no-sync", no_argument, NULL, 7},
 
                {NULL, 0, NULL, 0}
        };
                                dumpsnapshot = pg_strdup(optarg);
                                break;
 
+                       case 7:                         /* no-sync */
+                               dosync = false;
+                               break;
+
                        default:
                                fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
                                exit_nicely(1);
                exit_horribly(NULL, "parallel backup only supported by the directory format\n");
 
        /* Open the output file */
-       fout = CreateArchive(filename, archiveFormat, compressLevel, archiveMode,
-                                                setupDumpWorker);
+       fout = CreateArchive(filename, archiveFormat, compressLevel, dosync,
+                                                archiveMode, setupDumpWorker);
 
        /* Make dump options accessible right away */
        SetArchiveOptions(fout, &dopt, NULL);
        printf(_("  -V, --version                output version information, then exit\n"));
        printf(_("  -Z, --compress=0-9           compression level for compressed formats\n"));
        printf(_("  --lock-wait-timeout=TIMEOUT  fail after waiting TIMEOUT for a table lock\n"));
+       printf(_("  --no-sync                    do not wait for changes to be written safely to disk\n"));
        printf(_("  -?, --help                   show this help, then exit\n"));
 
        printf(_("\nOptions controlling the output content:\n"));
 
 
 #include "dumputils.h"
 #include "pg_backup.h"
+#include "common/file_utils.h"
 #include "fe_utils/string_utils.h"
 
 /* version string we expect back from pg_dump */
 static char *connstr = "";
 static bool skip_acls = false;
 static bool verbose = false;
+static bool dosync = true;
 
 static int     binary_upgrade = 0;
 static int     column_inserts = 0;
                {"role", required_argument, NULL, 3},
                {"use-set-session-authorization", no_argument, &use_setsessauth, 1},
                {"no-security-labels", no_argument, &no_security_labels, 1},
+               {"no-sync", no_argument, NULL, 4},
                {"no-unlogged-table-data", no_argument, &no_unlogged_table_data, 1},
                {"no-role-passwords", no_argument, &no_role_passwords, 1},
 
                                appendShellString(pgdumpopts, use_role);
                                break;
 
+                       case 4:
+                               dosync = false;
+                               appendPQExpBufferStr(pgdumpopts, " --no-sync");
+                               break;
+
                        default:
                                fprintf(stderr, _("Try \"%s --help\" for more information.\n"), progname);
                                exit_nicely(1);
        fprintf(OPF, "--\n-- PostgreSQL database cluster dump complete\n--\n\n");
 
        if (filename)
+       {
                fclose(OPF);
 
+               /* sync the resulting file, errors are not fatal */
+               if (dosync)
+                       (void) fsync_fname(filename, false, progname);
+       }
+
        exit_nicely(0);
 }
 
        printf(_("  --if-exists                  use IF EXISTS when dropping objects\n"));
        printf(_("  --inserts                    dump data as INSERT commands, rather than COPY\n"));
        printf(_("  --no-security-labels         do not dump security label assignments\n"));
+       printf(_("  --no-sync                    do not wait for changes to be written safely to disk\n"));
        printf(_("  --no-tablespaces             do not dump tablespace assignments\n"));
        printf(_("  --no-unlogged-table-data     do not dump unlogged table data\n"));
        printf(_("  --no-role-passwords          do not dump passwords for roles\n"));
 
        walkdir(pg_tblspc, fsync_fname, true, progname);
 }
 
+/*
+ * Issue fsync recursively on the given directory and all its contents.
+ *
+ * This is a convenient wrapper on top of walkdir().
+ */
+void
+fsync_dir_recurse(const char *dir, const char *progname)
+{
+       /*
+        * If possible, hint to the kernel that we're soon going to fsync the data
+        * directory and its contents.
+        */
+#ifdef PG_FLUSH_DATA_WORKS
+       walkdir(dir, pre_sync_fname, false, progname);
+#endif
+
+       walkdir(dir, fsync_fname, false, progname);
+}
+
 /*
  * walkdir: recursively walk a directory, applying the action to each
  * regular file and directory (including the named directory itself).
 
                                           const char *progname);
 extern void fsync_pgdata(const char *pg_data, const char *progname,
                                                 int serverVersion);
+extern void fsync_dir_recurse(const char *dir, const char *progname);
 extern int durable_rename(const char *oldfile, const char *newfile,
                                                  const char *progname);
 extern int fsync_parent_path(const char *fname, const char *progname);