FreeBSD/sys/fs/nfsclient/nfs_clvnops.c
/*
 * nfs getattr call from vfs.
 */
nfs getattr call from vfs.
nfs getattr call from vfs .
static int
nfs_getattr(struct vop_getattr_args *ap)
{
	struct vnode *vp = ap->a_vp;
	struct thread *td = curthread;	
	struct nfsnode *np = VTONFS(vp);
	int error = 0;
	struct nfsvattr nfsva;
	struct vattr *vap = ap->a_vap;
	struct vattr vattr;
	mtx_lock(&np->n_mtx);
	if (np->n_flag & (NACC | NUPD))
		np->n_flag |= NCHG;
	mtx_unlock(&np->n_mtx);
	if (ncl_getattrcache(vp, &vattr) == 0) {
		vap->va_type = vattr.va_type;
		vap->va_mode = vattr.va_mode;
		vap->va_nlink = vattr.va_nlink;
		vap->va_uid = vattr.va_uid;
		vap->va_gid = vattr.va_gid;
		vap->va_fsid = vattr.va_fsid;
		vap->va_fileid = vattr.va_fileid;
		vap->va_size = vattr.va_size;
		vap->va_blocksize = vattr.va_blocksize;
		vap->va_atime = vattr.va_atime;
		vap->va_mtime = vattr.va_mtime;
		vap->va_ctime = vattr.va_ctime;
		vap->va_gen = vattr.va_gen;
		vap->va_flags = vattr.va_flags;
		vap->va_rdev = vattr.va_rdev;
		vap->va_bytes = vattr.va_bytes;
		vap->va_filerev = vattr.va_filerev;
		nfscl_deleggetmodtime(vp, &vap->va_mtime);
		return (0);
	}
	if (NFS_ISV34(vp) && nfs_prime_access_cache &&
	    nfsaccess_cache_timeout > 0) {
		NFSINCRGLOBAL(newnfsstats.accesscache_misses);
		nfs34_access_otw(vp, NFSACCESS_ALL, td, ap->a_cred, NULL);
		if (ncl_getattrcache(vp, ap->a_vap) == 0) {
			nfscl_deleggetmodtime(vp, &ap->a_vap->va_mtime);
			return (0);
		}
	}
	error = nfsrpc_getattr(vp, ap->a_cred, td, &nfsva, NULL);
	if (!error)
		error = nfscl_loadattrcache(&vp, &nfsva, vap, NULL, 0, 0);
	if (!error) {
		nfscl_deleggetmodtime(vp, &vap->va_mtime);
	} else if (NFS_ISV4(vp)) {
		error = nfscl_maperr(td, error, (uid_t)0, (gid_t)0);
	}
	return (error);
}
static int nfs_getattr ( struct vop_getattr_args * ap ) { struct vnode * vp = ap -> a_vp ; struct thread * td = curthread ; struct nfsnode * np = VTONFS ( vp ) ; int error = 0 ; struct nfsvattr nfsva ; struct vattr * vap = ap -> a_vap ; struct vattr vattr ; mtx_lock ( & np -> n_mtx ) ; if ( np -> n_flag & ( NACC | NUPD ) ) np -> n_flag |= NCHG ; mtx_unlock ( & np -> n_mtx ) ; if ( ncl_getattrcache ( vp , & vattr ) == 0 ) { vap -> va_type = vattr . va_type ; vap -> va_mode = vattr . va_mode ; vap -> va_nlink = vattr . va_nlink ; vap -> va_uid = vattr . va_uid ; vap -> va_gid = vattr . va_gid ; vap -> va_fsid = vattr . va_fsid ; vap -> va_fileid = vattr . va_fileid ; vap -> va_size = vattr . va_size ; vap -> va_blocksize = vattr . va_blocksize ; vap -> va_atime = vattr . va_atime ; vap -> va_mtime = vattr . va_mtime ; vap -> va_ctime = vattr . va_ctime ; vap -> va_gen = vattr . va_gen ; vap -> va_flags = vattr . va_flags ; vap -> va_rdev = vattr . va_rdev ; vap -> va_bytes = vattr . va_bytes ; vap -> va_filerev = vattr . va_filerev ; nfscl_deleggetmodtime ( vp , & vap -> va_mtime ) ; return ( 0 ) ; } if ( NFS_ISV34 ( vp ) && nfs_prime_access_cache && nfsaccess_cache_timeout > 0 ) { NFSINCRGLOBAL ( newnfsstats . accesscache_misses ) ; nfs34_access_otw ( vp , NFSACCESS_ALL , td , ap -> a_cred , NULL ) ; if ( ncl_getattrcache ( vp , ap -> a_vap ) == 0 ) { nfscl_deleggetmodtime ( vp , & ap -> a_vap -> va_mtime ) ; return ( 0 ) ; } } error = nfsrpc_getattr ( vp , ap -> a_cred , td , & nfsva , NULL ) ; if ( ! error ) error = nfscl_loadattrcache ( & vp , & nfsva , vap , NULL , 0 , 0 ) ; if ( ! error ) { nfscl_deleggetmodtime ( vp , & vap -> va_mtime ) ; } else if ( NFS_ISV4 ( vp ) ) { error = nfscl_maperr ( td , error , ( uid_t ) 0 , ( gid_t ) 0 ) ; } return ( error ) ; }
nfs getattr call from vfs.
nfs getattr call from vfs .
/* XXX */ /*
	 * Update local times for special files.
	 */ /*
	 * First look in the cache.
	 */ /*
		 * Get the local modify time for the case of a write
		 * delegation.
		 */ /*
		 * Get the local modify time for the case of a write
		 * delegation.
		 */