Commit 5ea96efa authored by Tom Lane's avatar Tom Lane

Fix failure-to-read-man-page in commit 899bd785.

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
parent 984c9207
...@@ -425,17 +425,14 @@ dsm_impl_posix_resize(int fd, off_t size) ...@@ -425,17 +425,14 @@ dsm_impl_posix_resize(int fd, off_t size)
do do
{ {
rc = posix_fallocate(fd, 0, size); 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 * The caller expects errno to be set, but posix_fallocate() doesn't
* we won't hit the problem (it typically doesn't show up without * set it. Instead it returns error numbers directly. So set errno,
* many-GB-sized requests, anyway). * even though we'll also return rc to indicate success or failure.
*/ */
rc = 0; errno = rc;
}
} }
#endif /* HAVE_POSIX_FALLOCATE && __linux__ */ #endif /* HAVE_POSIX_FALLOCATE && __linux__ */
......
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