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,