--- xlog.c.old Mon Feb 19 12:35:53 2001 +++ xlog.c Mon Feb 19 13:05:23 2001 @@ -24,6 +24,10 @@ #include #endif +#ifdef _HAVE_LINUX_SENDFILE +#include +#endif + #include "access/transam.h" #include "access/xact.h" #include "catalog/catversion.h" @@ -962,6 +966,24 @@ elog(STOP, "InitCreate(logfile %u seg %u) failed: %m", logId, logSeg); +#ifdef _HAVE_LINUX_SENDFILE + { + static int zfd = -1; + ssize_t len; + + if (zfd < 0) { + zfd = BasicOpenFile("/dev/zero", O_RDONLY, 0); + if (zfd < 0) + elog(STOP, "Can't open /dev/zero: %m"); + } + len = sendfile(fd, zfd, NULL, XLogSegSize); + if (len < 0) + /* XXX - header support sendfile, but kernel doesn't? Fall back */ + elog(STOP, "sendfile failed: %m"); + if (len < XLogSegSize) + elog(STOP, "short read on sendfile: %m"); + } +#else if (lseek(fd, XLogSegSize - 1, SEEK_SET) != (off_t) (XLogSegSize - 1)) elog(STOP, "lseek(logfile %u seg %u) failed: %m", logId, logSeg); @@ -969,6 +991,7 @@ if (write(fd, "", 1) != 1) elog(STOP, "write(logfile %u seg %u) failed: %m", logId, logSeg); +#endif if (pg_fsync(fd) != 0) elog(STOP, "fsync(logfile %u seg %u) failed: %m",