Exemplo n.º 1
0
/*
 * 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);
}
Exemplo n.º 2
0
/*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);
}