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 445 Lines • ▼ Show 20 Lines | page_busy(vnode_t *vp, int64_t start, int64_t off, int64_t nbytes) | ||||
return (pp); | return (pp); | ||||
} | } | ||||
static void | static void | ||||
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_wakeup(pp->object); | ||||
} | } | ||||
static vm_page_t | static vm_page_t | ||||
page_wire(vnode_t *vp, int64_t start) | page_wire(vnode_t *vp, int64_t start) | ||||
{ | { | ||||
vm_object_t obj; | vm_object_t obj; | ||||
vm_page_t pp; | vm_page_t pp; | ||||
▲ Show 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | update_pages(vnode_t *vp, int64_t start, int len, objset_t *os, uint64_t oid, | ||||
ASSERT(segflg != UIO_NOCOPY); | ASSERT(segflg != UIO_NOCOPY); | ||||
ASSERT(vp->v_mount != NULL); | ASSERT(vp->v_mount != NULL); | ||||
obj = vp->v_object; | obj = vp->v_object; | ||||
ASSERT(obj != NULL); | ASSERT(obj != NULL); | ||||
off = start & PAGEOFFSET; | off = start & PAGEOFFSET; | ||||
zfs_vmobject_wlock(obj); | zfs_vmobject_wlock(obj); | ||||
vm_object_pip_add(obj, 1); | |||||
for (start &= PAGEMASK; len > 0; start += PAGESIZE) { | for (start &= PAGEMASK; len > 0; start += PAGESIZE) { | ||||
vm_page_t pp; | vm_page_t pp; | ||||
int nbytes = imin(PAGESIZE - off, len); | int nbytes = imin(PAGESIZE - off, len); | ||||
if ((pp = page_busy(vp, start, off, nbytes)) != NULL) { | if ((pp = page_busy(vp, start, off, nbytes)) != NULL) { | ||||
zfs_vmobject_wunlock(obj); | zfs_vmobject_wunlock(obj); | ||||
va = zfs_map_page(pp, &sf); | va = zfs_map_page(pp, &sf); | ||||
(void) dmu_read(os, oid, start+off, nbytes, | (void) dmu_read(os, oid, start+off, nbytes, | ||||
va+off, DMU_READ_PREFETCH);; | va+off, DMU_READ_PREFETCH);; | ||||
zfs_unmap_page(sf); | zfs_unmap_page(sf); | ||||
zfs_vmobject_wlock(obj); | zfs_vmobject_wlock(obj); | ||||
page_unbusy(pp); | page_unbusy(pp); | ||||
} | } | ||||
len -= nbytes; | len -= nbytes; | ||||
off = 0; | off = 0; | ||||
} | } | ||||
vm_object_pip_wakeupn(obj, 0); | vm_object_pip_wakeup(obj); | ||||
zfs_vmobject_wunlock(obj); | zfs_vmobject_wunlock(obj); | ||||
} | } | ||||
/* | /* | ||||
* Read with UIO_NOCOPY flag means that sendfile(2) requests | * Read with UIO_NOCOPY flag means that sendfile(2) requests | ||||
* ZFS to populate a range of page cache pages with data. | * ZFS to populate a range of page cache pages with data. | ||||
* | * | ||||
* NOTE: this function could be optimized to pre-allocate | * NOTE: this function could be optimized to pre-allocate | ||||
▲ Show 20 Lines • Show All 5,517 Lines • Show Last 20 Lines |