diff options
Diffstat (limited to 'sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c')
| -rw-r--r-- | sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c | 31 | 
1 files changed, 28 insertions, 3 deletions
diff --git a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c index 411225786089..f34a2fd37a77 100644 --- a/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c +++ b/sys/contrib/openzfs/module/os/freebsd/zfs/zfs_vnops_os.c @@ -4116,6 +4116,7 @@ zfs_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr,  {  	znode_t *zp;  	zfsvfs_t *zfsvfs; +	uint_t blksize, iosize;  	int error;  	switch (cmd) { @@ -4127,8 +4128,20 @@ zfs_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr,  		*valp = 64;  		return (0);  	case _PC_MIN_HOLE_SIZE: -		*valp = (int)SPA_MINBLOCKSIZE; -		return (0); +		iosize = vp->v_mount->mnt_stat.f_iosize; +		if (vp->v_type == VREG) { +			zp = VTOZ(vp); +			blksize = zp->z_blksz; +			if (zp->z_size <= blksize) +				blksize = MAX(blksize, iosize); +			*valp = (int)blksize; +			return (0); +		} +		if (vp->v_type == VDIR) { +			*valp = (int)iosize; +			return (0); +		} +		return (EINVAL);  	case _PC_ACL_EXTENDED:  #if 0		/* POSIX ACLs are not implemented for ZFS on FreeBSD yet. */  		zp = VTOZ(vp); @@ -4210,8 +4223,20 @@ zfs_getpages(struct vnode *vp, vm_page_t *ma, int count, int *rbehind,  			zfs_vmobject_wlock(object);  			(void) vm_page_grab_pages(object, OFF_TO_IDX(start), -			    VM_ALLOC_NORMAL | VM_ALLOC_WAITOK | VM_ALLOC_ZERO, +			    VM_ALLOC_NORMAL | VM_ALLOC_WAITOK,  			    ma, count); +			if (!vm_page_all_valid(ma[count - 1])) { +				/* +				 * Later in this function, we copy DMU data to +				 * invalid pages only. The last page may not be +				 * entirely filled though, if the file does not +				 * end on a page boundary. Therefore, we zero +				 * that last page here to make sure it does not +				 * contain garbage after the end of file. +				 */ +				ASSERT(vm_page_none_valid(ma[count - 1])); +				vm_page_zero_invalid(ma[count - 1], FALSE); +			}  			zfs_vmobject_wunlock(object);  		}  		if (blksz == zp->z_blksz)  | 
