VOP_FSYNC() ensures that a file can be recovered to its current state following a crash. That typically
requires flushing the file's dirty buffers, its inode, and possibly other filesystem metadata to
persistent media. VOP_FSYNC() is used to implement the sync(2) and fsync(2) system calls.
Its arguments are:
vp The vnode of the file.
waitfor Whether the function should wait for I/O to complete. Possible values are:
MNT_WAIT Synchronously wait for I/O to complete.
MNT_NOWAIT Start all I/O, but do not wait for it.
MNT_LAZY Push data not written by file system syncer.
td The calling thread.
VOP_FDATASYNC() is similar, but it does not require that all of the file's metadata be flushed. It only
requires that the file's data be recoverable after a crash. That implies that the data itself must be
flushed to disk, as well as some metadata such as the file's size but not necessarily its attributes.
VOP_FDATASYNC() should always wait for I/O to complete, as if called with MNT_WAIT. VOP_FDATASYNC() is
used to implement fdatasync(2).