Formatting a file-backed NVMe device in bhyve fails because the blockif_candelete function returns FALSE on kernel which supports hole-punching:
# uname -mrsvK
FreeBSD 14.0-CURRENT FreeBSD 14.0-CURRENT main-81b22a9892 GENERIC amd64 1400041
This appears to happen because the cap_right_init(3) call does not allow the use of fpathconf(2). The attached patch which adds the CAP_FPATHCONF right fixes this.
Created attachment 229760 [details]
patch to allow detection of hole-punching
Do you have an opened differential to that? LGTM.
Looks good to me also, I think the patch can simply be committed.
In the past, the bhyve process has strongly recommend code reviews. In that spirit https://reviews.freebsd.org/D33203
A commit in branch main references this bug:
Author: Chuck Tuffli <chuck@FreeBSD.org>
AuthorDate: 2021-12-01 05:07:32 +0000
Commit: Chuck Tuffli <chuck@FreeBSD.org>
CommitDate: 2021-12-01 05:49:34 +0000
bhyve blockif: fix blockif_candelete with Capsicum
NVMe conformance tests for the Format command failed if the
backing-storage for the bhyve device was a file instead of a Zvol. The
tests (and the specification) expect a Format to destroy all previously
written data. The bhyve NVMe emulation implements this by trimming /
deallocating all data from the backing-storage.
The blockif_candelete() function indicated the file did not support
deallocation (i.e. fpathconf(..., _PC_DEALLOC_PRESENT) returned FALSE)
even though the kernel supported file hole punching. This occurs on
builds with Capsicum enabled because blockif did not allow the
Fix is to add CAP_FPATHCONF to the cap_rights_init(3) call.
Reviewed by: allanjude, markj, jhb
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D33203
usr.sbin/bhyve/block_if.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)