Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
Show First 20 Lines • Show All 528 Lines • ▼ Show 20 Lines | mappedread_sf(vnode_t *vp, int nbytes, uio_t *uio) | ||||
ASSERT((uio->uio_loffset & PAGEOFFSET) == 0); | ASSERT((uio->uio_loffset & PAGEOFFSET) == 0); | ||||
zfs_vmobject_wlock(obj); | zfs_vmobject_wlock(obj); | ||||
for (start = uio->uio_loffset; len > 0; start += PAGESIZE) { | for (start = uio->uio_loffset; len > 0; start += PAGESIZE) { | ||||
int bytes = MIN(PAGESIZE, len); | int bytes = MIN(PAGESIZE, len); | ||||
pp = vm_page_grab(obj, OFF_TO_IDX(start), VM_ALLOC_SBUSY | | pp = vm_page_grab(obj, OFF_TO_IDX(start), VM_ALLOC_SBUSY | | ||||
VM_ALLOC_NORMAL | VM_ALLOC_IGN_SBUSY); | VM_ALLOC_NORMAL | VM_ALLOC_IGN_SBUSY); | ||||
if (pp->valid == 0) { | if (vm_page_none_valid(pp)) { | ||||
zfs_vmobject_wunlock(obj); | zfs_vmobject_wunlock(obj); | ||||
va = zfs_map_page(pp, &sf); | va = zfs_map_page(pp, &sf); | ||||
error = dmu_read(os, zp->z_id, start, bytes, va, | error = dmu_read(os, zp->z_id, start, bytes, va, | ||||
DMU_READ_PREFETCH); | DMU_READ_PREFETCH); | ||||
if (bytes != PAGESIZE && error == 0) | if (bytes != PAGESIZE && error == 0) | ||||
bzero(va + bytes, PAGESIZE - bytes); | bzero(va + bytes, PAGESIZE - bytes); | ||||
zfs_unmap_page(sf); | zfs_unmap_page(sf); | ||||
zfs_vmobject_wlock(obj); | zfs_vmobject_wlock(obj); | ||||
vm_page_sunbusy(pp); | if (error == 0) { | ||||
if (error) { | vm_page_valid(pp); | ||||
if (!vm_page_busied(pp) && !vm_page_wired(pp) && | |||||
pp->valid == 0) | |||||
vm_page_free(pp); | |||||
} else { | |||||
pp->valid = VM_PAGE_BITS_ALL; | |||||
vm_page_lock(pp); | vm_page_lock(pp); | ||||
vm_page_activate(pp); | vm_page_activate(pp); | ||||
vm_page_unlock(pp); | vm_page_unlock(pp); | ||||
} | } | ||||
vm_page_sunbusy(pp); | |||||
if (error != 0 && !vm_page_wired(pp) == 0 && | |||||
pp->valid == 0 && vm_page_tryxbusy(pp)) | |||||
vm_page_free(pp); | |||||
} else { | } else { | ||||
ASSERT3U(pp->valid, ==, VM_PAGE_BITS_ALL); | ASSERT3U(pp->valid, ==, VM_PAGE_BITS_ALL); | ||||
vm_page_sunbusy(pp); | vm_page_sunbusy(pp); | ||||
} | } | ||||
if (error) | if (error) | ||||
break; | break; | ||||
uio->uio_resid -= bytes; | uio->uio_resid -= bytes; | ||||
uio->uio_offset += bytes; | uio->uio_offset += bytes; | ||||
▲ Show 20 Lines • Show All 5,457 Lines • Show Last 20 Lines |