Deleted Added
full compact
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 ---