Christoph Hellwig <hch@xxxxxx> writes: > On Thu, Sep 17, 2020 at 10:55:23AM -0400, Jeff King wrote: >> On Thu, Sep 17, 2020 at 04:09:12PM +0200, Christoph Hellwig wrote: >> >> > On Thu, Sep 17, 2020 at 01:28:29PM +0200, Ævar Arnfjörð Bjarmason wrote: >> > > Change the behavior of core.fsyncObjectFiles to also sync the >> > > directory entry. I don't have a case where this broke, just going by >> > > paranoia and the fsync(2) manual page's guarantees about its behavior. >> > >> > It is not just paranoia, but indeed what is required from the standards >> > POV. At least for many Linux file systems your second fsync will be >> > very cheap (basically a NULL syscall) as the log has alredy been forced >> > all the way by the first one, but you can't rely on that. >> >> Is it sufficient to fsync() just the surrounding directory? I.e., if I >> do: >> >> mkdir("a"); >> mkdir("a/b"); >> open("a/b/c", O_WRONLY); >> >> is it enough to fsync() a descriptor pointing to "a/b", or should I >> also do "a"? > > You need to fsync both to be fully compliant, even if just fsyncing b > will work for most but not all file systems. The good news is that > for those common file systems the extra fsync of a is almost free. Back to Ævar's patch, when creating a new loose object, we do these things: 1. create temporary file and write the compressed contents to it while computing its object name 2. create the fan-out directory under .git/objects/ if needed 3. mv temporary file to its final name and the patch adds open+fsync+close on the fan-out directory. In the above exchange with Peff, we learned that open+fsync+close needs to be done on .git/objects if we created the fan-out directory, too. Am I reading the above correctly? Thanks.