|
11 | 11 | * as a service.
|
12 | 12 | *
|
13 | 13 | * IDENTIFICATION
|
14 |
| - * $PostgreSQL: pgsql/src/port/copydir.c,v 1.27 2010/02/15 04:05:06 itagaki Exp $ |
| 14 | + * $PostgreSQL: pgsql/src/port/copydir.c,v 1.28 2010/02/15 11:40:49 stark Exp $ |
15 | 15 | *
|
16 | 16 | *-------------------------------------------------------------------------
|
17 | 17 | */
|
@@ -101,22 +101,36 @@ copydir(char *fromdir, char *todir, bool recurse)
|
101 | 101 |
|
102 | 102 | while ((xlde = ReadDir(xldir, fromdir)) != NULL)
|
103 | 103 | {
|
| 104 | + struct stat fst; |
| 105 | + |
104 | 106 | if (strcmp(xlde->d_name, ".") == 0 ||
|
105 | 107 | strcmp(xlde->d_name, "..") == 0)
|
106 | 108 | continue;
|
107 | 109 |
|
108 | 110 | snprintf(tofile, MAXPGPATH, "%s/%s", todir, xlde->d_name);
|
109 |
| - fsync_fname(tofile); |
| 111 | + |
| 112 | + /* We don't need to sync directories here since the recursive |
| 113 | + * copydir will do it before it returns */ |
| 114 | + if (lstat(fromfile, &fst) < 0) |
| 115 | + ereport(ERROR, |
| 116 | + (errcode_for_file_access(), |
| 117 | + errmsg("could not stat file \"%s\": %m", fromfile))); |
| 118 | + if (S_ISREG(fst.st_mode)) |
| 119 | + { |
| 120 | + fsync_fname(tofile); |
| 121 | + } |
110 | 122 | }
|
111 | 123 | FreeDir(xldir);
|
112 | 124 |
|
| 125 | +#ifdef NOTYET |
113 | 126 | /* It's important to fsync the destination directory itself as
|
114 | 127 | * individual file fsyncs don't guarantee that the directory entry
|
115 | 128 | * for the file is synced. Recent versions of ext4 have made the
|
116 | 129 | * window much wider but it's been true for ext3 and other
|
117 |
| - * filesyetems in the past |
| 130 | + * filesystems in the past |
118 | 131 | */
|
119 | 132 | fsync_fname(todir);
|
| 133 | +#endif |
120 | 134 | }
|
121 | 135 |
|
122 | 136 | /*
|
|
0 commit comments