]> git.proxmox.com Git - mirror_zfs.git/commitdiff
FreeBSD: Return Mach error codes from VOP_(GET|PUT)PAGES
authorMark Johnston <markj@FreeBSD.org>
Thu, 7 Apr 2022 21:13:18 +0000 (17:13 -0400)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 13 Apr 2022 16:43:15 +0000 (09:43 -0700)
FreeBSD's memory management system uses its own error numbers and gets
confused when these VOPs return EIO.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Ryan Moeller <ryan@iXsystems.com>
Reported-by: Peter Holm <pho@FreeBSD.org>
Signed-off-by: Mark Johnston <markj@FreeBSD.org>
Closes #13311

module/os/freebsd/zfs/zfs_vnops_os.c

index 212c05cb863e63349ee32c776d220c52450eb832..6a5a7031c502c18cc8b6f9ca5f1e58a65940c4e5 100644 (file)
@@ -4040,8 +4040,8 @@ zfs_getpages(struct vnode *vp, vm_page_t *ma, int count, int *rbehind,
        int pgsin_b, pgsin_a;
        int error;
 
-       ZFS_ENTER(zfsvfs);
-       ZFS_VERIFY_ZP(zp);
+       ZFS_ENTER_ERROR(zfsvfs, zfs_vm_pagerret_error);
+       ZFS_VERIFY_ZP_ERROR(zp, zfs_vm_pagerret_error);
 
        start = IDX_TO_OFF(ma[0]->pindex);
        end = IDX_TO_OFF(ma[count - 1]->pindex + 1);
@@ -4165,19 +4165,18 @@ zfs_putpages(struct vnode *vp, vm_page_t *ma, size_t len, int flags,
        int             err;
        int             i;
 
-       ZFS_ENTER(zfsvfs);
-       ZFS_VERIFY_ZP(zp);
-
        object = vp->v_object;
-       pcount = btoc(len);
-       ncount = pcount;
-
        KASSERT(ma[0]->object == object, ("mismatching object"));
        KASSERT(len > 0 && (len & PAGE_MASK) == 0, ("unexpected length"));
 
+       pcount = btoc(len);
+       ncount = pcount;
        for (i = 0; i < pcount; i++)
                rtvals[i] = zfs_vm_pagerret_error;
 
+       ZFS_ENTER_ERROR(zfsvfs, zfs_vm_pagerret_error);
+       ZFS_VERIFY_ZP_ERROR(zp, zfs_vm_pagerret_error);
+
        off = IDX_TO_OFF(ma[0]->pindex);
        blksz = zp->z_blksz;
        lo_off = rounddown(off, blksz);