When executing the copy_file_range(2) syscall we check if both source
and destination files reside under the same mount point and only
then we would call file system spoecific VOP_COPY_FILE_RANGE() method.
For ZFS we want to have the ability to quickly clone files between
separate datasets within the same storage pool.
To make that possible, introduce the VFCF_CROSS_COPY_FILE_RANGE flag
that tells if the given file system type supports such use case.
If it does and the source and destination files both reside on the same
file system type call VOP_COPY_FILE_RANGE().
Note that the VOP_COPY_FILE_RANGE() can fail for many reasons (eg. ZFS
won't be able to clone a range not aligned to block boundaries), but the
generic copy may still be feasible and should be performed. To recognize
such situation the VOP_COPY_FILE_RANGE() implementation should return
the EXDEV error. If EXDEV is returned we will fall back to the generic copy.
Signed-off-by: Pawel Jakub Dawidek <pjd@FreeBSD.org>