aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2017-09-26 13:42:53 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2017-09-26 13:43:00 -0400
commitd29f30d8c3b2a9d8c57324355df8a8d9da1d9c12 (patch)
tree5007ac8ae6b74a043c9c1ece2da5ef11038cdb38 /src
parent01c5de88ff242b379a033e46e4da6476f2213029 (diff)
downloadpostgresql-d29f30d8c3b2a9d8c57324355df8a8d9da1d9c12.tar.gz
postgresql-d29f30d8c3b2a9d8c57324355df8a8d9da1d9c12.zip
Fix failure-to-read-man-page in commit 899bd785c.
posix_fallocate() is not quite a drop-in replacement for fallocate(), because it is defined to return the error code as its function result, not in "errno". I (tgl) missed this because RHEL6's version seems to set errno as well. That is not the case on more modern Linuxen, though, as per buildfarm results. Aside from fixing the return-convention confusion, remove the test for ENOSYS; we expect that glibc will mask that for posix_fallocate, though it does not for fallocate. Keep the test for EINTR, because POSIX specifies that as a possible result, and buildfarm results suggest that it can happen in practice. Back-patch to 9.4, like the previous commit. Thomas Munro Discussion: https://postgr.es/m/1002664500.12301802.1471008223422.JavaMail.yahoo@mail.yahoo.com
Diffstat (limited to 'src')
-rw-r--r--src/backend/storage/ipc/dsm_impl.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/backend/storage/ipc/dsm_impl.c b/src/backend/storage/ipc/dsm_impl.c
index 4c1addc77c5..1ec154cfe8d 100644
--- a/src/backend/storage/ipc/dsm_impl.c
+++ b/src/backend/storage/ipc/dsm_impl.c
@@ -425,17 +425,14 @@ dsm_impl_posix_resize(int fd, off_t size)
do
{
rc = posix_fallocate(fd, 0, size);
- } while (rc == -1 && errno == EINTR);
+ } while (rc == EINTR);
- if (rc != 0 && errno == ENOSYS)
- {
- /*
- * Kernel too old (< 2.6.23). Rather than fail, just trust that
- * we won't hit the problem (it typically doesn't show up without
- * many-GB-sized requests, anyway).
- */
- rc = 0;
- }
+ /*
+ * The caller expects errno to be set, but posix_fallocate() doesn't
+ * set it. Instead it returns error numbers directly. So set errno,
+ * even though we'll also return rc to indicate success or failure.
+ */
+ errno = rc;
}
#endif /* HAVE_POSIX_FALLOCATE && __linux__ */