Print this page
5382 pvn_getpages handles lengths <= PAGESIZE just fine

*** 18,27 **** --- 18,28 ---- * * CDDL HEADER END */ /* * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright 2015 Nexenta Systems, Inc. All rights reserved. */ #include <sys/param.h> #include <sys/types.h> #include <sys/systm.h>
*** 7383,7399 **** if (seg != segkmap) { error = EFAULT; break; } } ! if (len <= PAGESIZE) ! error = cachefs_getapage(vp, (u_offset_t)off, len, ! protp, pl, plsz, seg, addr, rw, cr); ! else ! error = pvn_getpages(cachefs_getapage, vp, ! (u_offset_t)off, len, protp, pl, plsz, seg, addr, ! rw, cr); if (error == 0) break; if (((cp->c_flags & CN_NOCACHE) && (error == ENOSPC)) || error == EAGAIN) { --- 7384,7395 ---- if (seg != segkmap) { error = EFAULT; break; } } ! error = pvn_getpages(cachefs_getapage, vp, (u_offset_t)off, ! len, protp, pl, plsz, seg, addr, rw, cr); if (error == 0) break; if (((cp->c_flags & CN_NOCACHE) && (error == ENOSPC)) || error == EAGAIN) {
*** 7409,7428 **** continue; } } else { if (CFS_TIMEOUT(fscp, error)) { if (cachefs_cd_access_miss(fscp)) { - if (len <= PAGESIZE) - error = cachefs_getapage_back( - vp, (u_offset_t)off, - len, protp, pl, - plsz, seg, addr, rw, cr); - else error = pvn_getpages( cachefs_getapage_back, vp, ! (u_offset_t)off, len, ! protp, pl, plsz, seg, addr, rw, cr); if (!CFS_TIMEOUT(fscp, error) && (error != EAGAIN)) break; delay(5*hz); --- 7405,7417 ---- continue; } } else { if (CFS_TIMEOUT(fscp, error)) { if (cachefs_cd_access_miss(fscp)) { error = pvn_getpages( cachefs_getapage_back, vp, ! (u_offset_t)off, len, protp, pl, plsz, seg, addr, rw, cr); if (!CFS_TIMEOUT(fscp, error) && (error != EAGAIN)) break; delay(5*hz);
*** 7496,7506 **** return (error); } /* ! * Called from pvn_getpages or cachefs_getpage to get a particular page. */ /*ARGSUSED*/ static int cachefs_getapage(struct vnode *vp, u_offset_t off, size_t len, uint_t *protp, struct page *pl[], size_t plsz, struct seg *seg, caddr_t addr, --- 7485,7495 ---- return (error); } /* ! * Called from pvn_getpages to get a particular page. */ /*ARGSUSED*/ static int cachefs_getapage(struct vnode *vp, u_offset_t off, size_t len, uint_t *protp, struct page *pl[], size_t plsz, struct seg *seg, caddr_t addr,