I just don't have the time at present to complete this.
I did implement ACID file replacement using POSIX APIs a while ago in:
https://github.com/pixelb/crudini
The commit messages there have details on fsync()ing requirements etc.
Implementation in C in coreutils could also use other APIs where available
like renameat2(..., RENAME_EXCHANGE) and exchangedata() etc.
I noticed XFS_IOC_SWAPEXT but that's currently hardcoded
to support only same sized replacements (for defragment apps).
I was thinking of providing a wrapper for exchangedata() in gnulib,
which could be leveraged where available or falling back to
the current POSIX APIs.
Did you get any further? I was prompted to look up this thread by a deprecation message for "tempfile" from Victor Porton's "inplace" script, which I still use!