The DeleteFile(), UpdatePlaceholderIfNeeded(), and ReplacePlaceholderFileWithSymLink() methods are currently stubbed out.
They are used by the GVFS provider when it needs to add/remove files to ensure the working directory matches a newly checkout-out Git branch, because Git (when used with VFSForGit) does not do so itself -- Git only manages files which have been directly modified by the user; all others have to be updated by VFSForGit.
The Mac implementation of these methods ultimately uses normal C/C++ syscalls like unlink()/rmdir() to do this, but has a number of TODO comments suggesting that races with file hydration are yet to be handled properly.
We could potentially implement these methods using additional libprojfs functions, e.g., projfs_delete_file(), etc., which would acquire a lock using the internal get_path_userdata()/finalize_userdata() functions on the file/directory or parent directory, as necessary, to avoid races with the hydration performed by projfs_fuse_proj_locked().
However, we should avoid excess locking where possible and rely on the Linux VFS to handle most contention issues, and it's also valid for any program (Git or otherwise) to attempt to add/update/remove files under our mount point just using regular POSIX syscalls. So an initial implementation should likely follow the Mac model and simply use POSIX calls like unlink(), etc., without adding any functions to the libprojfs API.