Issue
When writing to a file opened with O_SYNC
, the data (and metadata) is guaranteed to be written to persistent storage when the write call returns, and no explicit fsync
call is needed.
Is the same true for ftruncate
? Or do I still need to call fsync
after ftruncate
even with O_SYNC
?
Solution
Not all filesystems are capable of dealing with holes. There will be some filesystems that actually have to physically write 0's when you call ftruncate()
.
So logically, ftruncate()
be treated like a write()
and be subject to O_SYNC
.
The POSIX definition of O_SYNC says:
Write I/O operations on the file descriptor shall complete as defined by synchronized I/O file integrity completion.
And the POSIX definition for "synchronized I/O file integrity completion":
Identical to a synchronized I/O data integrity completion with the addition that all file attributes relative to the I/O operation [...] are successfully transferred prior to returning to the calling process.
And the definition for "Synchronized I/O Data Integrity Completion":
[...] The write is complete only when the data specified in the write request is successfully transferred and all file system information required to retrieve the data is successfully transferred.
That includes the file size.
But notably it only applies to "writes" (and "reads").
However, neither POSIX nor the Linux man pages define what a "write" or "write I/O" is, and in particular, whether ftruncate()
counts as one.
So if you want to get lawyery about it, it is not strictly guaranteed anywhere, although I think it's a bug in the specification.
In practice, though, I doubt any file system that implements O_SYNC
and ftruncate()
would require you to call fsync()
after ftruncate()
of a file opened with O_SYNC
.
Answered By - root Answer Checked By - Katrina (WPSolving Volunteer)