Changeset View
Changeset View
Standalone View
Standalone View
head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
Show First 20 Lines • Show All 475 Lines • ▼ Show 20 Lines | if ((pp = vm_page_lookup(obj, OFF_TO_IDX(start))) != NULL && | ||||
vm_page_lock(pp); | vm_page_lock(pp); | ||||
zfs_vmobject_wunlock(obj); | zfs_vmobject_wunlock(obj); | ||||
vm_page_busy_sleep(pp, "zfsmwb", true); | vm_page_busy_sleep(pp, "zfsmwb", true); | ||||
zfs_vmobject_wlock(obj); | zfs_vmobject_wlock(obj); | ||||
continue; | continue; | ||||
} | } | ||||
ASSERT3U(pp->valid, ==, VM_PAGE_BITS_ALL); | ASSERT3U(pp->valid, ==, VM_PAGE_BITS_ALL); | ||||
vm_page_lock(pp); | |||||
vm_page_wire(pp); | vm_page_wire(pp); | ||||
vm_page_unlock(pp); | |||||
} else | } else | ||||
pp = NULL; | pp = NULL; | ||||
break; | break; | ||||
} | } | ||||
return (pp); | return (pp); | ||||
} | } | ||||
static void | static void | ||||
page_unwire(vm_page_t pp) | page_unwire(vm_page_t pp) | ||||
{ | { | ||||
vm_page_lock(pp); | |||||
vm_page_unwire(pp, PQ_ACTIVE); | vm_page_unwire(pp, PQ_ACTIVE); | ||||
vm_page_unlock(pp); | |||||
} | } | ||||
/* | /* | ||||
* When a file is memory mapped, we must keep the IO data synchronized | * When a file is memory mapped, we must keep the IO data synchronized | ||||
* between the DMU cache and the memory mapped pages. What this means: | * between the DMU cache and the memory mapped pages. What this means: | ||||
* | * | ||||
* On Write: If we find a memory mapped page, we write to *both* | * On Write: If we find a memory mapped page, we write to *both* | ||||
* the page and the dmu buffer. | * the page and the dmu buffer. | ||||
▲ Show 20 Lines • Show All 77 Lines • ▼ Show 20 Lines | if (pp->valid == 0) { | ||||
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); | vm_page_sunbusy(pp); | ||||
vm_page_lock(pp); | |||||
if (error) { | if (error) { | ||||
if (!vm_page_wired(pp) && pp->valid == 0 && | if (!vm_page_busied(pp) && !vm_page_wired(pp) && | ||||
!vm_page_busied(pp)) | pp->valid == 0) | ||||
vm_page_free(pp); | vm_page_free(pp); | ||||
} else { | } else { | ||||
pp->valid = VM_PAGE_BITS_ALL; | pp->valid = VM_PAGE_BITS_ALL; | ||||
vm_page_lock(pp); | |||||
vm_page_activate(pp); | vm_page_activate(pp); | ||||
} | |||||
vm_page_unlock(pp); | vm_page_unlock(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 |