Skip to content

Commit

Permalink
FreeBSD: Return Mach error codes from VOP_(GET|PUT)PAGES
Browse files Browse the repository at this point in the history
FreeBSD's memory management system uses its own error numbers and gets
confused when these VOPs return EIO.

Reviewed-by: Brian Behlendorf <[email protected]>
Reviewed-by: Ryan Moeller <[email protected]>
Reported-by: Peter Holm <[email protected]>
Signed-off-by: Mark Johnston <[email protected]>
Closes openzfs#13311
  • Loading branch information
markjdb authored and behlendorf committed Apr 19, 2022
1 parent e9cd90f commit b7546f9
Showing 1 changed file with 7 additions and 8 deletions.
15 changes: 7 additions & 8 deletions module/os/freebsd/zfs/zfs_vnops_os.c
Original file line number Diff line number Diff line change
Expand Up @@ -4062,8 +4062,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);
Expand Down Expand Up @@ -4187,19 +4187,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);
Expand Down

0 comments on commit b7546f9

Please sign in to comment.