From a10faf5ce6fe0cb07012d9f2d118fa326a09d267 Mon Sep 17 00:00:00 2001 From: Mark Johnston Date: Thu, 11 Jul 2024 18:52:51 -0500 Subject: [PATCH] FreeBSD: Use the new freeuio() helper to free dynamically allocated UIOs (#16300) This freeuio() interface was introduced to FreeBSD recently. For now it simply calls free(), so this change has no effect. However, this may not always be true, and in CheriBSD this change is required. Signed-off-by: Mark Johnston Reviewed-by: Alexander Motin Reviewed-by: Brooks Davis Reviewed-by: Tony Hutter --- module/os/freebsd/spl/spl_uio.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/module/os/freebsd/spl/spl_uio.c b/module/os/freebsd/spl/spl_uio.c index ffccb6f259..17886cbeb5 100644 --- a/module/os/freebsd/spl/spl_uio.c +++ b/module/os/freebsd/spl/spl_uio.c @@ -45,6 +45,16 @@ #include #include +static void +zfs_freeuio(struct uio *uio) +{ +#if __FreeBSD_version > 1500013 + freeuio(uio); +#else + free(uio, M_IOV); +#endif +} + int zfs_uiomove(void *cp, size_t n, zfs_uio_rw_t dir, zfs_uio_t *uio) { @@ -77,7 +87,7 @@ zfs_uiocopy(void *p, size_t n, zfs_uio_rw_t rw, zfs_uio_t *uio, size_t *cbytes) error = vn_io_fault_uiomove(p, n, uio_clone); *cbytes = zfs_uio_resid(uio) - uio_clone->uio_resid; if (uio_clone != &small_uio_clone) - free(uio_clone, M_IOV); + zfs_freeuio(uio_clone); return (error); }