git_open(): untangle possible NOATIME and CLOEXEC interactions
authorJunio C Hamano <gitster@pobox.com>
Fri, 28 Oct 2016 13:23:07 +0000 (06:23 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 28 Oct 2016 13:23:07 +0000 (06:23 -0700)
commit1b8ac5ead520146802debd52cb38e5c27b3483a2
tree3b78d5e23b37dcf9f4e9290b8b364acbfe99d317
parenta0a6cb96625cebe8590841c469bfbb461a132ae3
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>
cache.h
read-cache.c
sha1_file.c