"Since Linux 2.6.19, MS_ASYNC is in fact a no-op" - msync(2) manpage
This is clearly a lie.
It was, apparently, the call to msync() with MS_ASYNC that was carrying the synchronization in my database. It was trying to remove it that revealed the problem I'm now fighting to fix.
So, for future reference. MS_ASYNC does, in fact, have an effect on Linux. The exact nature of that effect is unclear. It may not cause the pages to be synced, but it does seem to sanity check the argument, and set errno. It's unclear if this is related to the syscall itself, or the glibc wrapper. Further investigation is needed. No-ops shouldn't have side-effects.
















