/* * Return all the pages from [off..off+len] in given file */ static int xmem_getpage(struct vnode *vp, offset_t off, size_t len, uint_t *protp, page_t *pl[], size_t plsz, struct seg *seg, caddr_t addr, enum seg_rw rw, struct cred *cr) { int err = 0; struct xmemnode *xp = VTOXN(vp); struct xmount *xm = (struct xmount *)VTOXM(vp); timestruc_t now; cmn_err(CE_PANIC, "xmem_getpage"); rw_enter(&xp->xn_contents, RW_READER); if (off + len > xp->xn_size + xm->xm_bsize) { rw_exit(&xp->xn_contents); return (EFAULT); } rw_exit(&xp->xn_contents); if (len <= xm->xm_bsize) err = xmem_getapage(vp, (u_offset_t)off, len, protp, pl, plsz, seg, addr, rw, cr); else err = pvn_getpages(xmem_getapage, vp, (u_offset_t)off, len, protp, pl, plsz, seg, addr, rw, cr); rw_enter(&xp->xn_contents, RW_WRITER); gethrestime(&now); xp->xn_atime = now; if (rw == S_WRITE) xp->xn_mtime = now; rw_exit(&xp->xn_contents); return (err); }
/*ARGSUSED*/ static int bootfs_getpage(vnode_t *vp, offset_t off, size_t len, uint_t *protp, page_t *pl[], size_t plsz, struct seg *seg, caddr_t addr, enum seg_rw rw, cred_t *cr, caller_context_t *ct) { int err; bootfs_node_t *bnp = vp->v_data; if (off + len > bnp->bvn_size + PAGEOFFSET) return (EFAULT); if (len <= PAGESIZE) err = bootfs_getapage(vp, (u_offset_t)off, len, protp, pl, plsz, seg, addr, rw, cr); else err = pvn_getpages(bootfs_getapage, vp, (u_offset_t)off, len, protp, pl, plsz, seg, addr, rw, cr); return (err); }