diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c index b9e93791d5..918938d628 100644 --- a/module/zfs/zfs_vnops.c +++ b/module/zfs/zfs_vnops.c @@ -261,7 +261,9 @@ zfs_read(struct znode *zp, zfs_uio_t *uio, int ioflag, cred_t *cr) } ASSERT(zfs_uio_offset(uio) < zp->z_size); +#if defined(__linux__) ssize_t start_offset = zfs_uio_offset(uio); +#endif ssize_t n = MIN(zfs_uio_resid(uio), zp->z_size - zfs_uio_offset(uio)); ssize_t start_resid = n; @@ -284,13 +286,18 @@ zfs_read(struct znode *zp, zfs_uio_t *uio, int ioflag, cred_t *cr) /* convert checksum errors into IO errors */ if (error == ECKSUM) error = SET_ERROR(EIO); + +#if defined(__linux__) /* * if we actually read some bytes, bubbling EFAULT - * up to become EAGAIN isn't what we want here. + * up to become EAGAIN isn't what we want here... + * + * ...on Linux, at least. On FBSD, doing this breaks. */ if (error == EFAULT && (zfs_uio_offset(uio) - start_offset) != 0) error = 0; +#endif break; }