Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/nfsclient/nfs_clsubs.c
Show First 20 Lines • Show All 179 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
int | int | ||||
ncl_getattrcache(struct vnode *vp, struct vattr *vaper) | ncl_getattrcache(struct vnode *vp, struct vattr *vaper) | ||||
{ | { | ||||
struct nfsnode *np; | struct nfsnode *np; | ||||
struct vattr *vap; | struct vattr *vap; | ||||
struct nfsmount *nmp; | struct nfsmount *nmp; | ||||
int timeo, mustflush; | int timeo, mustflush; | ||||
u_quad_t nsize; | |||||
bool setnsize; | |||||
np = VTONFS(vp); | np = VTONFS(vp); | ||||
vap = &np->n_vattr.na_vattr; | vap = &np->n_vattr.na_vattr; | ||||
nmp = VFSTONFS(vp->v_mount); | nmp = VFSTONFS(vp->v_mount); | ||||
mustflush = nfscl_mustflush(vp); /* must be before mtx_lock() */ | mustflush = nfscl_mustflush(vp); /* must be before mtx_lock() */ | ||||
NFSLOCKNODE(np); | NFSLOCKNODE(np); | ||||
/* XXX n_mtime doesn't seem to be updated on a miss-and-reload */ | /* XXX n_mtime doesn't seem to be updated on a miss-and-reload */ | ||||
timeo = (time_second - np->n_mtime.tv_sec) / 10; | timeo = (time_second - np->n_mtime.tv_sec) / 10; | ||||
Show All 29 Lines | #endif | ||||
if ((time_second - np->n_attrstamp) >= timeo && | if ((time_second - np->n_attrstamp) >= timeo && | ||||
(mustflush != 0 || np->n_attrstamp == 0)) { | (mustflush != 0 || np->n_attrstamp == 0)) { | ||||
nfsstatsv1.attrcache_misses++; | nfsstatsv1.attrcache_misses++; | ||||
NFSUNLOCKNODE(np); | NFSUNLOCKNODE(np); | ||||
KDTRACE_NFS_ATTRCACHE_GET_MISS(vp); | KDTRACE_NFS_ATTRCACHE_GET_MISS(vp); | ||||
return( ENOENT); | return( ENOENT); | ||||
} | } | ||||
nfsstatsv1.attrcache_hits++; | nfsstatsv1.attrcache_hits++; | ||||
setnsize = false; | |||||
if (vap->va_size != np->n_size) { | if (vap->va_size != np->n_size) { | ||||
if (vap->va_type == VREG) { | if (vap->va_type == VREG) { | ||||
if (np->n_flag & NMODIFIED) { | if (np->n_flag & NMODIFIED) { | ||||
if (vap->va_size < np->n_size) | if (vap->va_size < np->n_size) | ||||
vap->va_size = np->n_size; | vap->va_size = np->n_size; | ||||
else | else | ||||
np->n_size = vap->va_size; | np->n_size = vap->va_size; | ||||
} else { | } else { | ||||
np->n_size = vap->va_size; | np->n_size = vap->va_size; | ||||
} | } | ||||
vnode_pager_setsize(vp, np->n_size); | setnsize = ncl_pager_setsize(vp, &nsize); | ||||
} else { | } else { | ||||
np->n_size = vap->va_size; | np->n_size = vap->va_size; | ||||
} | } | ||||
} | } | ||||
bcopy((caddr_t)vap, (caddr_t)vaper, sizeof(struct vattr)); | bcopy((caddr_t)vap, (caddr_t)vaper, sizeof(struct vattr)); | ||||
if (np->n_flag & NCHG) { | if (np->n_flag & NCHG) { | ||||
if (np->n_flag & NACC) | if (np->n_flag & NACC) | ||||
vaper->va_atime = np->n_atim; | vaper->va_atime = np->n_atim; | ||||
if (np->n_flag & NUPD) | if (np->n_flag & NUPD) | ||||
vaper->va_mtime = np->n_mtim; | vaper->va_mtime = np->n_mtim; | ||||
} | } | ||||
NFSUNLOCKNODE(np); | NFSUNLOCKNODE(np); | ||||
if (setnsize) | |||||
vnode_pager_setsize(vp, nsize); | |||||
KDTRACE_NFS_ATTRCACHE_GET_HIT(vp, vap); | KDTRACE_NFS_ATTRCACHE_GET_HIT(vp, vap); | ||||
return (0); | return (0); | ||||
} | } | ||||
static nfsuint64 nfs_nullcookie = { { 0, 0 } }; | static nfsuint64 nfs_nullcookie = { { 0, 0 } }; | ||||
/* | /* | ||||
* This function finds the directory cookie that corresponds to the | * This function finds the directory cookie that corresponds to the | ||||
* logical byte offset given. | * logical byte offset given. | ||||
▲ Show 20 Lines • Show All 123 Lines • Show Last 20 Lines |