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 449 Lines • ▼ Show 20 Lines | |||||
page_unbusy(vm_page_t pp) | page_unbusy(vm_page_t pp) | ||||
{ | { | ||||
vm_page_sunbusy(pp); | vm_page_sunbusy(pp); | ||||
vm_object_pip_subtract(pp->object, 1); | vm_object_pip_subtract(pp->object, 1); | ||||
} | } | ||||
static vm_page_t | static vm_page_t | ||||
page_hold(vnode_t *vp, int64_t start) | page_wire(vnode_t *vp, int64_t start) | ||||
jhb: It would seem more consistent to rename these functions as well now. | |||||
{ | { | ||||
vm_object_t obj; | vm_object_t obj; | ||||
vm_page_t pp; | vm_page_t pp; | ||||
obj = vp->v_object; | obj = vp->v_object; | ||||
zfs_vmobject_assert_wlocked(obj); | zfs_vmobject_assert_wlocked(obj); | ||||
for (;;) { | for (;;) { | ||||
Show All 10 Lines | if ((pp = vm_page_lookup(obj, OFF_TO_IDX(start))) != NULL && | ||||
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_lock(pp); | ||||
vm_page_hold(pp); | vm_page_wire(pp); | ||||
vm_page_unlock(pp); | vm_page_unlock(pp); | ||||
} else | } else | ||||
pp = NULL; | pp = NULL; | ||||
break; | break; | ||||
} | } | ||||
return (pp); | return (pp); | ||||
} | } | ||||
static void | static void | ||||
page_unhold(vm_page_t pp) | page_unwire(vm_page_t pp) | ||||
{ | { | ||||
vm_page_lock(pp); | vm_page_lock(pp); | ||||
vm_page_unhold(pp); | vm_page_unwire(pp, PQ_ACTIVE); | ||||
vm_page_unlock(pp); | 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* | ||||
▲ Show 20 Lines • Show All 133 Lines • ▼ Show 20 Lines | mappedread(vnode_t *vp, int nbytes, uio_t *uio) | ||||
start = uio->uio_loffset; | start = uio->uio_loffset; | ||||
off = start & PAGEOFFSET; | off = start & PAGEOFFSET; | ||||
zfs_vmobject_wlock(obj); | zfs_vmobject_wlock(obj); | ||||
for (start &= PAGEMASK; len > 0; start += PAGESIZE) { | for (start &= PAGEMASK; len > 0; start += PAGESIZE) { | ||||
vm_page_t pp; | vm_page_t pp; | ||||
uint64_t bytes = MIN(PAGESIZE - off, len); | uint64_t bytes = MIN(PAGESIZE - off, len); | ||||
if (pp = page_hold(vp, start)) { | if (pp = page_wire(vp, start)) { | ||||
struct sf_buf *sf; | struct sf_buf *sf; | ||||
caddr_t va; | caddr_t va; | ||||
zfs_vmobject_wunlock(obj); | zfs_vmobject_wunlock(obj); | ||||
va = zfs_map_page(pp, &sf); | va = zfs_map_page(pp, &sf); | ||||
#ifdef illumos | #ifdef illumos | ||||
error = uiomove(va + off, bytes, UIO_READ, uio); | error = uiomove(va + off, bytes, UIO_READ, uio); | ||||
#else | #else | ||||
error = vn_io_fault_uiomove(va + off, bytes, uio); | error = vn_io_fault_uiomove(va + off, bytes, uio); | ||||
#endif | #endif | ||||
zfs_unmap_page(sf); | zfs_unmap_page(sf); | ||||
zfs_vmobject_wlock(obj); | zfs_vmobject_wlock(obj); | ||||
page_unhold(pp); | page_unwire(pp); | ||||
} else { | } else { | ||||
zfs_vmobject_wunlock(obj); | zfs_vmobject_wunlock(obj); | ||||
error = dmu_read_uio_dbuf(sa_get_db(zp->z_sa_hdl), | error = dmu_read_uio_dbuf(sa_get_db(zp->z_sa_hdl), | ||||
uio, bytes); | uio, bytes); | ||||
zfs_vmobject_wlock(obj); | zfs_vmobject_wlock(obj); | ||||
} | } | ||||
len -= bytes; | len -= bytes; | ||||
off = 0; | off = 0; | ||||
▲ Show 20 Lines • Show All 5,399 Lines • Show Last 20 Lines |
It would seem more consistent to rename these functions as well now.