]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Backport "Expose fsync_fname as a public API".
authorAndres Freund <andres@anarazel.de>
Sat, 15 Nov 2014 00:09:05 +0000 (01:09 +0100)
committerAndres Freund <andres@anarazel.de>
Sat, 15 Nov 2014 00:22:32 +0000 (01:22 +0100)
Backport commit cc52d5b33ff5df29de57dcae9322214cfe9c8464 back to 9.1
to allow backpatching some unlogged table fixes that use fsync_fname.

src/backend/storage/file/copydir.c
src/backend/storage/file/fd.c
src/include/storage/fd.h

index 6cfb8164f69dc59f363d7b54144b8c3ed51e6f5a..51e29662ac744f4dd6580e4e4b57a43f573b2c5d 100644 (file)
@@ -38,9 +38,6 @@
 #endif
 
 
-static void fsync_fname(char *fname, bool isdir);
-
-
 /*
  * copydir: copy a directory
  *
@@ -214,59 +211,3 @@ copy_file(char *fromfile, char *tofile)
 
        pfree(buffer);
 }
-
-
-/*
- * fsync a file
- *
- * Try to fsync directories but ignore errors that indicate the OS
- * just doesn't allow/require fsyncing directories.
- */
-static void
-fsync_fname(char *fname, bool isdir)
-{
-       int                     fd;
-       int                     returncode;
-
-       /*
-        * Some OSs require directories to be opened read-only whereas other
-        * systems don't allow us to fsync files opened read-only; so we need both
-        * cases here
-        */
-       if (!isdir)
-               fd = BasicOpenFile(fname,
-                                                  O_RDWR | PG_BINARY,
-                                                  S_IRUSR | S_IWUSR);
-       else
-               fd = BasicOpenFile(fname,
-                                                  O_RDONLY | PG_BINARY,
-                                                  S_IRUSR | S_IWUSR);
-
-       /*
-        * Some OSs don't allow us to open directories at all (Windows returns
-        * EACCES)
-        */
-       if (fd < 0 && isdir && (errno == EISDIR || errno == EACCES))
-               return;
-
-       else if (fd < 0)
-               ereport(ERROR,
-                               (errcode_for_file_access(),
-                                errmsg("could not open file \"%s\": %m", fname)));
-
-       returncode = pg_fsync(fd);
-
-       /* Some OSs don't allow us to fsync directories at all */
-       if (returncode != 0 && isdir && errno == EBADF)
-       {
-               close(fd);
-               return;
-       }
-
-       if (returncode != 0)
-               ereport(ERROR,
-                               (errcode_for_file_access(),
-                                errmsg("could not fsync file \"%s\": %m", fname)));
-
-       close(fd);
-}
index ed76272fbcf1e61f96ed7ad96561af08c7afd472..727952616d7d917e3efb9c8c1ae13e64f874f522 100644 (file)
@@ -345,6 +345,62 @@ pg_flush_data(int fd, off_t offset, off_t amount)
 }
 
 
+/*
+ * fsync_fname -- fsync a file or directory, handling errors properly
+ *
+ * Try to fsync a file or directory. When doing the latter, ignore errors that
+ * indicate the OS just doesn't allow/require fsyncing directories.
+ */
+void
+fsync_fname(char *fname, bool isdir)
+{
+       int                     fd;
+       int                     returncode;
+
+       /*
+        * Some OSs require directories to be opened read-only whereas other
+        * systems don't allow us to fsync files opened read-only; so we need both
+        * cases here
+        */
+       if (!isdir)
+               fd = BasicOpenFile(fname,
+                                                  O_RDWR | PG_BINARY,
+                                                  S_IRUSR | S_IWUSR);
+       else
+               fd = BasicOpenFile(fname,
+                                                  O_RDONLY | PG_BINARY,
+                                                  S_IRUSR | S_IWUSR);
+
+       /*
+        * Some OSs don't allow us to open directories at all (Windows returns
+        * EACCES)
+        */
+       if (fd < 0 && isdir && (errno == EISDIR || errno == EACCES))
+               return;
+
+       else if (fd < 0)
+               ereport(ERROR,
+                               (errcode_for_file_access(),
+                                errmsg("could not open file \"%s\": %m", fname)));
+
+       returncode = pg_fsync(fd);
+
+       /* Some OSs don't allow us to fsync directories at all */
+       if (returncode != 0 && isdir && errno == EBADF)
+       {
+               close(fd);
+               return;
+       }
+
+       if (returncode != 0)
+               ereport(ERROR,
+                               (errcode_for_file_access(),
+                                errmsg("could not fsync file \"%s\": %m", fname)));
+
+       close(fd);
+}
+
+
 /*
  * InitFileAccess --- initialize this module during backend startup
  *
index dc0aada35bc2907f827f87734642f19e67a574b6..4cff9c13c8b71fc38d97e3322d6920e1e0cebbca 100644 (file)
@@ -99,6 +99,7 @@ extern int    pg_fsync_no_writethrough(int fd);
 extern int     pg_fsync_writethrough(int fd);
 extern int     pg_fdatasync(int fd);
 extern int     pg_flush_data(int fd, off_t offset, off_t amount);
+extern void fsync_fname(char *fname, bool isdir);
 
 /* Filename components for OpenTemporaryFile */
 #define PG_TEMP_FILES_DIR "pgsql_tmp"