HomeFreeBSD

nfscl: Fix interaction between mmap'd and VOP_WRITE file updates

Description

nfscl: Fix interaction between mmap'd and VOP_WRITE file updates

asomers@ found a problem with the NFS client, where a write to
an NFS mounted file done via mmap(2) was lost when fspacectl(2)
was done before it. This turned out to be caused by clearing the
dirty bit on pages when the client was doing commit RPCs,
due to the second argument to vfs_busy_pages() being set to 1.
Commit RPCs tell the server to commit previously written data to
stable storage. However, Commit RPCs do not write data from the
client to the server. As such, if the dirty bit on the page has
been set by a mmap'd write to an address in the page, it should
not be cleared. Clearing it causes the mmap'd write to by lost.

This patch fixes the problem by changing the 2nd argument to
vfs_busy_pages() to 0 for this case.

I doubt this bug has affected many, since it was inherited from
the old NFS client and was in 4.3 FreeBSD twenty years ago.
Although fspacectl(2) is FreeBSD 14 specific, a write(2) would
cause the same failure.

PR: 269328

(cherry picked from commit 847967bc4e198a258b030a5864e64e029e7452e5)

Details

Provenance
rmacklemAuthored on Feb 8 2023, 10:25 PM
Parents
rG426ed0052540: Fix per-jail zfs.mount_snapshot setting
Branches
Unknown
Tags
Unknown