Commit 9738beb3 authored by Tom Lane's avatar Tom Lane

Fix multiple copy and paste-o's. No wonder this code didn't work.

parent b21121cd
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* as a service. * as a service.
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/port/copydir.c,v 1.29 2010/02/22 00:11:05 stark Exp $ * $PostgreSQL: pgsql/src/port/copydir.c,v 1.30 2010/02/22 02:50:10 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -90,18 +90,18 @@ copydir(char *fromdir, char *todir, bool recurse) ...@@ -90,18 +90,18 @@ copydir(char *fromdir, char *todir, bool recurse)
else if (S_ISREG(fst.st_mode)) else if (S_ISREG(fst.st_mode))
copy_file(fromfile, tofile); copy_file(fromfile, tofile);
} }
Free(xldir); FreeDir(xldir);
/* /*
* Be paranoid here and fsync all files to ensure we catch problems. * Be paranoid here and fsync all files to ensure the copy is really done.
*/ */
AllocateDir(fromdir); xldir = AllocateDir(todir);
if (xldir == NULL) if (xldir == NULL)
ereport(ERROR, ereport(ERROR,
(errcode_for_file_access(), (errcode_for_file_access(),
errmsg("could not open directory \"%s\": %m", fromdir))); errmsg("could not open directory \"%s\": %m", todir)));
while ((xlde = ReadDir(xldir, fromdir)) != NULL) while ((xlde = ReadDir(xldir, todir)) != NULL)
{ {
struct stat fst; struct stat fst;
...@@ -111,25 +111,29 @@ copydir(char *fromdir, char *todir, bool recurse) ...@@ -111,25 +111,29 @@ copydir(char *fromdir, char *todir, bool recurse)
snprintf(tofile, MAXPGPATH, "%s/%s", todir, xlde->d_name); snprintf(tofile, MAXPGPATH, "%s/%s", todir, xlde->d_name);
/* We don't need to sync directories here since the recursive /*
* copydir will do it before it returns */ * We don't need to sync subdirectories here since the recursive
if (lstat(fromfile, &fst) < 0) * copydir will do it before it returns
*/
if (lstat(tofile, &fst) < 0)
ereport(ERROR, ereport(ERROR,
(errcode_for_file_access(), (errcode_for_file_access(),
errmsg("could not stat file \"%s\": %m", fromfile))); errmsg("could not stat file \"%s\": %m", tofile)));
if (S_ISREG(fst.st_mode)) if (S_ISREG(fst.st_mode))
{
fsync_fname(tofile); fsync_fname(tofile);
} }
}
FreeDir(xldir); FreeDir(xldir);
#ifdef NOTYET #ifdef NOTYET
/* It's important to fsync the destination directory itself as /*
* It's important to fsync the destination directory itself as
* individual file fsyncs don't guarantee that the directory entry * individual file fsyncs don't guarantee that the directory entry
* for the file is synced. Recent versions of ext4 have made the * for the file is synced. Recent versions of ext4 have made the
* window much wider but it's been true for ext3 and other * window much wider but it's been true for ext3 and other
* filesystems in the past * filesystems in the past.
*
* However we can't do this just yet, it has portability issues.
*/ */
fsync_fname(todir); fsync_fname(todir);
#endif #endif
...@@ -210,7 +214,6 @@ copy_file(char *fromfile, char *tofile) ...@@ -210,7 +214,6 @@ copy_file(char *fromfile, char *tofile)
} }
/* /*
* fsync a file * fsync a file
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment