nfs_node.c (88541) | nfs_node.c (92783) |
---|---|
1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rick Macklem at The University of Guelph. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 23 unchanged lines hidden (view full) --- 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)nfs_node.c 8.6 (Berkeley) 5/22/95 37 */ 38 39#include <sys/cdefs.h> | 1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Rick Macklem at The University of Guelph. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 23 unchanged lines hidden (view full) --- 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)nfs_node.c 8.6 (Berkeley) 5/22/95 37 */ 38 39#include <sys/cdefs.h> |
40__FBSDID("$FreeBSD: head/sys/nfsclient/nfs_node.c 88541 2001-12-27 19:40:34Z dillon $"); | 40__FBSDID("$FreeBSD: head/sys/nfsclient/nfs_node.c 92783 2002-03-20 10:07:52Z jeff $"); |
41 42#include <sys/param.h> 43#include <sys/systm.h> 44#include <sys/fnv_hash.h> 45#include <sys/lock.h> 46#include <sys/malloc.h> 47#include <sys/mount.h> 48#include <sys/namei.h> 49#include <sys/proc.h> 50#include <sys/socket.h> 51#include <sys/sysctl.h> 52#include <sys/vnode.h> 53 | 41 42#include <sys/param.h> 43#include <sys/systm.h> 44#include <sys/fnv_hash.h> 45#include <sys/lock.h> 46#include <sys/malloc.h> 47#include <sys/mount.h> 48#include <sys/namei.h> 49#include <sys/proc.h> 50#include <sys/socket.h> 51#include <sys/sysctl.h> 52#include <sys/vnode.h> 53 |
54#include <vm/vm_zone.h> | 54#include <vm/uma.h> |
55 56#include <nfs/rpcv2.h> 57#include <nfs/nfsproto.h> 58#include <nfsclient/nfs.h> 59#include <nfsclient/nfsnode.h> 60#include <nfsclient/nfsmount.h> 61 | 55 56#include <nfs/rpcv2.h> 57#include <nfs/nfsproto.h> 58#include <nfsclient/nfs.h> 59#include <nfsclient/nfsnode.h> 60#include <nfsclient/nfsmount.h> 61 |
62static vm_zone_t nfsnode_zone; | 62static uma_zone_t nfsnode_zone; |
63static LIST_HEAD(nfsnodehashhead, nfsnode) *nfsnodehashtbl; 64static u_long nfsnodehash; 65static int nfs_node_hash_lock; 66 67#define TRUE 1 68#define FALSE 0 69 70SYSCTL_DECL(_debug_hashstat); --- 78 unchanged lines hidden (view full) --- 149/* 150 * Initialize hash links for nfsnodes 151 * and build nfsnode free list. 152 */ 153void 154nfs_nhinit(void) 155{ 156 | 63static LIST_HEAD(nfsnodehashhead, nfsnode) *nfsnodehashtbl; 64static u_long nfsnodehash; 65static int nfs_node_hash_lock; 66 67#define TRUE 1 68#define FALSE 0 69 70SYSCTL_DECL(_debug_hashstat); --- 78 unchanged lines hidden (view full) --- 149/* 150 * Initialize hash links for nfsnodes 151 * and build nfsnode free list. 152 */ 153void 154nfs_nhinit(void) 155{ 156 |
157 nfsnode_zone = zinit("NFSNODE", sizeof(struct nfsnode), 0, 0, 1); | 157 nfsnode_zone = uma_zcreate("NFSNODE", sizeof(struct nfsnode), NULL, 158 NULL, NULL, NULL, UMA_ALIGN_PTR, 0); |
158 nfsnodehashtbl = hashinit(desiredvnodes, M_NFSHASH, &nfsnodehash); 159} 160 161/* 162 * Look up a vnode/nfsnode by file handle. 163 * Callers must check for mount points!! 164 * In all cases, a pointer to a 165 * nfsnode structure is returned. --- 49 unchanged lines hidden (view full) --- 215 } 216 nfs_node_hash_lock = 1; 217 218 /* 219 * Allocate before getnewvnode since doing so afterward 220 * might cause a bogus v_data pointer to get dereferenced 221 * elsewhere if zalloc should block. 222 */ | 159 nfsnodehashtbl = hashinit(desiredvnodes, M_NFSHASH, &nfsnodehash); 160} 161 162/* 163 * Look up a vnode/nfsnode by file handle. 164 * Callers must check for mount points!! 165 * In all cases, a pointer to a 166 * nfsnode structure is returned. --- 49 unchanged lines hidden (view full) --- 216 } 217 nfs_node_hash_lock = 1; 218 219 /* 220 * Allocate before getnewvnode since doing so afterward 221 * might cause a bogus v_data pointer to get dereferenced 222 * elsewhere if zalloc should block. 223 */ |
223 np = zalloc(nfsnode_zone); | 224 np = uma_zalloc(nfsnode_zone, M_WAITOK); |
224 225 error = getnewvnode(VT_NFS, mntp, nfsv2_vnodeop_p, &nvp); 226 if (error) { 227 if (nfs_node_hash_lock < 0) 228 wakeup(&nfs_node_hash_lock); 229 nfs_node_hash_lock = 0; 230 *npp = 0; | 225 226 error = getnewvnode(VT_NFS, mntp, nfsv2_vnodeop_p, &nvp); 227 if (error) { 228 if (nfs_node_hash_lock < 0) 229 wakeup(&nfs_node_hash_lock); 230 nfs_node_hash_lock = 0; 231 *npp = 0; |
231 zfree(nfsnode_zone, np); | 232 uma_zfree(nfsnode_zone, np); |
232 return (error); 233 } 234 vp = nvp; 235 bzero((caddr_t)np, sizeof *np); 236 vp->v_data = np; 237 np->n_vnode = vp; 238 /* 239 * Insert the nfsnode in the hash queue for its new file handle 240 */ 241 LIST_FOREACH(np2, nhpp, n_hash) { 242 if (mntp != NFSTOV(np2)->v_mount || np2->n_fhsize != fhsize || 243 bcmp((caddr_t)fhp, (caddr_t)np2->n_fhp, fhsize)) 244 continue; 245 vrele(vp); 246 if (nfs_node_hash_lock < 0) 247 wakeup(&nfs_node_hash_lock); 248 nfs_node_hash_lock = 0; | 233 return (error); 234 } 235 vp = nvp; 236 bzero((caddr_t)np, sizeof *np); 237 vp->v_data = np; 238 np->n_vnode = vp; 239 /* 240 * Insert the nfsnode in the hash queue for its new file handle 241 */ 242 LIST_FOREACH(np2, nhpp, n_hash) { 243 if (mntp != NFSTOV(np2)->v_mount || np2->n_fhsize != fhsize || 244 bcmp((caddr_t)fhp, (caddr_t)np2->n_fhp, fhsize)) 245 continue; 246 vrele(vp); 247 if (nfs_node_hash_lock < 0) 248 wakeup(&nfs_node_hash_lock); 249 nfs_node_hash_lock = 0; |
249 zfree(nfsnode_zone, np); | 250 uma_zfree(nfsnode_zone, np); |
250 goto retry; 251 } 252 LIST_INSERT_HEAD(nhpp, np, n_hash); 253 if (fhsize > NFS_SMALLFH) { 254 MALLOC(np->n_fhp, nfsfh_t *, fhsize, M_NFSBIGFH, M_WAITOK); 255 } else 256 np->n_fhp = &np->n_fh; 257 bcopy((caddr_t)fhp, (caddr_t)np->n_fhp, fhsize); --- 89 unchanged lines hidden (view full) --- 347 } 348 if (np->n_fhsize > NFS_SMALLFH) { 349 FREE((caddr_t)np->n_fhp, M_NFSBIGFH); 350 } 351 352 lockdestroy(&np->n_rslock); 353 354 cache_purge(vp); | 251 goto retry; 252 } 253 LIST_INSERT_HEAD(nhpp, np, n_hash); 254 if (fhsize > NFS_SMALLFH) { 255 MALLOC(np->n_fhp, nfsfh_t *, fhsize, M_NFSBIGFH, M_WAITOK); 256 } else 257 np->n_fhp = &np->n_fh; 258 bcopy((caddr_t)fhp, (caddr_t)np->n_fhp, fhsize); --- 89 unchanged lines hidden (view full) --- 348 } 349 if (np->n_fhsize > NFS_SMALLFH) { 350 FREE((caddr_t)np->n_fhp, M_NFSBIGFH); 351 } 352 353 lockdestroy(&np->n_rslock); 354 355 cache_purge(vp); |
355 zfree(nfsnode_zone, vp->v_data); | 356 uma_zfree(nfsnode_zone, vp->v_data); |
356 vp->v_data = (void *)0; 357 return (0); 358} 359 360#if 0 361/* 362 * Lock an nfsnode 363 */ --- 81 unchanged lines hidden --- | 357 vp->v_data = (void *)0; 358 return (0); 359} 360 361#if 0 362/* 363 * Lock an nfsnode 364 */ --- 81 unchanged lines hidden --- |