diff options
author | Junio C Hamano <gitster@pobox.com> | 2016-10-28 06:23:07 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-10-28 06:23:07 -0700 |
commit | 1b8ac5ead520146802debd52cb38e5c27b3483a2 (patch) | |
tree | 3b78d5e23b37dcf9f4e9290b8b364acbfe99d317 /t/helper/test-sigchain.c | |
parent | read-cache: make sure file handles are not inherited by child processes (diff) | |
download | tgif-1b8ac5ead520146802debd52cb38e5c27b3483a2.tar.xz |
git_open(): untangle possible NOATIME and CLOEXEC interactions
The way we structured the fallback/retry mechanism for opening with
O_NOATIME and O_CLOEXEC meant that if we failed due to lack of
support to open the file with O_NOATIME option (i.e. EINVAL), we
would still try to drop O_CLOEXEC first and retry, and then drop
O_NOATIME. A platform on which O_NOATIME is defined in the header
without support from the kernel wouldn't have a chance to open with
O_CLOEXEC option due to this code structure.
Arguably, O_CLOEXEC is more important than O_NOATIME, as the latter
is mostly about performance, while the former can affect correctness.
Instead use O_CLOEXEC to open the file, and then use fcntl(2) to set
O_NOATIME on the resulting file descriptor. open(2) itself does not
cause atime to be updated according to Linus [*1*].
The helper to do the former can be usable in the codepath in
ce_compare_data() that was recently added to open a file descriptor
with O_CLOEXEC; use it while we are at it.
*1* <CA+55aFw83E+zOd+z5h-CA-3NhrLjVr-anL6pubrSWttYx3zu8g@mail.gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 't/helper/test-sigchain.c')
0 files changed, 0 insertions, 0 deletions