diff --git a/configure b/configure
index 0a676a3fd2e7255663932f93b213f4d033e8d78e..0c6fc286100b2b01eb0eee4e060578068911287c 100755
--- a/configure
+++ b/configure
@@ -13230,6 +13230,81 @@ fi
 
 fi
 
+# This is probably only present on Darwin, but may as well check always
+echo "$as_me:$LINENO: checking whether F_FULLFSYNC is declared" >&5
+echo $ECHO_N "checking whether F_FULLFSYNC is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_F_FULLFSYNC+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <fcntl.h>
+
+int
+main ()
+{
+#ifndef F_FULLFSYNC
+  char *p = (char *) F_FULLFSYNC;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_F_FULLFSYNC=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_F_FULLFSYNC=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_F_FULLFSYNC" >&5
+echo "${ECHO_T}$ac_cv_have_decl_F_FULLFSYNC" >&6
+if test $ac_cv_have_decl_F_FULLFSYNC = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_F_FULLFSYNC 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_F_FULLFSYNC 0
+_ACEOF
+
+
+fi
+
+
+
 ##
 ## Functions, global variables
 ##
diff --git a/configure.in b/configure.in
index 9ede74a7b43cdf540c500bc8c1e88ed48d9037e9..4edd00e11f49d131b7558cba066686993e6dd4ec 100644
--- a/configure.in
+++ b/configure.in
@@ -1,5 +1,5 @@
 dnl Process this file with autoconf to produce a configure script.
-dnl $PostgreSQL: pgsql/configure.in,v 1.442 2006/01/12 19:23:22 tgl Exp $
+dnl $PostgreSQL: pgsql/configure.in,v 1.443 2006/01/17 23:52:30 tgl Exp $
 dnl
 dnl Developers, please strive to achieve this order:
 dnl
@@ -810,6 +810,9 @@ if test "$with_krb5" = yes; then
                    [#include <krb5.h>])
 fi
 
+# This is probably only present on Darwin, but may as well check always
+AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>])
+
 ##
 ## Functions, global variables
 ##
diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c
index b7f1c3f5a25b03095472f69a24b38313f1cf7ffa..496fc481633986e0a8191a89d332fbd923943b51 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/storage/file/fd.c,v 1.124 2005/12/08 15:38:29 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/storage/file/fd.c,v 1.125 2006/01/17 23:52:31 tgl Exp $
  *
  * NOTES:
  *
@@ -265,13 +265,15 @@ int
 pg_fsync_writethrough(int fd)
 {
 	if (enableFsync)
+	{
 #ifdef WIN32
 		return _commit(fd);
-#elif defined(__darwin__)
-	return (fcntl(fd, F_FULLFSYNC, 0) == -1) ? -1 : 0;
+#elif defined(F_FULLFSYNC)
+		return (fcntl(fd, F_FULLFSYNC, 0) == -1) ? -1 : 0;
 #else
 		return -1;
 #endif
+	}
 	else
 		return 0;
 }
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
index 27b14ca2ea5815610627e7038262bd3097e007ae..2c24ce3d811f69876caebe79da21b2a2f1b0e815 100644
--- a/src/include/pg_config.h.in
+++ b/src/include/pg_config.h.in
@@ -72,6 +72,10 @@
    don't. */
 #undef HAVE_DECL_FDATASYNC
 
+/* Define to 1 if you have the declaration of `F_FULLFSYNC', and to 0 if you
+   don't. */
+#undef HAVE_DECL_F_FULLFSYNC
+
 /* Define to 1 if you have the declaration of `snprintf', and to 0 if you
    don't. */
 #undef HAVE_DECL_SNPRINTF
diff --git a/src/include/port/darwin.h b/src/include/port/darwin.h
index 2b7600bebeb85b3828171d8bc7cf2e95774969f3..af4ce9b3856374578aab1fe72b4ed19d1717cb77 100644
--- a/src/include/port/darwin.h
+++ b/src/include/port/darwin.h
@@ -1,3 +1,5 @@
 #define __darwin__	1
 
+#if HAVE_DECL_F_FULLFSYNC		/* not present before OS X 10.3 */
 #define HAVE_FSYNC_WRITETHROUGH
+#endif