c6315dad321a8e636cd5ec7525cb0764a411943e
[dragonfly.git] / sys / kern / vfs_cache.c
1 /*
2  * Copyright (c) 2003,2004,2009 The DragonFly Project.  All rights reserved.
3  * 
4  * This code is derived from software contributed to The DragonFly Project
5  * by Matthew Dillon <dillon@backplane.com>
6  * 
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  * 
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  * 
34  * Copyright (c) 1989, 1993, 1995
35  *      The Regents of the University of California.  All rights reserved.
36  *
37  * This code is derived from software contributed to Berkeley by
38  * Poul-Henning Kamp of the FreeBSD Project.
39  *
40  * Redistribution and use in source and binary forms, with or without
41  * modification, are permitted provided that the following conditions
42  * are met:
43  * 1. Redistributions of source code must retain the above copyright
44  *    notice, this list of conditions and the following disclaimer.
45  * 2. Redistributions in binary form must reproduce the above copyright
46  *    notice, this list of conditions and the following disclaimer in the
47  *    documentation and/or other materials provided with the distribution.
48  * 3. Neither the name of the University nor the names of its contributors
49  *    may be used to endorse or promote products derived from this software
50  *    without specific prior written permission.
51  *
52  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62  * SUCH DAMAGE.
63  */
64
65 #include <sys/param.h>
66 #include <sys/systm.h>
67 #include <sys/kernel.h>
68 #include <sys/sysctl.h>
69 #include <sys/mount.h>
70 #include <sys/vnode.h>
71 #include <sys/malloc.h>
72 #include <sys/sysproto.h>
73 #include <sys/spinlock.h>
74 #include <sys/proc.h>
75 #include <sys/namei.h>
76 #include <sys/nlookup.h>
77 #include <sys/filedesc.h>
78 #include <sys/fnv_hash.h>
79 #include <sys/globaldata.h>
80 #include <sys/kern_syscall.h>
81 #include <sys/dirent.h>
82 #include <ddb/ddb.h>
83
84 #include <sys/sysref2.h>
85 #include <sys/spinlock2.h>
86
87 #define MAX_RECURSION_DEPTH     64
88
89 /*
90  * Random lookups in the cache are accomplished with a hash table using
91  * a hash key of (nc_src_vp, name).  Each hash chain has its own spin lock.
92  *
93  * Negative entries may exist and correspond to resolved namecache
94  * structures where nc_vp is NULL.  In a negative entry, NCF_WHITEOUT
95  * will be set if the entry corresponds to a whited-out directory entry
96  * (verses simply not finding the entry at all).   ncneg.list is locked
97  * with a global spinlock (ncneg.spin).
98  *
99  * MPSAFE RULES:
100  *
101  * (1) A ncp must be referenced before it can be locked.
102  *
103  * (2) A ncp must be locked in order to modify it.
104  *
105  * (3) ncp locks are always ordered child -> parent.  That may seem
106  *     backwards but forward scans use the hash table and thus can hold
107  *     the parent unlocked when traversing downward.
108  *
109  *     This allows insert/rename/delete/dot-dot and other operations
110  *     to use ncp->nc_parent links.
111  *
112  *     This also prevents a locked up e.g. NFS node from creating a
113  *     chain reaction all the way back to the root vnode / namecache.
114  *
115  * (4) parent linkages require both the parent and child to be locked.
116  */
117
118 /*
119  * Structures associated with name cacheing.
120  */
121 #define NCHHASH(hash)           (&nchashtbl[(hash) & nchash])
122 #define MINNEG                  1024
123 #define MINPOS                  1024
124 #define NCMOUNT_NUMCACHE        1009    /* prime number */
125
126 MALLOC_DEFINE(M_VFSCACHE, "vfscache", "VFS name cache entries");
127
128 LIST_HEAD(nchash_list, namecache);
129
130 /*
131  * Don't cachealign, but at least pad to 32 bytes so entries
132  * don't cross a cache line.
133  */
134 struct nchash_head {
135        struct nchash_list list; /* 16 bytes */
136        struct spinlock  spin;   /* 8 bytes */
137        long     pad01;          /* 8 bytes */
138 };
139
140 struct ncmount_cache {
141         struct spinlock spin;
142         struct namecache *ncp;
143         struct mount *mp;
144         int isneg;              /* if != 0 mp is originator and not target */
145 };
146
147 struct ncneg_cache {
148         struct spinlock         spin;
149         struct namecache_list   list;
150 } __cachealign;
151
152 static struct nchash_head       *nchashtbl;
153 static struct ncneg_cache       ncneg;
154 static struct ncmount_cache     ncmount_cache[NCMOUNT_NUMCACHE];
155
156 /*
157  * ncvp_debug - debug cache_fromvp().  This is used by the NFS server
158  * to create the namecache infrastructure leading to a dangling vnode.
159  *
160  * 0    Only errors are reported
161  * 1    Successes are reported
162  * 2    Successes + the whole directory scan is reported
163  * 3    Force the directory scan code run as if the parent vnode did not
164  *      have a namecache record, even if it does have one.
165  */
166 static int      ncvp_debug;
167 SYSCTL_INT(_debug, OID_AUTO, ncvp_debug, CTLFLAG_RW, &ncvp_debug, 0,
168     "Namecache debug level (0-3)");
169
170 static u_long   nchash;                 /* size of hash table */
171 SYSCTL_ULONG(_debug, OID_AUTO, nchash, CTLFLAG_RD, &nchash, 0,
172     "Size of namecache hash table");
173
174 static int      ncnegflush = 10;        /* burst for negative flush */
175 SYSCTL_INT(_debug, OID_AUTO, ncnegflush, CTLFLAG_RW, &ncnegflush, 0,
176     "Batch flush negative entries");
177
178 static int      ncposflush = 10;        /* burst for positive flush */
179 SYSCTL_INT(_debug, OID_AUTO, ncposflush, CTLFLAG_RW, &ncposflush, 0,
180     "Batch flush positive entries");
181
182 static int      ncnegfactor = 16;       /* ratio of negative entries */
183 SYSCTL_INT(_debug, OID_AUTO, ncnegfactor, CTLFLAG_RW, &ncnegfactor, 0,
184     "Ratio of namecache negative entries");
185
186 static int      nclockwarn;             /* warn on locked entries in ticks */
187 SYSCTL_INT(_debug, OID_AUTO, nclockwarn, CTLFLAG_RW, &nclockwarn, 0,
188     "Warn on locked namecache entries in ticks");
189
190 static int      numdefered;             /* number of cache entries allocated */
191 SYSCTL_INT(_debug, OID_AUTO, numdefered, CTLFLAG_RD, &numdefered, 0,
192     "Number of cache entries allocated");
193
194 static int      ncposlimit;             /* number of cache entries allocated */
195 SYSCTL_INT(_debug, OID_AUTO, ncposlimit, CTLFLAG_RW, &ncposlimit, 0,
196     "Number of cache entries allocated");
197
198 static int      ncp_shared_lock_disable = 0;
199 SYSCTL_INT(_debug, OID_AUTO, ncp_shared_lock_disable, CTLFLAG_RW,
200            &ncp_shared_lock_disable, 0, "Disable shared namecache locks");
201
202 SYSCTL_INT(_debug, OID_AUTO, vnsize, CTLFLAG_RD, 0, sizeof(struct vnode),
203     "sizeof(struct vnode)");
204 SYSCTL_INT(_debug, OID_AUTO, ncsize, CTLFLAG_RD, 0, sizeof(struct namecache),
205     "sizeof(struct namecache)");
206
207 static int      ncmount_cache_enable = 1;
208 SYSCTL_INT(_debug, OID_AUTO, ncmount_cache_enable, CTLFLAG_RW,
209            &ncmount_cache_enable, 0, "mount point cache");
210
211 static __inline void _cache_drop(struct namecache *ncp);
212 static int cache_resolve_mp(struct mount *mp);
213 static struct vnode *cache_dvpref(struct namecache *ncp);
214 static void _cache_lock(struct namecache *ncp);
215 static void _cache_setunresolved(struct namecache *ncp);
216 static void _cache_cleanneg(int count);
217 static void _cache_cleanpos(int count);
218 static void _cache_cleandefered(void);
219 static void _cache_unlink(struct namecache *ncp);
220
221 /*
222  * The new name cache statistics
223  */
224 SYSCTL_NODE(_vfs, OID_AUTO, cache, CTLFLAG_RW, 0, "Name cache statistics");
225 static int numneg;
226 SYSCTL_INT(_vfs_cache, OID_AUTO, numneg, CTLFLAG_RD, &numneg, 0,
227     "Number of negative namecache entries");
228 static int numcache;
229 SYSCTL_INT(_vfs_cache, OID_AUTO, numcache, CTLFLAG_RD, &numcache, 0,
230     "Number of namecaches entries");
231
232 struct nchstats nchstats[SMP_MAXCPU];
233 /*
234  * Export VFS cache effectiveness statistics to user-land.
235  *
236  * The statistics are left for aggregation to user-land so
237  * neat things can be achieved, like observing per-CPU cache
238  * distribution.
239  */
240 static int
241 sysctl_nchstats(SYSCTL_HANDLER_ARGS)
242 {
243         struct globaldata *gd;
244         int i, error;
245
246         error = 0;
247         for (i = 0; i < ncpus; ++i) {
248                 gd = globaldata_find(i);
249                 if ((error = SYSCTL_OUT(req, (void *)&(*gd->gd_nchstats),
250                         sizeof(struct nchstats))))
251                         break;
252         }
253
254         return (error);
255 }
256 SYSCTL_PROC(_vfs_cache, OID_AUTO, nchstats, CTLTYPE_OPAQUE|CTLFLAG_RD,
257   0, 0, sysctl_nchstats, "S,nchstats", "VFS cache effectiveness statistics");
258
259 static struct namecache *cache_zap(struct namecache *ncp, int nonblock);
260
261 /*
262  * Cache mount points and namecache records in order to avoid unnecessary
263  * atomic ops on mnt_refs and ncp->refs.  This improves concurrent SMP
264  * performance and is particularly important on multi-socket systems to
265  * reduce cache-line ping-ponging.
266  *
267  * Try to keep the pcpu structure within one cache line (~64 bytes).
268  */
269 #define MNTCACHE_COUNT      5
270
271 struct mntcache {
272         struct mount    *mntary[MNTCACHE_COUNT];
273         struct namecache *ncp1;
274         struct namecache *ncp2;
275         struct nchandle  ncdir;
276         int             iter;
277         int             unused01;
278 } __cachealign;
279
280 static struct mntcache  pcpu_mntcache[MAXCPU];
281
282 static
283 void
284 _cache_mntref(struct mount *mp)
285 {
286         struct mntcache *cache = &pcpu_mntcache[mycpu->gd_cpuid];
287         int i;
288
289         for (i = 0; i < MNTCACHE_COUNT; ++i) {
290                 if (cache->mntary[i] != mp)
291                         continue;
292                 if (atomic_cmpset_ptr((void *)&cache->mntary[i], mp, NULL))
293                         return;
294         }
295         atomic_add_int(&mp->mnt_refs, 1);
296 }
297
298 static
299 void
300 _cache_mntrel(struct mount *mp)
301 {
302         struct mntcache *cache = &pcpu_mntcache[mycpu->gd_cpuid];
303         int i;
304
305         for (i = 0; i < MNTCACHE_COUNT; ++i) {
306                 if (cache->mntary[i] == NULL) {
307                         mp = atomic_swap_ptr((void *)&cache->mntary[i], mp);
308                         if (mp == NULL)
309                                 return;
310                 }
311         }
312         i = (int)((uint32_t)++cache->iter % (uint32_t)MNTCACHE_COUNT);
313         mp = atomic_swap_ptr((void *)&cache->mntary[i], mp);
314         if (mp)
315                 atomic_add_int(&mp->mnt_refs, -1);
316 }
317
318 /*
319  * Clears all cached mount points on all cpus.  This routine should only
320  * be called when we are waiting for a mount to clear, e.g. so we can
321  * unmount.
322  */
323 void
324 cache_clearmntcache(void)
325 {
326         int n;
327
328         for (n = 0; n < ncpus; ++n) {
329                 struct mntcache *cache = &pcpu_mntcache[n];
330                 struct namecache *ncp;
331                 struct mount *mp;
332                 int i;
333
334                 for (i = 0; i < MNTCACHE_COUNT; ++i) {
335                         if (cache->mntary[i]) {
336                                 mp = atomic_swap_ptr(
337                                         (void *)&cache->mntary[i], NULL);
338                                 if (mp)
339                                         atomic_add_int(&mp->mnt_refs, -1);
340                         }
341                 }
342                 if (cache->ncp1) {
343                         ncp = atomic_swap_ptr((void *)&cache->ncp1, NULL);
344                         if (ncp)
345                                 _cache_drop(ncp);
346                 }
347                 if (cache->ncp2) {
348                         ncp = atomic_swap_ptr((void *)&cache->ncp2, NULL);
349                         if (ncp)
350                                 _cache_drop(ncp);
351                 }
352                 if (cache->ncdir.ncp) {
353                         ncp = atomic_swap_ptr((void *)&cache->ncdir.ncp, NULL);
354                         if (ncp)
355                                 _cache_drop(ncp);
356                 }
357                 if (cache->ncdir.mount) {
358                         mp = atomic_swap_ptr((void *)&cache->ncdir.mount, NULL);
359                         if (mp)
360                                 atomic_add_int(&mp->mnt_refs, -1);
361                 }
362         }
363 }
364
365
366 /*
367  * Namespace locking.  The caller must already hold a reference to the
368  * namecache structure in order to lock/unlock it.  This function prevents
369  * the namespace from being created or destroyed by accessors other then
370  * the lock holder.
371  *
372  * Note that holding a locked namecache structure prevents other threads
373  * from making namespace changes (e.g. deleting or creating), prevents
374  * vnode association state changes by other threads, and prevents the
375  * namecache entry from being resolved or unresolved by other threads.
376  *
377  * An exclusive lock owner has full authority to associate/disassociate
378  * vnodes and resolve/unresolve the locked ncp.
379  *
380  * A shared lock owner only has authority to acquire the underlying vnode,
381  * if any.
382  *
383  * The primary lock field is nc_lockstatus.  nc_locktd is set after the
384  * fact (when locking) or cleared prior to unlocking.
385  *
386  * WARNING!  Holding a locked ncp will prevent a vnode from being destroyed
387  *           or recycled, but it does NOT help you if the vnode had already
388  *           initiated a recyclement.  If this is important, use cache_get()
389  *           rather then cache_lock() (and deal with the differences in the
390  *           way the refs counter is handled).  Or, alternatively, make an
391  *           unconditional call to cache_validate() or cache_resolve()
392  *           after cache_lock() returns.
393  */
394 static
395 void
396 _cache_lock(struct namecache *ncp)
397 {
398         thread_t td;
399         int didwarn;
400         int begticks;
401         int error;
402         u_int count;
403
404         KKASSERT(ncp->nc_refs != 0);
405         didwarn = 0;
406         begticks = 0;
407         td = curthread;
408
409         for (;;) {
410                 count = ncp->nc_lockstatus;
411                 cpu_ccfence();
412
413                 if ((count & ~(NC_EXLOCK_REQ|NC_SHLOCK_REQ)) == 0) {
414                         if (atomic_cmpset_int(&ncp->nc_lockstatus,
415                                               count, count + 1)) {
416                                 /*
417                                  * The vp associated with a locked ncp must
418                                  * be held to prevent it from being recycled.
419                                  *
420                                  * WARNING!  If VRECLAIMED is set the vnode
421                                  * could already be in the middle of a recycle.
422                                  * Callers must use cache_vref() or
423                                  * cache_vget() on the locked ncp to
424                                  * validate the vp or set the cache entry
425                                  * to unresolved.
426                                  *
427                                  * NOTE! vhold() is allowed if we hold a
428                                  *       lock on the ncp (which we do).
429                                  */
430                                 ncp->nc_locktd = td;
431                                 if (ncp->nc_vp)
432                                         vhold(ncp->nc_vp);
433                                 break;
434                         }
435                         /* cmpset failed */
436                         continue;
437                 }
438                 if (ncp->nc_locktd == td) {
439                         KKASSERT((count & NC_SHLOCK_FLAG) == 0);
440                         if (atomic_cmpset_int(&ncp->nc_lockstatus,
441                                               count, count + 1)) {
442                                 break;
443                         }
444                         /* cmpset failed */
445                         continue;
446                 }
447                 tsleep_interlock(&ncp->nc_locktd, 0);
448                 if (atomic_cmpset_int(&ncp->nc_lockstatus, count,
449                                       count | NC_EXLOCK_REQ) == 0) {
450                         /* cmpset failed */
451                         continue;
452                 }
453                 if (begticks == 0)
454                         begticks = ticks;
455                 error = tsleep(&ncp->nc_locktd, PINTERLOCKED,
456                                "clock", nclockwarn);
457                 if (error == EWOULDBLOCK) {
458                         if (didwarn == 0) {
459                                 didwarn = ticks;
460                                 kprintf("[diagnostic] cache_lock: "
461                                         "%s blocked on %p %08x",
462                                         td->td_comm, ncp, count);
463                                 kprintf(" \"%*.*s\"\n",
464                                         ncp->nc_nlen, ncp->nc_nlen,
465                                         ncp->nc_name);
466                         }
467                 }
468                 /* loop */
469         }
470         if (didwarn) {
471                 kprintf("[diagnostic] cache_lock: %s unblocked %*.*s after "
472                         "%d secs\n",
473                         td->td_comm,
474                         ncp->nc_nlen, ncp->nc_nlen, ncp->nc_name,
475                         (int)(ticks + (hz / 2) - begticks) / hz);
476         }
477 }
478
479 /*
480  * The shared lock works similarly to the exclusive lock except
481  * nc_locktd is left NULL and we need an interlock (VHOLD) to
482  * prevent vhold() races, since the moment our cmpset_int succeeds
483  * another cpu can come in and get its own shared lock.
484  *
485  * A critical section is needed to prevent interruption during the
486  * VHOLD interlock.
487  */
488 static
489 void
490 _cache_lock_shared(struct namecache *ncp)
491 {
492         int didwarn;
493         int error;
494         u_int count;
495         u_int optreq = NC_EXLOCK_REQ;
496
497         KKASSERT(ncp->nc_refs != 0);
498         didwarn = 0;
499
500         for (;;) {
501                 count = ncp->nc_lockstatus;
502                 cpu_ccfence();
503
504                 if ((count & ~NC_SHLOCK_REQ) == 0) {
505                         crit_enter();
506                         if (atomic_cmpset_int(&ncp->nc_lockstatus,
507                                       count,
508                                       (count + 1) | NC_SHLOCK_FLAG |
509                                                     NC_SHLOCK_VHOLD)) {
510                                 /*
511                                  * The vp associated with a locked ncp must
512                                  * be held to prevent it from being recycled.
513                                  *
514                                  * WARNING!  If VRECLAIMED is set the vnode
515                                  * could already be in the middle of a recycle.
516                                  * Callers must use cache_vref() or
517                                  * cache_vget() on the locked ncp to
518                                  * validate the vp or set the cache entry
519                                  * to unresolved.
520                                  *
521                                  * NOTE! vhold() is allowed if we hold a
522                                  *       lock on the ncp (which we do).
523                                  */
524                                 if (ncp->nc_vp)
525                                         vhold(ncp->nc_vp);
526                                 atomic_clear_int(&ncp->nc_lockstatus,
527                                                  NC_SHLOCK_VHOLD);
528                                 crit_exit();
529                                 break;
530                         }
531                         /* cmpset failed */
532                         crit_exit();
533                         continue;
534                 }
535
536                 /*
537                  * If already held shared we can just bump the count, but
538                  * only allow this if nobody is trying to get the lock
539                  * exclusively.  If we are blocking too long ignore excl
540                  * requests (which can race/deadlock us).
541                  *
542                  * VHOLD is a bit of a hack.  Even though we successfully
543                  * added another shared ref, the cpu that got the first
544                  * shared ref might not yet have held the vnode.
545                  */
546                 if ((count & (optreq|NC_SHLOCK_FLAG)) == NC_SHLOCK_FLAG) {
547                         KKASSERT((count & ~(NC_EXLOCK_REQ |
548                                             NC_SHLOCK_REQ |
549                                             NC_SHLOCK_FLAG)) > 0);
550                         if (atomic_cmpset_int(&ncp->nc_lockstatus,
551                                               count, count + 1)) {
552                                 while (ncp->nc_lockstatus & NC_SHLOCK_VHOLD)
553                                         cpu_pause();
554                                 break;
555                         }
556                         continue;
557                 }
558                 tsleep_interlock(ncp, 0);
559                 if (atomic_cmpset_int(&ncp->nc_lockstatus, count,
560                                       count | NC_SHLOCK_REQ) == 0) {
561                         /* cmpset failed */
562                         continue;
563                 }
564                 error = tsleep(ncp, PINTERLOCKED, "clocksh", nclockwarn);
565                 if (error == EWOULDBLOCK) {
566                         optreq = 0;
567                         if (didwarn == 0) {
568                                 didwarn = ticks - nclockwarn;
569                                 kprintf("[diagnostic] cache_lock_shared: "
570                                         "%s blocked on %p %08x",
571                                         curthread->td_comm, ncp, count);
572                                 kprintf(" \"%*.*s\"\n",
573                                         ncp->nc_nlen, ncp->nc_nlen,
574                                         ncp->nc_name);
575                         }
576                 }
577                 /* loop */
578         }
579         if (didwarn) {
580                 kprintf("[diagnostic] cache_lock_shared: "
581                         "%s unblocked %*.*s after %d secs\n",
582                         curthread->td_comm,
583                         ncp->nc_nlen, ncp->nc_nlen, ncp->nc_name,
584                         (int)(ticks - didwarn) / hz);
585         }
586 }
587
588 /*
589  * Lock ncp exclusively, return 0 on success.
590  *
591  * NOTE: nc_refs may be zero if the ncp is interlocked by circumstance,
592  *       such as the case where one of its children is locked.
593  */
594 static
595 int
596 _cache_lock_nonblock(struct namecache *ncp)
597 {
598         thread_t td;
599         u_int count;
600
601         td = curthread;
602
603         for (;;) {
604                 count = ncp->nc_lockstatus;
605
606                 if ((count & ~(NC_EXLOCK_REQ|NC_SHLOCK_REQ)) == 0) {
607                         if (atomic_cmpset_int(&ncp->nc_lockstatus,
608                                               count, count + 1)) {
609                                 /*
610                                  * The vp associated with a locked ncp must
611                                  * be held to prevent it from being recycled.
612                                  *
613                                  * WARNING!  If VRECLAIMED is set the vnode
614                                  * could already be in the middle of a recycle.
615                                  * Callers must use cache_vref() or
616                                  * cache_vget() on the locked ncp to
617                                  * validate the vp or set the cache entry
618                                  * to unresolved.
619                                  *
620                                  * NOTE! vhold() is allowed if we hold a
621                                  *       lock on the ncp (which we do).
622                                  */
623                                 ncp->nc_locktd = td;
624                                 if (ncp->nc_vp)
625                                         vhold(ncp->nc_vp);
626                                 break;
627                         }
628                         /* cmpset failed */
629                         continue;
630                 }
631                 if (ncp->nc_locktd == td) {
632                         if (atomic_cmpset_int(&ncp->nc_lockstatus,
633                                               count, count + 1)) {
634                                 break;
635                         }
636                         /* cmpset failed */
637                         continue;
638                 }
639                 return(EWOULDBLOCK);
640         }
641         return(0);
642 }
643
644 /*
645  * The shared lock works similarly to the exclusive lock except
646  * nc_locktd is left NULL and we need an interlock (VHOLD) to
647  * prevent vhold() races, since the moment our cmpset_int succeeds
648  * another cpu can come in and get its own shared lock.
649  *
650  * A critical section is needed to prevent interruption during the
651  * VHOLD interlock.
652  */
653 static
654 int
655 _cache_lock_shared_nonblock(struct namecache *ncp)
656 {
657         u_int count;
658
659         for (;;) {
660                 count = ncp->nc_lockstatus;
661
662                 if ((count & ~NC_SHLOCK_REQ) == 0) {
663                         crit_enter();
664                         if (atomic_cmpset_int(&ncp->nc_lockstatus,
665                                       count,
666                                       (count + 1) | NC_SHLOCK_FLAG |
667                                                     NC_SHLOCK_VHOLD)) {
668                                 /*
669                                  * The vp associated with a locked ncp must
670                                  * be held to prevent it from being recycled.
671                                  *
672                                  * WARNING!  If VRECLAIMED is set the vnode
673                                  * could already be in the middle of a recycle.
674                                  * Callers must use cache_vref() or
675                                  * cache_vget() on the locked ncp to
676                                  * validate the vp or set the cache entry
677                                  * to unresolved.
678                                  *
679                                  * NOTE! vhold() is allowed if we hold a
680                                  *       lock on the ncp (which we do).
681                                  */
682                                 if (ncp->nc_vp)
683                                         vhold(ncp->nc_vp);
684                                 atomic_clear_int(&ncp->nc_lockstatus,
685                                                  NC_SHLOCK_VHOLD);
686                                 crit_exit();
687                                 break;
688                         }
689                         /* cmpset failed */
690                         crit_exit();
691                         continue;
692                 }
693
694                 /*
695                  * If already held shared we can just bump the count, but
696                  * only allow this if nobody is trying to get the lock
697                  * exclusively.
698                  *
699                  * VHOLD is a bit of a hack.  Even though we successfully
700                  * added another shared ref, the cpu that got the first
701                  * shared ref might not yet have held the vnode.
702                  */
703                 if ((count & (NC_EXLOCK_REQ|NC_SHLOCK_FLAG)) ==
704                     NC_SHLOCK_FLAG) {
705                         KKASSERT((count & ~(NC_EXLOCK_REQ |
706                                             NC_SHLOCK_REQ |
707                                             NC_SHLOCK_FLAG)) > 0);
708                         if (atomic_cmpset_int(&ncp->nc_lockstatus,
709                                               count, count + 1)) {
710                                 while (ncp->nc_lockstatus & NC_SHLOCK_VHOLD)
711                                         cpu_pause();
712                                 break;
713                         }
714                         continue;
715                 }
716                 return(EWOULDBLOCK);
717         }
718         return(0);
719 }
720
721 /*
722  * Helper function
723  *
724  * NOTE: nc_refs can be 0 (degenerate case during _cache_drop).
725  *
726  *       nc_locktd must be NULLed out prior to nc_lockstatus getting cleared.
727  */
728 static
729 void
730 _cache_unlock(struct namecache *ncp)
731 {
732         thread_t td __debugvar = curthread;
733         u_int count;
734         u_int ncount;
735         struct vnode *dropvp;
736
737         KKASSERT(ncp->nc_refs >= 0);
738         KKASSERT((ncp->nc_lockstatus & ~(NC_EXLOCK_REQ|NC_SHLOCK_REQ)) > 0);
739         KKASSERT((ncp->nc_lockstatus & NC_SHLOCK_FLAG) || ncp->nc_locktd == td);
740
741         count = ncp->nc_lockstatus;
742         cpu_ccfence();
743
744         /*
745          * Clear nc_locktd prior to the atomic op (excl lock only)
746          */
747         if ((count & ~(NC_EXLOCK_REQ|NC_SHLOCK_REQ)) == 1)
748                 ncp->nc_locktd = NULL;
749         dropvp = NULL;
750
751         for (;;) {
752                 if ((count &
753                      ~(NC_EXLOCK_REQ|NC_SHLOCK_REQ|NC_SHLOCK_FLAG)) == 1) {
754                         dropvp = ncp->nc_vp;
755                         if (count & NC_EXLOCK_REQ)
756                                 ncount = count & NC_SHLOCK_REQ; /* cnt->0 */
757                         else
758                                 ncount = 0;
759
760                         if (atomic_cmpset_int(&ncp->nc_lockstatus,
761                                               count, ncount)) {
762                                 if (count & NC_EXLOCK_REQ)
763                                         wakeup(&ncp->nc_locktd);
764                                 else if (count & NC_SHLOCK_REQ)
765                                         wakeup(ncp);
766                                 break;
767                         }
768                         dropvp = NULL;
769                 } else {
770                         KKASSERT((count & NC_SHLOCK_VHOLD) == 0);
771                         KKASSERT((count & ~(NC_EXLOCK_REQ |
772                                             NC_SHLOCK_REQ |
773                                             NC_SHLOCK_FLAG)) > 1);
774                         if (atomic_cmpset_int(&ncp->nc_lockstatus,
775                                               count, count - 1)) {
776                                 break;
777                         }
778                 }
779                 count = ncp->nc_lockstatus;
780                 cpu_ccfence();
781         }
782
783         /*
784          * Don't actually drop the vp until we successfully clean out
785          * the lock, otherwise we may race another shared lock.
786          */
787         if (dropvp)
788                 vdrop(dropvp);
789 }
790
791 static
792 int
793 _cache_lockstatus(struct namecache *ncp)
794 {
795         if (ncp->nc_locktd == curthread)
796                 return(LK_EXCLUSIVE);
797         if (ncp->nc_lockstatus & NC_SHLOCK_FLAG)
798                 return(LK_SHARED);
799         return(-1);
800 }
801
802 /*
803  * cache_hold() and cache_drop() prevent the premature deletion of a
804  * namecache entry but do not prevent operations (such as zapping) on
805  * that namecache entry.
806  *
807  * This routine may only be called from outside this source module if
808  * nc_refs is already at least 1.
809  *
810  * This is a rare case where callers are allowed to hold a spinlock,
811  * so we can't ourselves.
812  */
813 static __inline
814 struct namecache *
815 _cache_hold(struct namecache *ncp)
816 {
817         atomic_add_int(&ncp->nc_refs, 1);
818         return(ncp);
819 }
820
821 /*
822  * Drop a cache entry, taking care to deal with races.
823  *
824  * For potential 1->0 transitions we must hold the ncp lock to safely
825  * test its flags.  An unresolved entry with no children must be zapped
826  * to avoid leaks.
827  *
828  * The call to cache_zap() itself will handle all remaining races and
829  * will decrement the ncp's refs regardless.  If we are resolved or
830  * have children nc_refs can safely be dropped to 0 without having to
831  * zap the entry.
832  *
833  * NOTE: cache_zap() will re-check nc_refs and nc_list in a MPSAFE fashion.
834  *
835  * NOTE: cache_zap() may return a non-NULL referenced parent which must
836  *       be dropped in a loop.
837  */
838 static __inline
839 void
840 _cache_drop(struct namecache *ncp)
841 {
842         int refs;
843
844         while (ncp) {
845                 KKASSERT(ncp->nc_refs > 0);
846                 refs = ncp->nc_refs;
847
848                 if (refs == 1) {
849                         if (_cache_lock_nonblock(ncp) == 0) {
850                                 ncp->nc_flag &= ~NCF_DEFEREDZAP;
851                                 if ((ncp->nc_flag & NCF_UNRESOLVED) &&
852                                     TAILQ_EMPTY(&ncp->nc_list)) {
853                                         ncp = cache_zap(ncp, 1);
854                                         continue;
855                                 }
856                                 if (atomic_cmpset_int(&ncp->nc_refs, 1, 0)) {
857                                         _cache_unlock(ncp);
858                                         break;
859                                 }
860                                 _cache_unlock(ncp);
861                         }
862                 } else {
863                         if (atomic_cmpset_int(&ncp->nc_refs, refs, refs - 1))
864                                 break;
865                 }
866                 cpu_pause();
867         }
868 }
869
870 /*
871  * Link a new namecache entry to its parent and to the hash table.  Be
872  * careful to avoid races if vhold() blocks in the future.
873  *
874  * Both ncp and par must be referenced and locked.
875  *
876  * NOTE: The hash table spinlock is held during this call, we can't do
877  *       anything fancy.
878  */
879 static void
880 _cache_link_parent(struct namecache *ncp, struct namecache *par,
881                    struct nchash_head *nchpp)
882 {
883         KKASSERT(ncp->nc_parent == NULL);
884         ncp->nc_parent = par;
885         ncp->nc_head = nchpp;
886
887         /*
888          * Set inheritance flags.  Note that the parent flags may be
889          * stale due to getattr potentially not having been run yet
890          * (it gets run during nlookup()'s).
891          */
892         ncp->nc_flag &= ~(NCF_SF_PNOCACHE | NCF_UF_PCACHE);
893         if (par->nc_flag & (NCF_SF_NOCACHE | NCF_SF_PNOCACHE))
894                 ncp->nc_flag |= NCF_SF_PNOCACHE;
895         if (par->nc_flag & (NCF_UF_CACHE | NCF_UF_PCACHE))
896                 ncp->nc_flag |= NCF_UF_PCACHE;
897
898         LIST_INSERT_HEAD(&nchpp->list, ncp, nc_hash);
899
900         if (TAILQ_EMPTY(&par->nc_list)) {
901                 TAILQ_INSERT_HEAD(&par->nc_list, ncp, nc_entry);
902                 /*
903                  * Any vp associated with an ncp which has children must
904                  * be held to prevent it from being recycled.
905                  */
906                 if (par->nc_vp)
907                         vhold(par->nc_vp);
908         } else {
909                 TAILQ_INSERT_HEAD(&par->nc_list, ncp, nc_entry);
910         }
911 }
912
913 /*
914  * Remove the parent and hash associations from a namecache structure.
915  * If this is the last child of the parent the cache_drop(par) will
916  * attempt to recursively zap the parent.
917  *
918  * ncp must be locked.  This routine will acquire a temporary lock on
919  * the parent as wlel as the appropriate hash chain.
920  */
921 static void
922 _cache_unlink_parent(struct namecache *ncp)
923 {
924         struct namecache *par;
925         struct vnode *dropvp;
926
927         if ((par = ncp->nc_parent) != NULL) {
928                 KKASSERT(ncp->nc_parent == par);
929                 _cache_hold(par);
930                 _cache_lock(par);
931                 spin_lock(&ncp->nc_head->spin);
932                 LIST_REMOVE(ncp, nc_hash);
933                 TAILQ_REMOVE(&par->nc_list, ncp, nc_entry);
934                 dropvp = NULL;
935                 if (par->nc_vp && TAILQ_EMPTY(&par->nc_list))
936                         dropvp = par->nc_vp;
937                 spin_unlock(&ncp->nc_head->spin);
938                 ncp->nc_parent = NULL;
939                 ncp->nc_head = NULL;
940                 _cache_unlock(par);
941                 _cache_drop(par);
942
943                 /*
944                  * We can only safely vdrop with no spinlocks held.
945                  */
946                 if (dropvp)
947                         vdrop(dropvp);
948         }
949 }
950
951 /*
952  * Allocate a new namecache structure.  Most of the code does not require
953  * zero-termination of the string but it makes vop_compat_ncreate() easier.
954  */
955 static struct namecache *
956 cache_alloc(int nlen)
957 {
958         struct namecache *ncp;
959
960         ncp = kmalloc(sizeof(*ncp), M_VFSCACHE, M_WAITOK|M_ZERO);
961         if (nlen)
962                 ncp->nc_name = kmalloc(nlen + 1, M_VFSCACHE, M_WAITOK);
963         ncp->nc_nlen = nlen;
964         ncp->nc_flag = NCF_UNRESOLVED;
965         ncp->nc_error = ENOTCONN;       /* needs to be resolved */
966         ncp->nc_refs = 1;
967
968         TAILQ_INIT(&ncp->nc_list);
969         _cache_lock(ncp);
970         return(ncp);
971 }
972
973 /*
974  * Can only be called for the case where the ncp has never been
975  * associated with anything (so no spinlocks are needed).
976  */
977 static void
978 _cache_free(struct namecache *ncp)
979 {
980         KKASSERT(ncp->nc_refs == 1 && ncp->nc_lockstatus == 1);
981         if (ncp->nc_name)
982                 kfree(ncp->nc_name, M_VFSCACHE);
983         kfree(ncp, M_VFSCACHE);
984 }
985
986 /*
987  * [re]initialize a nchandle.
988  */
989 void
990 cache_zero(struct nchandle *nch)
991 {
992         nch->ncp = NULL;
993         nch->mount = NULL;
994 }
995
996 /*
997  * Ref and deref a namecache structure.
998  *
999  * The caller must specify a stable ncp pointer, typically meaning the
1000  * ncp is already referenced but this can also occur indirectly through
1001  * e.g. holding a lock on a direct child.
1002  *
1003  * WARNING: Caller may hold an unrelated read spinlock, which means we can't
1004  *          use read spinlocks here.
1005  */
1006 struct nchandle *
1007 cache_hold(struct nchandle *nch)
1008 {
1009         _cache_hold(nch->ncp);
1010         _cache_mntref(nch->mount);
1011         return(nch);
1012 }
1013
1014 /*
1015  * Create a copy of a namecache handle for an already-referenced
1016  * entry.
1017  */
1018 void
1019 cache_copy(struct nchandle *nch, struct nchandle *target)
1020 {
1021         struct mntcache *cache = &pcpu_mntcache[mycpu->gd_cpuid];
1022         struct namecache *ncp;
1023
1024         *target = *nch;
1025         _cache_mntref(target->mount);
1026         ncp = target->ncp;
1027         if (ncp) {
1028                 if (ncp == cache->ncp1) {
1029                         if (atomic_cmpset_ptr((void *)&cache->ncp1, ncp, NULL))
1030                                 return;
1031                 }
1032                 if (ncp == cache->ncp2) {
1033                         if (atomic_cmpset_ptr((void *)&cache->ncp2, ncp, NULL))
1034                                 return;
1035                 }
1036                 _cache_hold(ncp);
1037         }
1038 }
1039
1040 /*
1041  * Caller wants to copy the current directory, copy it out from our
1042  * pcpu cache if possible (the entire critical path is just two localized
1043  * cmpset ops).  If the pcpu cache has a snapshot at all it will be a
1044  * valid one, so we don't have to lock p->p_fd even though we are loading
1045  * two fields.
1046  *
1047  * This has a limited effect since nlookup must still ref and shlock the
1048  * vnode to check perms.  We do avoid the per-proc spin-lock though, which
1049  * can aid threaded programs.
1050  */
1051 void
1052 cache_copy_ncdir(struct proc *p, struct nchandle *target)
1053 {
1054         struct mntcache *cache = &pcpu_mntcache[mycpu->gd_cpuid];
1055
1056         *target = p->p_fd->fd_ncdir;
1057         if (target->ncp == cache->ncdir.ncp &&
1058             target->mount == cache->ncdir.mount) {
1059                 if (atomic_cmpset_ptr((void *)&cache->ncdir.ncp,
1060                                       target->ncp, NULL)) {
1061                         if (atomic_cmpset_ptr((void *)&cache->ncdir.mount,
1062                                               target->mount, NULL)) {
1063                                 /* CRITICAL PATH */
1064                                 return;
1065                         }
1066                         _cache_drop(target->ncp);
1067                 }
1068         }
1069         spin_lock_shared(&p->p_fd->fd_spin);
1070         cache_copy(&p->p_fd->fd_ncdir, target);
1071         spin_unlock_shared(&p->p_fd->fd_spin);
1072 }
1073
1074 void
1075 cache_changemount(struct nchandle *nch, struct mount *mp)
1076 {
1077         _cache_mntref(mp);
1078         _cache_mntrel(nch->mount);
1079         nch->mount = mp;
1080 }
1081
1082 void
1083 cache_drop(struct nchandle *nch)
1084 {
1085         _cache_mntrel(nch->mount);
1086         _cache_drop(nch->ncp);
1087         nch->ncp = NULL;
1088         nch->mount = NULL;
1089 }
1090
1091 /*
1092  * Drop the nchandle, but try to cache the ref to avoid global atomic
1093  * ops.  This is typically done on the system root and jail root nchandles.
1094  */
1095 void
1096 cache_drop_and_cache(struct nchandle *nch)
1097 {
1098         struct mntcache *cache = &pcpu_mntcache[mycpu->gd_cpuid];
1099         struct namecache *ncp;
1100
1101         _cache_mntrel(nch->mount);
1102         ncp = nch->ncp;
1103         if (cache->ncp1 == NULL) {
1104                 ncp = atomic_swap_ptr((void *)&cache->ncp1, ncp);
1105                 if (ncp == NULL)
1106                         goto done;
1107         }
1108         if (cache->ncp2 == NULL) {
1109                 ncp = atomic_swap_ptr((void *)&cache->ncp2, ncp);
1110                 if (ncp == NULL)
1111                         goto done;
1112         }
1113         if (++cache->iter & 1)
1114                 ncp = atomic_swap_ptr((void *)&cache->ncp2, ncp);
1115         else
1116                 ncp = atomic_swap_ptr((void *)&cache->ncp1, ncp);
1117         if (ncp)
1118                 _cache_drop(ncp);
1119 done:
1120         nch->ncp = NULL;
1121         nch->mount = NULL;
1122 }
1123
1124 /*
1125  * We are dropping what the caller believes is the current directory,
1126  * unconditionally store it in our pcpu cache.  Anything already in
1127  * the cache will be discarded.
1128  */
1129 void
1130 cache_drop_ncdir(struct nchandle *nch)
1131 {
1132         struct mntcache *cache = &pcpu_mntcache[mycpu->gd_cpuid];
1133
1134         nch->ncp = atomic_swap_ptr((void *)&cache->ncdir.ncp, nch->ncp);
1135         nch->mount = atomic_swap_ptr((void *)&cache->ncdir.mount, nch->mount);
1136         if (nch->ncp)
1137                 _cache_drop(nch->ncp);
1138         if (nch->mount)
1139                 _cache_mntrel(nch->mount);
1140         nch->ncp = NULL;
1141         nch->mount = NULL;
1142 }
1143
1144 int
1145 cache_lockstatus(struct nchandle *nch)
1146 {
1147         return(_cache_lockstatus(nch->ncp));
1148 }
1149
1150 void
1151 cache_lock(struct nchandle *nch)
1152 {
1153         _cache_lock(nch->ncp);
1154 }
1155
1156 void
1157 cache_lock_maybe_shared(struct nchandle *nch, int excl)
1158 {
1159         struct namecache *ncp = nch->ncp;
1160
1161         if (ncp_shared_lock_disable || excl ||
1162             (ncp->nc_flag & NCF_UNRESOLVED)) {
1163                 _cache_lock(ncp);
1164         } else {
1165                 _cache_lock_shared(ncp);
1166                 if ((ncp->nc_flag & NCF_UNRESOLVED) == 0) {
1167                         if (ncp->nc_vp && (ncp->nc_vp->v_flag & VRECLAIMED)) {
1168                                 _cache_unlock(ncp);
1169                                 _cache_lock(ncp);
1170                         }
1171                 } else {
1172                         _cache_unlock(ncp);
1173                         _cache_lock(ncp);
1174                 }
1175         }
1176 }
1177
1178 /*
1179  * Relock nch1 given an unlocked nch1 and a locked nch2.  The caller
1180  * is responsible for checking both for validity on return as they
1181  * may have become invalid.
1182  *
1183  * We have to deal with potential deadlocks here, just ping pong
1184  * the lock until we get it (we will always block somewhere when
1185  * looping so this is not cpu-intensive).
1186  *
1187  * which = 0    nch1 not locked, nch2 is locked
1188  * which = 1    nch1 is locked, nch2 is not locked
1189  */
1190 void
1191 cache_relock(struct nchandle *nch1, struct ucred *cred1,
1192              struct nchandle *nch2, struct ucred *cred2)
1193 {
1194         int which;
1195
1196         which = 0;
1197
1198         for (;;) {
1199                 if (which == 0) {
1200                         if (cache_lock_nonblock(nch1) == 0) {
1201                                 cache_resolve(nch1, cred1);
1202                                 break;
1203                         }
1204                         cache_unlock(nch2);
1205                         cache_lock(nch1);
1206                         cache_resolve(nch1, cred1);
1207                         which = 1;
1208                 } else {
1209                         if (cache_lock_nonblock(nch2) == 0) {
1210                                 cache_resolve(nch2, cred2);
1211                                 break;
1212                         }
1213                         cache_unlock(nch1);
1214                         cache_lock(nch2);
1215                         cache_resolve(nch2, cred2);
1216                         which = 0;
1217                 }
1218         }
1219 }
1220
1221 int
1222 cache_lock_nonblock(struct nchandle *nch)
1223 {
1224         return(_cache_lock_nonblock(nch->ncp));
1225 }
1226
1227 void
1228 cache_unlock(struct nchandle *nch)
1229 {
1230         _cache_unlock(nch->ncp);
1231 }
1232
1233 /*
1234  * ref-and-lock, unlock-and-deref functions.
1235  *
1236  * This function is primarily used by nlookup.  Even though cache_lock
1237  * holds the vnode, it is possible that the vnode may have already
1238  * initiated a recyclement.
1239  *
1240  * We want cache_get() to return a definitively usable vnode or a
1241  * definitively unresolved ncp.
1242  */
1243 static
1244 struct namecache *
1245 _cache_get(struct namecache *ncp)
1246 {
1247         _cache_hold(ncp);
1248         _cache_lock(ncp);
1249         if (ncp->nc_vp && (ncp->nc_vp->v_flag & VRECLAIMED))
1250                 _cache_setunresolved(ncp);
1251         return(ncp);
1252 }
1253
1254 /*
1255  * Attempt to obtain a shared lock on the ncp.  A shared lock will only
1256  * be obtained if the ncp is resolved and the vnode (if not ENOENT) is
1257  * valid.  Otherwise an exclusive lock will be acquired instead.
1258  */
1259 static
1260 struct namecache *
1261 _cache_get_maybe_shared(struct namecache *ncp, int excl)
1262 {
1263         if (ncp_shared_lock_disable || excl ||
1264             (ncp->nc_flag & NCF_UNRESOLVED)) {
1265                 return(_cache_get(ncp));
1266         }
1267         _cache_hold(ncp);
1268         _cache_lock_shared(ncp);
1269         if ((ncp->nc_flag & NCF_UNRESOLVED) == 0) {
1270                 if (ncp->nc_vp && (ncp->nc_vp->v_flag & VRECLAIMED)) {
1271                         _cache_unlock(ncp);
1272                         ncp = _cache_get(ncp);
1273                         _cache_drop(ncp);
1274                 }
1275         } else {
1276                 _cache_unlock(ncp);
1277                 ncp = _cache_get(ncp);
1278                 _cache_drop(ncp);
1279         }
1280         return(ncp);
1281 }
1282
1283 /*
1284  * This is a special form of _cache_lock() which only succeeds if
1285  * it can get a pristine, non-recursive lock.  The caller must have
1286  * already ref'd the ncp.
1287  *
1288  * On success the ncp will be locked, on failure it will not.  The
1289  * ref count does not change either way.
1290  *
1291  * We want _cache_lock_special() (on success) to return a definitively
1292  * usable vnode or a definitively unresolved ncp.
1293  */
1294 static int
1295 _cache_lock_special(struct namecache *ncp)
1296 {
1297         if (_cache_lock_nonblock(ncp) == 0) {
1298                 if ((ncp->nc_lockstatus &
1299                      ~(NC_EXLOCK_REQ|NC_SHLOCK_REQ)) == 1) {
1300                         if (ncp->nc_vp && (ncp->nc_vp->v_flag & VRECLAIMED))
1301                                 _cache_setunresolved(ncp);
1302                         return(0);
1303                 }
1304                 _cache_unlock(ncp);
1305         }
1306         return(EWOULDBLOCK);
1307 }
1308
1309 /*
1310  * This function tries to get a shared lock but will back-off to an exclusive
1311  * lock if:
1312  *
1313  * (1) Some other thread is trying to obtain an exclusive lock
1314  *     (to prevent the exclusive requester from getting livelocked out
1315  *     by many shared locks).
1316  *
1317  * (2) The current thread already owns an exclusive lock (to avoid
1318  *     deadlocking).
1319  *
1320  * WARNING! On machines with lots of cores we really want to try hard to
1321  *          get a shared lock or concurrent path lookups can chain-react
1322  *          into a very high-latency exclusive lock.
1323  */
1324 static int
1325 _cache_lock_shared_special(struct namecache *ncp)
1326 {
1327         /*
1328          * Only honor a successful shared lock (returning 0) if there is
1329          * no exclusive request pending and the vnode, if present, is not
1330          * in a reclaimed state.
1331          */
1332         if (_cache_lock_shared_nonblock(ncp) == 0) {
1333                 if ((ncp->nc_lockstatus & NC_EXLOCK_REQ) == 0) {
1334                         if (ncp->nc_vp == NULL ||
1335                             (ncp->nc_vp->v_flag & VRECLAIMED) == 0) {
1336                                 return(0);
1337                         }
1338                 }
1339                 _cache_unlock(ncp);
1340                 return(EWOULDBLOCK);
1341         }
1342
1343         /*
1344          * Non-blocking shared lock failed.  If we already own the exclusive
1345          * lock just acquire another exclusive lock (instead of deadlocking).
1346          * Otherwise acquire a shared lock.
1347          */
1348         if (ncp->nc_locktd == curthread) {
1349                 _cache_lock(ncp);
1350                 return(0);
1351         }
1352         _cache_lock_shared(ncp);
1353         return(0);
1354 }
1355
1356
1357 /*
1358  * NOTE: The same nchandle can be passed for both arguments.
1359  */
1360 void
1361 cache_get(struct nchandle *nch, struct nchandle *target)
1362 {
1363         KKASSERT(nch->ncp->nc_refs > 0);
1364         target->mount = nch->mount;
1365         target->ncp = _cache_get(nch->ncp);
1366         _cache_mntref(target->mount);
1367 }
1368
1369 void
1370 cache_get_maybe_shared(struct nchandle *nch, struct nchandle *target, int excl)
1371 {
1372         KKASSERT(nch->ncp->nc_refs > 0);
1373         target->mount = nch->mount;
1374         target->ncp = _cache_get_maybe_shared(nch->ncp, excl);
1375         _cache_mntref(target->mount);
1376 }
1377
1378 /*
1379  *
1380  */
1381 static __inline
1382 void
1383 _cache_put(struct namecache *ncp)
1384 {
1385         _cache_unlock(ncp);
1386         _cache_drop(ncp);
1387 }
1388
1389 /*
1390  *
1391  */
1392 void
1393 cache_put(struct nchandle *nch)
1394 {
1395         _cache_mntrel(nch->mount);
1396         _cache_put(nch->ncp);
1397         nch->ncp = NULL;
1398         nch->mount = NULL;
1399 }
1400
1401 /*
1402  * Resolve an unresolved ncp by associating a vnode with it.  If the
1403  * vnode is NULL, a negative cache entry is created.
1404  *
1405  * The ncp should be locked on entry and will remain locked on return.
1406  */
1407 static
1408 void
1409 _cache_setvp(struct mount *mp, struct namecache *ncp, struct vnode *vp)
1410 {
1411         KKASSERT(ncp->nc_flag & NCF_UNRESOLVED);
1412         KKASSERT(_cache_lockstatus(ncp) == LK_EXCLUSIVE);
1413
1414         if (vp != NULL) {
1415                 /*
1416                  * Any vp associated with an ncp which has children must
1417                  * be held.  Any vp associated with a locked ncp must be held.
1418                  */
1419                 if (!TAILQ_EMPTY(&ncp->nc_list))
1420                         vhold(vp);
1421                 spin_lock(&vp->v_spin);
1422                 ncp->nc_vp = vp;
1423                 TAILQ_INSERT_HEAD(&vp->v_namecache, ncp, nc_vnode);
1424                 spin_unlock(&vp->v_spin);
1425                 if (ncp->nc_lockstatus & ~(NC_EXLOCK_REQ|NC_SHLOCK_REQ))
1426                         vhold(vp);
1427
1428                 /*
1429                  * Set auxiliary flags
1430                  */
1431                 switch(vp->v_type) {
1432                 case VDIR:
1433                         ncp->nc_flag |= NCF_ISDIR;
1434                         break;
1435                 case VLNK:
1436                         ncp->nc_flag |= NCF_ISSYMLINK;
1437                         /* XXX cache the contents of the symlink */
1438                         break;
1439                 default:
1440                         break;
1441                 }
1442                 atomic_add_int(&numcache, 1);
1443                 ncp->nc_error = 0;
1444                 /* XXX: this is a hack to work-around the lack of a real pfs vfs
1445                  * implementation*/
1446                 if (mp != NULL)
1447                         if (strncmp(mp->mnt_stat.f_fstypename, "null", 5) == 0)
1448                                 vp->v_pfsmp = mp;
1449         } else {
1450                 /*
1451                  * When creating a negative cache hit we set the
1452                  * namecache_gen.  A later resolve will clean out the
1453                  * negative cache hit if the mount point's namecache_gen
1454                  * has changed.  Used by devfs, could also be used by
1455                  * other remote FSs.
1456                  */
1457                 ncp->nc_vp = NULL;
1458                 spin_lock(&ncneg.spin);
1459                 TAILQ_INSERT_TAIL(&ncneg.list, ncp, nc_vnode);
1460                 ++numneg;
1461                 spin_unlock(&ncneg.spin);
1462                 ncp->nc_error = ENOENT;
1463                 if (mp)
1464                         VFS_NCPGEN_SET(mp, ncp);
1465         }
1466         ncp->nc_flag &= ~(NCF_UNRESOLVED | NCF_DEFEREDZAP);
1467 }
1468
1469 /*
1470  *
1471  */
1472 void
1473 cache_setvp(struct nchandle *nch, struct vnode *vp)
1474 {
1475         _cache_setvp(nch->mount, nch->ncp, vp);
1476 }
1477
1478 /*
1479  *
1480  */
1481 void
1482 cache_settimeout(struct nchandle *nch, int nticks)
1483 {
1484         struct namecache *ncp = nch->ncp;
1485
1486         if ((ncp->nc_timeout = ticks + nticks) == 0)
1487                 ncp->nc_timeout = 1;
1488 }
1489
1490 /*
1491  * Disassociate the vnode or negative-cache association and mark a
1492  * namecache entry as unresolved again.  Note that the ncp is still
1493  * left in the hash table and still linked to its parent.
1494  *
1495  * The ncp should be locked and refd on entry and will remain locked and refd
1496  * on return.
1497  *
1498  * This routine is normally never called on a directory containing children.
1499  * However, NFS often does just that in its rename() code as a cop-out to
1500  * avoid complex namespace operations.  This disconnects a directory vnode
1501  * from its namecache and can cause the OLDAPI and NEWAPI to get out of
1502  * sync.
1503  *
1504  */
1505 static
1506 void
1507 _cache_setunresolved(struct namecache *ncp)
1508 {
1509         struct vnode *vp;
1510
1511         if ((ncp->nc_flag & NCF_UNRESOLVED) == 0) {
1512                 ncp->nc_flag |= NCF_UNRESOLVED;
1513                 ncp->nc_timeout = 0;
1514                 ncp->nc_error = ENOTCONN;
1515                 if ((vp = ncp->nc_vp) != NULL) {
1516                         atomic_add_int(&numcache, -1);
1517                         spin_lock(&vp->v_spin);
1518                         ncp->nc_vp = NULL;
1519                         TAILQ_REMOVE(&vp->v_namecache, ncp, nc_vnode);
1520                         spin_unlock(&vp->v_spin);
1521
1522                         /*
1523                          * Any vp associated with an ncp with children is
1524                          * held by that ncp.  Any vp associated with a locked
1525                          * ncp is held by that ncp.  These conditions must be
1526                          * undone when the vp is cleared out from the ncp.
1527                          */
1528                         if (!TAILQ_EMPTY(&ncp->nc_list))
1529                                 vdrop(vp);
1530                         if (ncp->nc_lockstatus & ~(NC_EXLOCK_REQ|NC_SHLOCK_REQ))
1531                                 vdrop(vp);
1532                 } else {
1533                         spin_lock(&ncneg.spin);
1534                         TAILQ_REMOVE(&ncneg.list, ncp, nc_vnode);
1535                         --numneg;
1536                         spin_unlock(&ncneg.spin);
1537                 }
1538                 ncp->nc_flag &= ~(NCF_WHITEOUT|NCF_ISDIR|NCF_ISSYMLINK);
1539         }
1540 }
1541
1542 /*
1543  * The cache_nresolve() code calls this function to automatically
1544  * set a resolved cache element to unresolved if it has timed out
1545  * or if it is a negative cache hit and the mount point namecache_gen
1546  * has changed.
1547  */
1548 static __inline int
1549 _cache_auto_unresolve_test(struct mount *mp, struct namecache *ncp)
1550 {
1551         /*
1552          * Try to zap entries that have timed out.  We have
1553          * to be careful here because locked leafs may depend
1554          * on the vnode remaining intact in a parent, so only
1555          * do this under very specific conditions.
1556          */
1557         if (ncp->nc_timeout && (int)(ncp->nc_timeout - ticks) < 0 &&
1558             TAILQ_EMPTY(&ncp->nc_list)) {
1559                 return 1;
1560         }
1561
1562         /*
1563          * If a resolved negative cache hit is invalid due to
1564          * the mount's namecache generation being bumped, zap it.
1565          */
1566         if (ncp->nc_vp == NULL && VFS_NCPGEN_TEST(mp, ncp)) {
1567                 return 1;
1568         }
1569
1570         /*
1571          * Otherwise we are good
1572          */
1573         return 0;
1574 }
1575
1576 static __inline void
1577 _cache_auto_unresolve(struct mount *mp, struct namecache *ncp)
1578 {
1579         /*
1580          * Already in an unresolved state, nothing to do.
1581          */
1582         if ((ncp->nc_flag & NCF_UNRESOLVED) == 0) {
1583                 if (_cache_auto_unresolve_test(mp, ncp))
1584                         _cache_setunresolved(ncp);
1585         }
1586 }
1587
1588 /*
1589  *
1590  */
1591 void
1592 cache_setunresolved(struct nchandle *nch)
1593 {
1594         _cache_setunresolved(nch->ncp);
1595 }
1596
1597 /*
1598  * Determine if we can clear NCF_ISMOUNTPT by scanning the mountlist
1599  * looking for matches.  This flag tells the lookup code when it must
1600  * check for a mount linkage and also prevents the directories in question
1601  * from being deleted or renamed.
1602  */
1603 static
1604 int
1605 cache_clrmountpt_callback(struct mount *mp, void *data)
1606 {
1607         struct nchandle *nch = data;
1608
1609         if (mp->mnt_ncmounton.ncp == nch->ncp)
1610                 return(1);
1611         if (mp->mnt_ncmountpt.ncp == nch->ncp)
1612                 return(1);
1613         return(0);
1614 }
1615
1616 /*
1617  *
1618  */
1619 void
1620 cache_clrmountpt(struct nchandle *nch)
1621 {
1622         int count;
1623
1624         count = mountlist_scan(cache_clrmountpt_callback, nch,
1625                                MNTSCAN_FORWARD|MNTSCAN_NOBUSY);
1626         if (count == 0)
1627                 nch->ncp->nc_flag &= ~NCF_ISMOUNTPT;
1628 }
1629
1630 /*
1631  * Invalidate portions of the namecache topology given a starting entry.
1632  * The passed ncp is set to an unresolved state and:
1633  *
1634  * The passed ncp must be referencxed and locked.  The routine may unlock
1635  * and relock ncp several times, and will recheck the children and loop
1636  * to catch races.  When done the passed ncp will be returned with the
1637  * reference and lock intact.
1638  *
1639  * CINV_DESTROY         - Set a flag in the passed ncp entry indicating
1640  *                        that the physical underlying nodes have been 
1641  *                        destroyed... as in deleted.  For example, when
1642  *                        a directory is removed.  This will cause record
1643  *                        lookups on the name to no longer be able to find
1644  *                        the record and tells the resolver to return failure
1645  *                        rather then trying to resolve through the parent.
1646  *
1647  *                        The topology itself, including ncp->nc_name,
1648  *                        remains intact.
1649  *
1650  *                        This only applies to the passed ncp, if CINV_CHILDREN
1651  *                        is specified the children are not flagged.
1652  *
1653  * CINV_CHILDREN        - Set all children (recursively) to an unresolved
1654  *                        state as well.
1655  *
1656  *                        Note that this will also have the side effect of
1657  *                        cleaning out any unreferenced nodes in the topology
1658  *                        from the leaves up as the recursion backs out.
1659  *
1660  * Note that the topology for any referenced nodes remains intact, but
1661  * the nodes will be marked as having been destroyed and will be set
1662  * to an unresolved state.
1663  *
1664  * It is possible for cache_inval() to race a cache_resolve(), meaning that
1665  * the namecache entry may not actually be invalidated on return if it was
1666  * revalidated while recursing down into its children.  This code guarentees
1667  * that the node(s) will go through an invalidation cycle, but does not 
1668  * guarentee that they will remain in an invalidated state. 
1669  *
1670  * Returns non-zero if a revalidation was detected during the invalidation
1671  * recursion, zero otherwise.  Note that since only the original ncp is
1672  * locked the revalidation ultimately can only indicate that the original ncp
1673  * *MIGHT* no have been reresolved.
1674  *
1675  * DEEP RECURSION HANDLING - If a recursive invalidation recurses deeply we
1676  * have to avoid blowing out the kernel stack.  We do this by saving the
1677  * deep namecache node and aborting the recursion, then re-recursing at that
1678  * node using a depth-first algorithm in order to allow multiple deep
1679  * recursions to chain through each other, then we restart the invalidation
1680  * from scratch.
1681  */
1682
1683 struct cinvtrack {
1684         struct namecache *resume_ncp;
1685         int depth;
1686 };
1687
1688 static int _cache_inval_internal(struct namecache *, int, struct cinvtrack *);
1689
1690 static
1691 int
1692 _cache_inval(struct namecache *ncp, int flags)
1693 {
1694         struct cinvtrack track;
1695         struct namecache *ncp2;
1696         int r;
1697
1698         track.depth = 0;
1699         track.resume_ncp = NULL;
1700
1701         for (;;) {
1702                 r = _cache_inval_internal(ncp, flags, &track);
1703                 if (track.resume_ncp == NULL)
1704                         break;
1705                 _cache_unlock(ncp);
1706                 while ((ncp2 = track.resume_ncp) != NULL) {
1707                         track.resume_ncp = NULL;
1708                         _cache_lock(ncp2);
1709                         _cache_inval_internal(ncp2, flags & ~CINV_DESTROY,
1710                                              &track);
1711                         _cache_put(ncp2);
1712                 }
1713                 _cache_lock(ncp);
1714         }
1715         return(r);
1716 }
1717
1718 int
1719 cache_inval(struct nchandle *nch, int flags)
1720 {
1721         return(_cache_inval(nch->ncp, flags));
1722 }
1723
1724 /*
1725  * Helper for _cache_inval().  The passed ncp is refd and locked and
1726  * remains that way on return, but may be unlocked/relocked multiple
1727  * times by the routine.
1728  */
1729 static int
1730 _cache_inval_internal(struct namecache *ncp, int flags, struct cinvtrack *track)
1731 {
1732         struct namecache *nextkid;
1733         int rcnt = 0;
1734
1735         KKASSERT(_cache_lockstatus(ncp) == LK_EXCLUSIVE);
1736
1737         _cache_setunresolved(ncp);
1738         if (flags & CINV_DESTROY) {
1739                 ncp->nc_flag |= NCF_DESTROYED;
1740                 ++ncp->nc_generation;
1741         }
1742         while ((flags & CINV_CHILDREN) &&
1743                (nextkid = TAILQ_FIRST(&ncp->nc_list)) != NULL
1744         ) {
1745                 struct namecache *kid;
1746                 int restart;
1747
1748                 restart = 0;
1749                 _cache_hold(nextkid);
1750                 if (++track->depth > MAX_RECURSION_DEPTH) {
1751                         track->resume_ncp = ncp;
1752                         _cache_hold(ncp);
1753                         ++rcnt;
1754                 }
1755                 while ((kid = nextkid) != NULL) {
1756                         /*
1757                          * Parent (ncp) must be locked for the iteration.
1758                          */
1759                         nextkid = NULL;
1760                         if (kid->nc_parent != ncp) {
1761                                 _cache_drop(kid);
1762                                 kprintf("cache_inval_internal restartA %s\n",
1763                                         ncp->nc_name);
1764                                 restart = 1;
1765                                 break;
1766                         }
1767                         if ((nextkid = TAILQ_NEXT(kid, nc_entry)) != NULL)
1768                                 _cache_hold(nextkid);
1769
1770                         /*
1771                          * Parent unlocked for this section to avoid
1772                          * deadlocks.
1773                          */
1774                         _cache_unlock(ncp);
1775                         if (track->resume_ncp) {
1776                                 _cache_drop(kid);
1777                                 _cache_lock(ncp);
1778                                 break;
1779                         }
1780                         if ((kid->nc_flag & NCF_UNRESOLVED) == 0 ||
1781                             TAILQ_FIRST(&kid->nc_list)
1782                         ) {
1783                                 _cache_lock(kid);
1784                                 if (kid->nc_parent != ncp) {
1785                                         kprintf("cache_inval_internal "
1786                                                 "restartB %s\n",
1787                                                 ncp->nc_name);
1788                                         restart = 1;
1789                                         _cache_unlock(kid);
1790                                         _cache_drop(kid);
1791                                         _cache_lock(ncp);
1792                                         break;
1793                                 }
1794
1795                                 rcnt += _cache_inval_internal(kid, flags & ~CINV_DESTROY, track);
1796                                 _cache_unlock(kid);
1797                         }
1798                         _cache_drop(kid);
1799                         _cache_lock(ncp);
1800                 }
1801                 if (nextkid)
1802                         _cache_drop(nextkid);
1803                 --track->depth;
1804                 if (restart == 0)
1805                         break;
1806         }
1807
1808         /*
1809          * Someone could have gotten in there while ncp was unlocked,
1810          * retry if so.
1811          */
1812         if ((ncp->nc_flag & NCF_UNRESOLVED) == 0)
1813                 ++rcnt;
1814         return (rcnt);
1815 }
1816
1817 /*
1818  * Invalidate a vnode's namecache associations.  To avoid races against
1819  * the resolver we do not invalidate a node which we previously invalidated
1820  * but which was then re-resolved while we were in the invalidation loop.
1821  *
1822  * Returns non-zero if any namecache entries remain after the invalidation
1823  * loop completed.
1824  *
1825  * NOTE: Unlike the namecache topology which guarentees that ncp's will not
1826  *       be ripped out of the topology while held, the vnode's v_namecache
1827  *       list has no such restriction.  NCP's can be ripped out of the list
1828  *       at virtually any time if not locked, even if held.
1829  *
1830  *       In addition, the v_namecache list itself must be locked via
1831  *       the vnode's spinlock.
1832  */
1833 int
1834 cache_inval_vp(struct vnode *vp, int flags)
1835 {
1836         struct namecache *ncp;
1837         struct namecache *next;
1838
1839 restart:
1840         spin_lock(&vp->v_spin);
1841         ncp = TAILQ_FIRST(&vp->v_namecache);
1842         if (ncp)
1843                 _cache_hold(ncp);
1844         while (ncp) {
1845                 /* loop entered with ncp held and vp spin-locked */
1846                 if ((next = TAILQ_NEXT(ncp, nc_vnode)) != NULL)
1847                         _cache_hold(next);
1848                 spin_unlock(&vp->v_spin);
1849                 _cache_lock(ncp);
1850                 if (ncp->nc_vp != vp) {
1851                         kprintf("Warning: cache_inval_vp: race-A detected on "
1852                                 "%s\n", ncp->nc_name);
1853                         _cache_put(ncp);
1854                         if (next)
1855                                 _cache_drop(next);
1856                         goto restart;
1857                 }
1858                 _cache_inval(ncp, flags);
1859                 _cache_put(ncp);                /* also releases reference */
1860                 ncp = next;
1861                 spin_lock(&vp->v_spin);
1862                 if (ncp && ncp->nc_vp != vp) {
1863                         spin_unlock(&vp->v_spin);
1864                         kprintf("Warning: cache_inval_vp: race-B detected on "
1865                                 "%s\n", ncp->nc_name);
1866                         _cache_drop(ncp);
1867                         goto restart;
1868                 }
1869         }
1870         spin_unlock(&vp->v_spin);
1871         return(TAILQ_FIRST(&vp->v_namecache) != NULL);
1872 }
1873
1874 /*
1875  * This routine is used instead of the normal cache_inval_vp() when we
1876  * are trying to recycle otherwise good vnodes.
1877  *
1878  * Return 0 on success, non-zero if not all namecache records could be
1879  * disassociated from the vnode (for various reasons).
1880  */
1881 int
1882 cache_inval_vp_nonblock(struct vnode *vp)
1883 {
1884         struct namecache *ncp;
1885         struct namecache *next;
1886
1887         spin_lock(&vp->v_spin);
1888         ncp = TAILQ_FIRST(&vp->v_namecache);
1889         if (ncp)
1890                 _cache_hold(ncp);
1891         while (ncp) {
1892                 /* loop entered with ncp held */
1893                 if ((next = TAILQ_NEXT(ncp, nc_vnode)) != NULL)
1894                         _cache_hold(next);
1895                 spin_unlock(&vp->v_spin);
1896                 if (_cache_lock_nonblock(ncp)) {
1897                         _cache_drop(ncp);
1898                         if (next)
1899                                 _cache_drop(next);
1900                         goto done;
1901                 }
1902                 if (ncp->nc_vp != vp) {
1903                         kprintf("Warning: cache_inval_vp: race-A detected on "
1904                                 "%s\n", ncp->nc_name);
1905                         _cache_put(ncp);
1906                         if (next)
1907                                 _cache_drop(next);
1908                         goto done;
1909                 }
1910                 _cache_inval(ncp, 0);
1911                 _cache_put(ncp);                /* also releases reference */
1912                 ncp = next;
1913                 spin_lock(&vp->v_spin);
1914                 if (ncp && ncp->nc_vp != vp) {
1915                         spin_unlock(&vp->v_spin);
1916                         kprintf("Warning: cache_inval_vp: race-B detected on "
1917                                 "%s\n", ncp->nc_name);
1918                         _cache_drop(ncp);
1919                         goto done;
1920                 }
1921         }
1922         spin_unlock(&vp->v_spin);
1923 done:
1924         return(TAILQ_FIRST(&vp->v_namecache) != NULL);
1925 }
1926
1927 /*
1928  * Clears the universal directory search 'ok' flag.  This flag allows
1929  * nlookup() to bypass normal vnode checks.  This flag is a cached flag
1930  * so clearing it simply forces revalidation.
1931  */
1932 void
1933 cache_inval_wxok(struct vnode *vp)
1934 {
1935         struct namecache *ncp;
1936
1937         spin_lock(&vp->v_spin);
1938         TAILQ_FOREACH(ncp, &vp->v_namecache, nc_vnode) {
1939                 if (ncp->nc_flag & NCF_WXOK)
1940                         atomic_clear_short(&ncp->nc_flag, NCF_WXOK);
1941         }
1942         spin_unlock(&vp->v_spin);
1943 }
1944
1945 /*
1946  * The source ncp has been renamed to the target ncp.  Both fncp and tncp
1947  * must be locked.  The target ncp is destroyed (as a normal rename-over
1948  * would destroy the target file or directory).
1949  *
1950  * Because there may be references to the source ncp we cannot copy its
1951  * contents to the target.  Instead the source ncp is relinked as the target
1952  * and the target ncp is removed from the namecache topology.
1953  */
1954 void
1955 cache_rename(struct nchandle *fnch, struct nchandle *tnch)
1956 {
1957         struct namecache *fncp = fnch->ncp;
1958         struct namecache *tncp = tnch->ncp;
1959         struct namecache *tncp_par;
1960         struct nchash_head *nchpp;
1961         u_int32_t hash;
1962         char *oname;
1963         char *nname;
1964
1965         ++fncp->nc_generation;
1966         ++tncp->nc_generation;
1967         if (tncp->nc_nlen) {
1968                 nname = kmalloc(tncp->nc_nlen + 1, M_VFSCACHE, M_WAITOK);
1969                 bcopy(tncp->nc_name, nname, tncp->nc_nlen);
1970                 nname[tncp->nc_nlen] = 0;
1971         } else {
1972                 nname = NULL;
1973         }
1974
1975         /*
1976          * Rename fncp (unlink)
1977          */
1978         _cache_unlink_parent(fncp);
1979         oname = fncp->nc_name;
1980         fncp->nc_name = nname;
1981         fncp->nc_nlen = tncp->nc_nlen;
1982         if (oname)
1983                 kfree(oname, M_VFSCACHE);
1984
1985         tncp_par = tncp->nc_parent;
1986         _cache_hold(tncp_par);
1987         _cache_lock(tncp_par);
1988
1989         /*
1990          * Rename fncp (relink)
1991          */
1992         hash = fnv_32_buf(fncp->nc_name, fncp->nc_nlen, FNV1_32_INIT);
1993         hash = fnv_32_buf(&tncp_par, sizeof(tncp_par), hash);
1994         nchpp = NCHHASH(hash);
1995
1996         spin_lock(&nchpp->spin);
1997         _cache_link_parent(fncp, tncp_par, nchpp);
1998         spin_unlock(&nchpp->spin);
1999
2000         _cache_put(tncp_par);
2001
2002         /*
2003          * Get rid of the overwritten tncp (unlink)
2004          */
2005         _cache_unlink(tncp);
2006 }
2007
2008 /*
2009  * Perform actions consistent with unlinking a file.  The passed-in ncp
2010  * must be locked.
2011  *
2012  * The ncp is marked DESTROYED so it no longer shows up in searches,
2013  * and will be physically deleted when the vnode goes away.
2014  *
2015  * If the related vnode has no refs then we cycle it through vget()/vput()
2016  * to (possibly if we don't have a ref race) trigger a deactivation,
2017  * allowing the VFS to trivially detect and recycle the deleted vnode
2018  * via VOP_INACTIVE().
2019  *
2020  * NOTE: _cache_rename() will automatically call _cache_unlink() on the
2021  *       target ncp.
2022  */
2023 void
2024 cache_unlink(struct nchandle *nch)
2025 {
2026         _cache_unlink(nch->ncp);
2027 }
2028
2029 static void
2030 _cache_unlink(struct namecache *ncp)
2031 {
2032         struct vnode *vp;
2033
2034         /*
2035          * Causes lookups to fail and allows another ncp with the same
2036          * name to be created under ncp->nc_parent.
2037          */
2038         ncp->nc_flag |= NCF_DESTROYED;
2039         ++ncp->nc_generation;
2040
2041         /*
2042          * Attempt to trigger a deactivation.  Set VREF_FINALIZE to
2043          * force action on the 1->0 transition.
2044          */
2045         if ((ncp->nc_flag & NCF_UNRESOLVED) == 0 &&
2046             (vp = ncp->nc_vp) != NULL) {
2047                 atomic_set_int(&vp->v_refcnt, VREF_FINALIZE);
2048                 if (VREFCNT(vp) <= 0) {
2049                         if (vget(vp, LK_SHARED) == 0)
2050                                 vput(vp);
2051                 }
2052         }
2053 }
2054
2055 /*
2056  * Return non-zero if the nch might be associated with an open and/or mmap()'d
2057  * file.  The easy solution is to just return non-zero if the vnode has refs.
2058  * Used to interlock hammer2 reclaims (VREF_FINALIZE should already be set to
2059  * force the reclaim).
2060  */
2061 int
2062 cache_isopen(struct nchandle *nch)
2063 {
2064         struct vnode *vp;
2065         struct namecache *ncp = nch->ncp;
2066
2067         if ((ncp->nc_flag & NCF_UNRESOLVED) == 0 &&
2068             (vp = ncp->nc_vp) != NULL &&
2069             VREFCNT(vp)) {
2070                 return 1;
2071         }
2072         return 0;
2073 }
2074
2075
2076 /*
2077  * vget the vnode associated with the namecache entry.  Resolve the namecache
2078  * entry if necessary.  The passed ncp must be referenced and locked.  If
2079  * the ncp is resolved it might be locked shared.
2080  *
2081  * lk_type may be LK_SHARED, LK_EXCLUSIVE.  A ref'd, possibly locked
2082  * (depending on the passed lk_type) will be returned in *vpp with an error
2083  * of 0, or NULL will be returned in *vpp with a non-0 error code.  The
2084  * most typical error is ENOENT, meaning that the ncp represents a negative
2085  * cache hit and there is no vnode to retrieve, but other errors can occur
2086  * too.
2087  *
2088  * The vget() can race a reclaim.  If this occurs we re-resolve the
2089  * namecache entry.
2090  *
2091  * There are numerous places in the kernel where vget() is called on a
2092  * vnode while one or more of its namecache entries is locked.  Releasing
2093  * a vnode never deadlocks against locked namecache entries (the vnode
2094  * will not get recycled while referenced ncp's exist).  This means we
2095  * can safely acquire the vnode.  In fact, we MUST NOT release the ncp
2096  * lock when acquiring the vp lock or we might cause a deadlock.
2097  *
2098  * NOTE: The passed-in ncp must be locked exclusively if it is initially
2099  *       unresolved.  If a reclaim race occurs the passed-in ncp will be
2100  *       relocked exclusively before being re-resolved.
2101  */
2102 int
2103 cache_vget(struct nchandle *nch, struct ucred *cred,
2104            int lk_type, struct vnode **vpp)
2105 {
2106         struct namecache *ncp;
2107         struct vnode *vp;
2108         int error;
2109
2110         ncp = nch->ncp;
2111 again:
2112         vp = NULL;
2113         if (ncp->nc_flag & NCF_UNRESOLVED)
2114                 error = cache_resolve(nch, cred);
2115         else
2116                 error = 0;
2117
2118         if (error == 0 && (vp = ncp->nc_vp) != NULL) {
2119                 error = vget(vp, lk_type);
2120                 if (error) {
2121                         /*
2122                          * VRECLAIM race
2123                          *
2124                          * The ncp may have been locked shared, we must relock
2125                          * it exclusively before we can set it to unresolved.
2126                          */
2127                         if (error == ENOENT) {
2128                                 kprintf("Warning: vnode reclaim race detected "
2129                                         "in cache_vget on %p (%s)\n",
2130                                         vp, ncp->nc_name);
2131                                 _cache_unlock(ncp);
2132                                 _cache_lock(ncp);
2133                                 _cache_setunresolved(ncp);
2134                                 goto again;
2135                         }
2136
2137                         /*
2138                          * Not a reclaim race, some other error.
2139                          */
2140                         KKASSERT(ncp->nc_vp == vp);
2141                         vp = NULL;
2142                 } else {
2143                         KKASSERT(ncp->nc_vp == vp);
2144                         KKASSERT((vp->v_flag & VRECLAIMED) == 0);
2145                 }
2146         }
2147         if (error == 0 && vp == NULL)
2148                 error = ENOENT;
2149         *vpp = vp;
2150         return(error);
2151 }
2152
2153 /*
2154  * Similar to cache_vget() but only acquires a ref on the vnode.
2155  *
2156  * NOTE: The passed-in ncp must be locked exclusively if it is initially
2157  *       unresolved.  If a reclaim race occurs the passed-in ncp will be
2158  *       relocked exclusively before being re-resolved.
2159  */
2160 int
2161 cache_vref(struct nchandle *nch, struct ucred *cred, struct vnode **vpp)
2162 {
2163         struct namecache *ncp;
2164         struct vnode *vp;
2165         int error;
2166
2167         ncp = nch->ncp;
2168 again:
2169         vp = NULL;
2170         if (ncp->nc_flag & NCF_UNRESOLVED)
2171                 error = cache_resolve(nch, cred);
2172         else
2173                 error = 0;
2174
2175         if (error == 0 && (vp = ncp->nc_vp) != NULL) {
2176                 error = vget(vp, LK_SHARED);
2177                 if (error) {
2178                         /*
2179                          * VRECLAIM race
2180                          */
2181                         if (error == ENOENT) {
2182                                 kprintf("Warning: vnode reclaim race detected "
2183                                         "in cache_vget on %p (%s)\n",
2184                                         vp, ncp->nc_name);
2185                                 _cache_unlock(ncp);
2186                                 _cache_lock(ncp);
2187                                 _cache_setunresolved(ncp);
2188                                 goto again;
2189                         }
2190
2191                         /*
2192                          * Not a reclaim race, some other error.
2193                          */
2194                         KKASSERT(ncp->nc_vp == vp);
2195                         vp = NULL;
2196                 } else {
2197                         KKASSERT(ncp->nc_vp == vp);
2198                         KKASSERT((vp->v_flag & VRECLAIMED) == 0);
2199                         /* caller does not want a lock */
2200                         vn_unlock(vp);
2201                 }
2202         }
2203         if (error == 0 && vp == NULL)
2204                 error = ENOENT;
2205         *vpp = vp;
2206         return(error);
2207 }
2208
2209 /*
2210  * Return a referenced vnode representing the parent directory of
2211  * ncp.
2212  *
2213  * Because the caller has locked the ncp it should not be possible for
2214  * the parent ncp to go away.  However, the parent can unresolve its
2215  * dvp at any time so we must be able to acquire a lock on the parent
2216  * to safely access nc_vp.
2217  *
2218  * We have to leave par unlocked when vget()ing dvp to avoid a deadlock,
2219  * so use vhold()/vdrop() while holding the lock to prevent dvp from
2220  * getting destroyed.
2221  *
2222  * NOTE: vhold() is allowed when dvp has 0 refs if we hold a
2223  *       lock on the ncp in question..
2224  */
2225 static struct vnode *
2226 cache_dvpref(struct namecache *ncp)
2227 {
2228         struct namecache *par;
2229         struct vnode *dvp;
2230
2231         dvp = NULL;
2232         if ((par = ncp->nc_parent) != NULL) {
2233                 _cache_hold(par);
2234                 _cache_lock(par);
2235                 if ((par->nc_flag & NCF_UNRESOLVED) == 0) {
2236                         if ((dvp = par->nc_vp) != NULL)
2237                                 vhold(dvp);
2238                 }
2239                 _cache_unlock(par);
2240                 if (dvp) {
2241                         if (vget(dvp, LK_SHARED) == 0) {
2242                                 vn_unlock(dvp);
2243                                 vdrop(dvp);
2244                                 /* return refd, unlocked dvp */
2245                         } else {
2246                                 vdrop(dvp);
2247                                 dvp = NULL;
2248                         }
2249                 }
2250                 _cache_drop(par);
2251         }
2252         return(dvp);
2253 }
2254
2255 /*
2256  * Convert a directory vnode to a namecache record without any other 
2257  * knowledge of the topology.  This ONLY works with directory vnodes and
2258  * is ONLY used by the NFS server.  dvp must be refd but unlocked, and the
2259  * returned ncp (if not NULL) will be held and unlocked.
2260  *
2261  * If 'makeit' is 0 and dvp has no existing namecache record, NULL is returned.
2262  * If 'makeit' is 1 we attempt to track-down and create the namecache topology
2263  * for dvp.  This will fail only if the directory has been deleted out from
2264  * under the caller.  
2265  *
2266  * Callers must always check for a NULL return no matter the value of 'makeit'.
2267  *
2268  * To avoid underflowing the kernel stack each recursive call increments
2269  * the makeit variable.
2270  */
2271
2272 static int cache_inefficient_scan(struct nchandle *nch, struct ucred *cred,
2273                                   struct vnode *dvp, char *fakename);
2274 static int cache_fromdvp_try(struct vnode *dvp, struct ucred *cred, 
2275                                   struct vnode **saved_dvp);
2276
2277 int
2278 cache_fromdvp(struct vnode *dvp, struct ucred *cred, int makeit,
2279               struct nchandle *nch)
2280 {
2281         struct vnode *saved_dvp;
2282         struct vnode *pvp;
2283         char *fakename;
2284         int error;
2285
2286         nch->ncp = NULL;
2287         nch->mount = dvp->v_mount;
2288         saved_dvp = NULL;
2289         fakename = NULL;
2290
2291         /*
2292          * Handle the makeit == 0 degenerate case
2293          */
2294         if (makeit == 0) {
2295                 spin_lock_shared(&dvp->v_spin);
2296                 nch->ncp = TAILQ_FIRST(&dvp->v_namecache);
2297                 if (nch->ncp)
2298                         cache_hold(nch);
2299                 spin_unlock_shared(&dvp->v_spin);
2300         }
2301
2302         /*
2303          * Loop until resolution, inside code will break out on error.
2304          */
2305         while (makeit) {
2306                 /*
2307                  * Break out if we successfully acquire a working ncp.
2308                  */
2309                 spin_lock_shared(&dvp->v_spin);
2310                 nch->ncp = TAILQ_FIRST(&dvp->v_namecache);
2311                 if (nch->ncp) {
2312                         cache_hold(nch);
2313                         spin_unlock_shared(&dvp->v_spin);
2314                         break;
2315                 }
2316                 spin_unlock_shared(&dvp->v_spin);
2317
2318                 /*
2319                  * If dvp is the root of its filesystem it should already
2320                  * have a namecache pointer associated with it as a side 
2321                  * effect of the mount, but it may have been disassociated.
2322                  */
2323                 if (dvp->v_flag & VROOT) {
2324                         nch->ncp = _cache_get(nch->mount->mnt_ncmountpt.ncp);
2325                         error = cache_resolve_mp(nch->mount);
2326                         _cache_put(nch->ncp);
2327                         if (ncvp_debug) {
2328                                 kprintf("cache_fromdvp: resolve root of mount %p error %d", 
2329                                         dvp->v_mount, error);
2330                         }
2331                         if (error) {
2332                                 if (ncvp_debug)
2333                                         kprintf(" failed\n");
2334                                 nch->ncp = NULL;
2335                                 break;
2336                         }
2337                         if (ncvp_debug)
2338                                 kprintf(" succeeded\n");
2339                         continue;
2340                 }
2341
2342                 /*
2343                  * If we are recursed too deeply resort to an O(n^2)
2344                  * algorithm to resolve the namecache topology.  The
2345                  * resolved pvp is left referenced in saved_dvp to
2346                  * prevent the tree from being destroyed while we loop.
2347                  */
2348                 if (makeit > 20) {
2349                         error = cache_fromdvp_try(dvp, cred, &saved_dvp);
2350                         if (error) {
2351                                 kprintf("lookupdotdot(longpath) failed %d "
2352                                        "dvp %p\n", error, dvp);
2353                                 nch->ncp = NULL;
2354                                 break;
2355                         }
2356                         continue;
2357                 }
2358
2359                 /*
2360                  * Get the parent directory and resolve its ncp.
2361                  */
2362                 if (fakename) {
2363                         kfree(fakename, M_TEMP);
2364                         fakename = NULL;
2365                 }
2366                 error = vop_nlookupdotdot(*dvp->v_ops, dvp, &pvp, cred,
2367                                           &fakename);
2368                 if (error) {
2369                         kprintf("lookupdotdot failed %d dvp %p\n", error, dvp);
2370                         break;
2371                 }
2372                 vn_unlock(pvp);
2373
2374                 /*
2375                  * Reuse makeit as a recursion depth counter.  On success
2376                  * nch will be fully referenced.
2377                  */
2378                 cache_fromdvp(pvp, cred, makeit + 1, nch);
2379                 vrele(pvp);
2380                 if (nch->ncp == NULL)
2381                         break;
2382
2383                 /*
2384                  * Do an inefficient scan of pvp (embodied by ncp) to look
2385                  * for dvp.  This will create a namecache record for dvp on
2386                  * success.  We loop up to recheck on success.
2387                  *
2388                  * ncp and dvp are both held but not locked.
2389                  */
2390                 error = cache_inefficient_scan(nch, cred, dvp, fakename);
2391                 if (error) {
2392                         kprintf("cache_fromdvp: scan %p (%s) failed on dvp=%p\n",
2393                                 pvp, nch->ncp->nc_name, dvp);
2394                         cache_drop(nch);
2395                         /* nch was NULLed out, reload mount */
2396                         nch->mount = dvp->v_mount;
2397                         break;
2398                 }
2399                 if (ncvp_debug) {
2400                         kprintf("cache_fromdvp: scan %p (%s) succeeded\n",
2401                                 pvp, nch->ncp->nc_name);
2402                 }
2403                 cache_drop(nch);
2404                 /* nch was NULLed out, reload mount */
2405                 nch->mount = dvp->v_mount;
2406         }
2407
2408         /*
2409          * If nch->ncp is non-NULL it will have been held already.
2410          */
2411         if (fakename)
2412                 kfree(fakename, M_TEMP);
2413         if (saved_dvp)
2414                 vrele(saved_dvp);
2415         if (nch->ncp)
2416                 return (0);
2417         return (EINVAL);
2418 }
2419
2420 /*
2421  * Go up the chain of parent directories until we find something
2422  * we can resolve into the namecache.  This is very inefficient.
2423  */
2424 static
2425 int
2426 cache_fromdvp_try(struct vnode *dvp, struct ucred *cred,
2427                   struct vnode **saved_dvp)
2428 {
2429         struct nchandle nch;
2430         struct vnode *pvp;
2431         int error;
2432         static time_t last_fromdvp_report;
2433         char *fakename;
2434
2435         /*
2436          * Loop getting the parent directory vnode until we get something we
2437          * can resolve in the namecache.
2438          */
2439         vref(dvp);
2440         nch.mount = dvp->v_mount;
2441         nch.ncp = NULL;
2442         fakename = NULL;
2443
2444         for (;;) {
2445                 if (fakename) {
2446                         kfree(fakename, M_TEMP);
2447                         fakename = NULL;
2448                 }
2449                 error = vop_nlookupdotdot(*dvp->v_ops, dvp, &pvp, cred,
2450                                           &fakename);
2451                 if (error) {
2452                         vrele(dvp);
2453                         break;
2454                 }
2455                 vn_unlock(pvp);
2456                 spin_lock_shared(&pvp->v_spin);
2457                 if ((nch.ncp = TAILQ_FIRST(&pvp->v_namecache)) != NULL) {
2458                         _cache_hold(nch.ncp);
2459                         spin_unlock_shared(&pvp->v_spin);
2460                         vrele(pvp);
2461                         break;
2462                 }
2463                 spin_unlock_shared(&pvp->v_spin);
2464                 if (pvp->v_flag & VROOT) {
2465                         nch.ncp = _cache_get(pvp->v_mount->mnt_ncmountpt.ncp);
2466                         error = cache_resolve_mp(nch.mount);
2467                         _cache_unlock(nch.ncp);
2468                         vrele(pvp);
2469                         if (error) {
2470                                 _cache_drop(nch.ncp);
2471                                 nch.ncp = NULL;
2472                                 vrele(dvp);
2473                         }
2474                         break;
2475                 }
2476                 vrele(dvp);
2477                 dvp = pvp;
2478         }
2479         if (error == 0) {
2480                 if (last_fromdvp_report != time_uptime) {
2481                         last_fromdvp_report = time_uptime;
2482                         kprintf("Warning: extremely inefficient path "
2483                                 "resolution on %s\n",
2484                                 nch.ncp->nc_name);
2485                 }
2486                 error = cache_inefficient_scan(&nch, cred, dvp, fakename);
2487
2488                 /*
2489                  * Hopefully dvp now has a namecache record associated with
2490                  * it.  Leave it referenced to prevent the kernel from
2491                  * recycling the vnode.  Otherwise extremely long directory
2492                  * paths could result in endless recycling.
2493                  */
2494                 if (*saved_dvp)
2495                     vrele(*saved_dvp);
2496                 *saved_dvp = dvp;
2497                 _cache_drop(nch.ncp);
2498         }
2499         if (fakename)
2500                 kfree(fakename, M_TEMP);
2501         return (error);
2502 }
2503
2504 /*
2505  * Do an inefficient scan of the directory represented by ncp looking for
2506  * the directory vnode dvp.  ncp must be held but not locked on entry and
2507  * will be held on return.  dvp must be refd but not locked on entry and
2508  * will remain refd on return.
2509  *
2510  * Why do this at all?  Well, due to its stateless nature the NFS server
2511  * converts file handles directly to vnodes without necessarily going through
2512  * the namecache ops that would otherwise create the namecache topology
2513  * leading to the vnode.  We could either (1) Change the namecache algorithms
2514  * to allow disconnect namecache records that are re-merged opportunistically,
2515  * or (2) Make the NFS server backtrack and scan to recover a connected
2516  * namecache topology in order to then be able to issue new API lookups.
2517  *
2518  * It turns out that (1) is a huge mess.  It takes a nice clean set of 
2519  * namecache algorithms and introduces a lot of complication in every subsystem
2520  * that calls into the namecache to deal with the re-merge case, especially
2521  * since we are using the namecache to placehold negative lookups and the
2522  * vnode might not be immediately assigned. (2) is certainly far less
2523  * efficient then (1), but since we are only talking about directories here
2524  * (which are likely to remain cached), the case does not actually run all
2525  * that often and has the supreme advantage of not polluting the namecache
2526  * algorithms.
2527  *
2528  * If a fakename is supplied just construct a namecache entry using the
2529  * fake name.
2530  */
2531 static int
2532 cache_inefficient_scan(struct nchandle *nch, struct ucred *cred, 
2533                        struct vnode *dvp, char *fakename)
2534 {
2535         struct nlcomponent nlc;
2536         struct nchandle rncp;
2537         struct dirent *den;
2538         struct vnode *pvp;
2539         struct vattr vat;
2540         struct iovec iov;
2541         struct uio uio;
2542         int blksize;
2543         int eofflag;
2544         int bytes;
2545         char *rbuf;
2546         int error;
2547
2548         vat.va_blocksize = 0;
2549         if ((error = VOP_GETATTR(dvp, &vat)) != 0)
2550                 return (error);
2551         cache_lock(nch);
2552         error = cache_vref(nch, cred, &pvp);
2553         cache_unlock(nch);
2554         if (error)
2555                 return (error);
2556         if (ncvp_debug) {
2557                 kprintf("inefficient_scan of (%p,%s): directory iosize %ld "
2558                         "vattr fileid = %lld\n",
2559                         nch->ncp, nch->ncp->nc_name,
2560                         vat.va_blocksize,
2561                         (long long)vat.va_fileid);
2562         }
2563
2564         /*
2565          * Use the supplied fakename if not NULL.  Fake names are typically
2566          * not in the actual filesystem hierarchy.  This is used by HAMMER
2567          * to glue @@timestamp recursions together.
2568          */
2569         if (fakename) {
2570                 nlc.nlc_nameptr = fakename;
2571                 nlc.nlc_namelen = strlen(fakename);
2572                 rncp = cache_nlookup(nch, &nlc);
2573                 goto done;
2574         }
2575
2576         if ((blksize = vat.va_blocksize) == 0)
2577                 blksize = DEV_BSIZE;
2578         rbuf = kmalloc(blksize, M_TEMP, M_WAITOK);
2579         rncp.ncp = NULL;
2580
2581         eofflag = 0;
2582         uio.uio_offset = 0;
2583 again:
2584         iov.iov_base = rbuf;
2585         iov.iov_len = blksize;
2586         uio.uio_iov = &iov;
2587         uio.uio_iovcnt = 1;
2588         uio.uio_resid = blksize;
2589         uio.uio_segflg = UIO_SYSSPACE;
2590         uio.uio_rw = UIO_READ;
2591         uio.uio_td = curthread;
2592
2593         if (ncvp_debug >= 2)
2594                 kprintf("cache_inefficient_scan: readdir @ %08x\n", (int)uio.uio_offset);
2595         error = VOP_READDIR(pvp, &uio, cred, &eofflag, NULL, NULL);
2596         if (error == 0) {
2597                 den = (struct dirent *)rbuf;
2598                 bytes = blksize - uio.uio_resid;
2599
2600                 while (bytes > 0) {
2601                         if (ncvp_debug >= 2) {
2602                                 kprintf("cache_inefficient_scan: %*.*s\n",
2603                                         den->d_namlen, den->d_namlen, 
2604                                         den->d_name);
2605                         }
2606                         if (den->d_type != DT_WHT &&
2607                             den->d_ino == vat.va_fileid) {
2608                                 if (ncvp_debug) {
2609                                         kprintf("cache_inefficient_scan: "
2610                                                "MATCHED inode %lld path %s/%*.*s\n",
2611                                                (long long)vat.va_fileid,
2612                                                nch->ncp->nc_name,
2613                                                den->d_namlen, den->d_namlen,
2614                                                den->d_name);
2615                                 }
2616                                 nlc.nlc_nameptr = den->d_name;
2617                                 nlc.nlc_namelen = den->d_namlen;
2618                                 rncp = cache_nlookup(nch, &nlc);
2619                                 KKASSERT(rncp.ncp != NULL);
2620                                 break;
2621                         }
2622                         bytes -= _DIRENT_DIRSIZ(den);
2623                         den = _DIRENT_NEXT(den);
2624                 }
2625                 if (rncp.ncp == NULL && eofflag == 0 && uio.uio_resid != blksize)
2626                         goto again;
2627         }
2628         kfree(rbuf, M_TEMP);
2629 done:
2630         vrele(pvp);
2631         if (rncp.ncp) {
2632                 if (rncp.ncp->nc_flag & NCF_UNRESOLVED) {
2633                         _cache_setvp(rncp.mount, rncp.ncp, dvp);
2634                         if (ncvp_debug >= 2) {
2635                                 kprintf("cache_inefficient_scan: setvp %s/%s = %p\n",
2636                                         nch->ncp->nc_name, rncp.ncp->nc_name, dvp);
2637                         }
2638                 } else {
2639                         if (ncvp_debug >= 2) {
2640                                 kprintf("cache_inefficient_scan: setvp %s/%s already set %p/%p\n", 
2641                                         nch->ncp->nc_name, rncp.ncp->nc_name, dvp,
2642                                         rncp.ncp->nc_vp);
2643                         }
2644                 }
2645                 if (rncp.ncp->nc_vp == NULL)
2646                         error = rncp.ncp->nc_error;
2647                 /* 
2648                  * Release rncp after a successful nlookup.  rncp was fully
2649                  * referenced.
2650                  */
2651                 cache_put(&rncp);
2652         } else {
2653                 kprintf("cache_inefficient_scan: dvp %p NOT FOUND in %s\n",
2654                         dvp, nch->ncp->nc_name);
2655                 error = ENOENT;
2656         }
2657         return (error);
2658 }
2659
2660 /*
2661  * Zap a namecache entry.  The ncp is unconditionally set to an unresolved
2662  * state, which disassociates it from its vnode or ncneg.list.
2663  *
2664  * Then, if there are no additional references to the ncp and no children,
2665  * the ncp is removed from the topology and destroyed.
2666  *
2667  * References and/or children may exist if the ncp is in the middle of the
2668  * topology, preventing the ncp from being destroyed.
2669  *
2670  * This function must be called with the ncp held and locked and will unlock
2671  * and drop it during zapping.
2672  *
2673  * If nonblock is non-zero and the parent ncp cannot be locked we give up.
2674  * This case can occur in the cache_drop() path.
2675  *
2676  * This function may returned a held (but NOT locked) parent node which the
2677  * caller must drop.  We do this so _cache_drop() can loop, to avoid
2678  * blowing out the kernel stack.
2679  *
2680  * WARNING!  For MPSAFE operation this routine must acquire up to three
2681  *           spin locks to be able to safely test nc_refs.  Lock order is
2682  *           very important.
2683  *
2684  *           hash spinlock if on hash list
2685  *           parent spinlock if child of parent
2686  *           (the ncp is unresolved so there is no vnode association)
2687  */
2688 static struct namecache *
2689 cache_zap(struct namecache *ncp, int nonblock)
2690 {
2691         struct namecache *par;
2692         struct vnode *dropvp;
2693         struct nchash_head *nchpp;
2694         int refs;
2695
2696         /*
2697          * Disassociate the vnode or negative cache ref and set NCF_UNRESOLVED.
2698          */
2699         _cache_setunresolved(ncp);
2700
2701         /*
2702          * Try to scrap the entry and possibly tail-recurse on its parent.
2703          * We only scrap unref'd (other then our ref) unresolved entries,
2704          * we do not scrap 'live' entries.
2705          *
2706          * Note that once the spinlocks are acquired if nc_refs == 1 no
2707          * other references are possible.  If it isn't, however, we have
2708          * to decrement but also be sure to avoid a 1->0 transition.
2709          */
2710         KKASSERT(ncp->nc_flag & NCF_UNRESOLVED);
2711         KKASSERT(ncp->nc_refs > 0);
2712
2713         /*
2714          * Acquire locks.  Note that the parent can't go away while we hold
2715          * a child locked.
2716          */
2717         nchpp = NULL;
2718         if ((par = ncp->nc_parent) != NULL) {
2719                 if (nonblock) {
2720                         for (;;) {
2721                                 if (_cache_lock_nonblock(par) == 0)
2722                                         break;
2723                                 refs = ncp->nc_refs;
2724                                 ncp->nc_flag |= NCF_DEFEREDZAP;
2725                                 ++numdefered;   /* MP race ok */
2726                                 if (atomic_cmpset_int(&ncp->nc_refs,
2727                                                       refs, refs - 1)) {
2728                                         _cache_unlock(ncp);
2729                                         return(NULL);
2730                                 }
2731                                 cpu_pause();
2732                         }
2733                         _cache_hold(par);
2734                 } else {
2735                         _cache_hold(par);
2736                         _cache_lock(par);
2737                 }
2738                 nchpp = ncp->nc_head;
2739                 spin_lock(&nchpp->spin);
2740         }
2741
2742         /*
2743          * At this point if we find refs == 1 it should not be possible for
2744          * anyone else to have access to the ncp.  We are holding the only
2745          * possible access point left (nchpp) spin-locked.
2746          *
2747          * If someone other then us has a ref or we have children
2748          * we cannot zap the entry.  The 1->0 transition and any
2749          * further list operation is protected by the spinlocks
2750          * we have acquired but other transitions are not.
2751          */
2752         for (;;) {
2753                 refs = ncp->nc_refs;
2754                 cpu_ccfence();
2755                 if (refs == 1 && TAILQ_EMPTY(&ncp->nc_list))
2756                         break;
2757                 if (atomic_cmpset_int(&ncp->nc_refs, refs, refs - 1)) {
2758                         if (par) {
2759                                 spin_unlock(&nchpp->spin);
2760                                 _cache_put(par);
2761                         }
2762                         _cache_unlock(ncp);
2763                         return(NULL);
2764                 }
2765                 cpu_pause();
2766         }
2767
2768         /*
2769          * We are the only ref and with the spinlocks held no further
2770          * refs can be acquired by others.
2771          *
2772          * Remove us from the hash list and parent list.  We have to
2773          * drop a ref on the parent's vp if the parent's list becomes
2774          * empty.
2775          */
2776         dropvp = NULL;
2777         if (par) {
2778                 KKASSERT(nchpp == ncp->nc_head);
2779                 LIST_REMOVE(ncp, nc_hash);
2780                 TAILQ_REMOVE(&par->nc_list, ncp, nc_entry);
2781                 if (par->nc_vp && TAILQ_EMPTY(&par->nc_list))
2782                         dropvp = par->nc_vp;
2783                 ncp->nc_head = NULL;
2784                 ncp->nc_parent = NULL;
2785                 spin_unlock(&nchpp->spin);
2786                 _cache_unlock(par);
2787         } else {
2788                 KKASSERT(ncp->nc_head == NULL);
2789         }
2790
2791         /*
2792          * ncp should not have picked up any refs.  Physically
2793          * destroy the ncp.
2794          */
2795         if (ncp->nc_refs != 1) {
2796                 int save_refs = ncp->nc_refs;
2797                 cpu_ccfence();
2798                 panic("cache_zap: %p bad refs %d (%d)\n",
2799                         ncp, save_refs, atomic_fetchadd_int(&ncp->nc_refs, 0));
2800         }
2801         KKASSERT(ncp->nc_refs == 1);
2802         /* _cache_unlock(ncp) not required */
2803         ncp->nc_refs = -1;      /* safety */
2804         if (ncp->nc_name)
2805                 kfree(ncp->nc_name, M_VFSCACHE);
2806         kfree(ncp, M_VFSCACHE);
2807
2808         /*
2809          * Delayed drop (we had to release our spinlocks)
2810          *
2811          * The refed parent (if not  NULL) must be dropped.  The
2812          * caller is responsible for looping.
2813          */
2814         if (dropvp)
2815                 vdrop(dropvp);
2816         return(par);
2817 }
2818
2819 /*
2820  * Clean up dangling negative cache and defered-drop entries in the
2821  * namecache.
2822  *
2823  * This routine is called in the critical path and also called from
2824  * vnlru().  When called from vnlru we use a lower limit to try to
2825  * deal with the negative cache before the critical path has to start
2826  * dealing with it.
2827  */
2828 typedef enum { CHI_LOW, CHI_HIGH } cache_hs_t;
2829
2830 static cache_hs_t neg_cache_hysteresis_state[2] = { CHI_LOW, CHI_LOW };
2831 static cache_hs_t pos_cache_hysteresis_state[2] = { CHI_LOW, CHI_LOW };
2832
2833 void
2834 cache_hysteresis(int critpath)
2835 {
2836         int poslimit;
2837         int neglimit = maxvnodes / ncnegfactor;
2838         int xnumcache = numcache;
2839
2840         if (critpath == 0)
2841                 neglimit = neglimit * 8 / 10;
2842
2843         /*
2844          * Don't cache too many negative hits.  We use hysteresis to reduce
2845          * the impact on the critical path.
2846          */
2847         switch(neg_cache_hysteresis_state[critpath]) {
2848         case CHI_LOW:
2849                 if (numneg > MINNEG && numneg > neglimit) {
2850                         if (critpath)
2851                                 _cache_cleanneg(ncnegflush);
2852                         else
2853                                 _cache_cleanneg(ncnegflush +
2854                                                 numneg - neglimit);
2855                         neg_cache_hysteresis_state[critpath] = CHI_HIGH;
2856                 }
2857                 break;
2858         case CHI_HIGH:
2859                 if (numneg > MINNEG * 9 / 10 && 
2860                     numneg * 9 / 10 > neglimit
2861                 ) {
2862                         if (critpath)
2863                                 _cache_cleanneg(ncnegflush);
2864                         else
2865                                 _cache_cleanneg(ncnegflush +
2866                                                 numneg * 9 / 10 - neglimit);
2867                 } else {
2868                         neg_cache_hysteresis_state[critpath] = CHI_LOW;
2869                 }
2870                 break;
2871         }
2872
2873         /*
2874          * Don't cache too many positive hits.  We use hysteresis to reduce
2875          * the impact on the critical path.
2876          *
2877          * Excessive positive hits can accumulate due to large numbers of
2878          * hardlinks (the vnode cache will not prevent hl ncps from growing
2879          * into infinity).
2880          */
2881         if ((poslimit = ncposlimit) == 0)
2882                 poslimit = maxvnodes * 2;
2883         if (critpath == 0)
2884                 poslimit = poslimit * 8 / 10;
2885
2886         switch(pos_cache_hysteresis_state[critpath]) {
2887         case CHI_LOW:
2888                 if (xnumcache > poslimit && xnumcache > MINPOS) {
2889                         if (critpath)
2890                                 _cache_cleanpos(ncposflush);
2891                         else
2892                                 _cache_cleanpos(ncposflush +
2893                                                 xnumcache - poslimit);
2894                         pos_cache_hysteresis_state[critpath] = CHI_HIGH;
2895                 }
2896                 break;
2897         case CHI_HIGH:
2898                 if (xnumcache > poslimit * 5 / 6 && xnumcache > MINPOS) {
2899                         if (critpath)
2900                                 _cache_cleanpos(ncposflush);
2901                         else
2902                                 _cache_cleanpos(ncposflush +
2903                                                 xnumcache - poslimit * 5 / 6);
2904                 } else {
2905                         pos_cache_hysteresis_state[critpath] = CHI_LOW;
2906                 }
2907                 break;
2908         }
2909
2910         /*
2911          * Clean out dangling defered-zap ncps which could not
2912          * be cleanly dropped if too many build up.  Note
2913          * that numdefered is not an exact number as such ncps
2914          * can be reused and the counter is not handled in a MP
2915          * safe manner by design.
2916          */
2917         if (numdefered > neglimit) {
2918                 _cache_cleandefered();
2919         }
2920 }
2921
2922 /*
2923  * NEW NAMECACHE LOOKUP API
2924  *
2925  * Lookup an entry in the namecache.  The passed par_nch must be referenced
2926  * and unlocked.  A referenced and locked nchandle with a non-NULL nch.ncp
2927  * is ALWAYS returned, eve if the supplied component is illegal.
2928  *
2929  * The resulting namecache entry should be returned to the system with
2930  * cache_put() or cache_unlock() + cache_drop().
2931  *
2932  * namecache locks are recursive but care must be taken to avoid lock order
2933  * reversals (hence why the passed par_nch must be unlocked).  Locking
2934  * rules are to order for parent traversals, not for child traversals.
2935  *
2936  * Nobody else will be able to manipulate the associated namespace (e.g.
2937  * create, delete, rename, rename-target) until the caller unlocks the
2938  * entry.
2939  *
2940  * The returned entry will be in one of three states:  positive hit (non-null
2941  * vnode), negative hit (null vnode), or unresolved (NCF_UNRESOLVED is set).
2942  * Unresolved entries must be resolved through the filesystem to associate the
2943  * vnode and/or determine whether a positive or negative hit has occured.
2944  *
2945  * It is not necessary to lock a directory in order to lock namespace under
2946  * that directory.  In fact, it is explicitly not allowed to do that.  A
2947  * directory is typically only locked when being created, renamed, or
2948  * destroyed.
2949  *
2950  * The directory (par) may be unresolved, in which case any returned child
2951  * will likely also be marked unresolved.  Likely but not guarenteed.  Since
2952  * the filesystem lookup requires a resolved directory vnode the caller is
2953  * responsible for resolving the namecache chain top-down.  This API 
2954  * specifically allows whole chains to be created in an unresolved state.
2955  */
2956 struct nchandle
2957 cache_nlookup(struct nchandle *par_nch, struct nlcomponent *nlc)
2958 {
2959         struct nchandle nch;
2960         struct namecache *ncp;
2961         struct namecache *new_ncp;
2962         struct nchash_head *nchpp;
2963         struct mount *mp;
2964         u_int32_t hash;
2965         globaldata_t gd;
2966         int par_locked;
2967
2968         gd = mycpu;
2969         mp = par_nch->mount;
2970         par_locked = 0;
2971
2972         /*
2973          * This is a good time to call it, no ncp's are locked by
2974          * the caller or us.
2975          */
2976         cache_hysteresis(1);
2977
2978         /*
2979          * Try to locate an existing entry
2980          */
2981         hash = fnv_32_buf(nlc->nlc_nameptr, nlc->nlc_namelen, FNV1_32_INIT);
2982         hash = fnv_32_buf(&par_nch->ncp, sizeof(par_nch->ncp), hash);
2983         new_ncp = NULL;
2984         nchpp = NCHHASH(hash);
2985 restart:
2986         if (new_ncp)
2987                 spin_lock(&nchpp->spin);
2988         else
2989                 spin_lock_shared(&nchpp->spin);
2990
2991         LIST_FOREACH(ncp, &nchpp->list, nc_hash) {
2992                 /*
2993                  * Break out if we find a matching entry.  Note that
2994                  * UNRESOLVED entries may match, but DESTROYED entries
2995                  * do not.
2996                  */
2997                 if (ncp->nc_parent == par_nch->ncp &&
2998                     ncp->nc_nlen == nlc->nlc_namelen &&
2999                     bcmp(ncp->nc_name, nlc->nlc_nameptr, ncp->nc_nlen) == 0 &&
3000                     (ncp->nc_flag & NCF_DESTROYED) == 0
3001                 ) {
3002                         _cache_hold(ncp);
3003                         if (new_ncp)
3004                                 spin_unlock(&nchpp->spin);
3005                         else
3006                                 spin_unlock_shared(&nchpp->spin);
3007                         if (par_locked) {
3008                                 _cache_unlock(par_nch->ncp);
3009                                 par_locked = 0;
3010                         }
3011                         if (_cache_lock_special(ncp) == 0) {
3012                                 /*
3013                                  * Successfully locked but we must re-test
3014                                  * conditions that might have changed since
3015                                  * we did not have the lock before.
3016                                  */
3017                                 if (ncp->nc_parent != par_nch->ncp ||
3018                                     ncp->nc_nlen != nlc->nlc_namelen ||
3019                                     bcmp(ncp->nc_name, nlc->nlc_nameptr,
3020                                          ncp->nc_nlen) ||
3021                                     (ncp->nc_flag & NCF_DESTROYED)) {
3022                                         _cache_put(ncp);
3023                                         goto restart;
3024                                 }
3025                                 _cache_auto_unresolve(mp, ncp);
3026                                 if (new_ncp)
3027                                         _cache_free(new_ncp);
3028                                 goto found;
3029                         }
3030                         _cache_get(ncp);        /* cycle the lock to block */
3031                         _cache_put(ncp);
3032                         _cache_drop(ncp);
3033                         goto restart;
3034                 }
3035         }
3036
3037         /*
3038          * We failed to locate an entry, create a new entry and add it to
3039          * the cache.  The parent ncp must also be locked so we
3040          * can link into it.
3041          *
3042          * We have to relookup after possibly blocking in kmalloc or
3043          * when locking par_nch.
3044          *
3045          * NOTE: nlc_namelen can be 0 and nlc_nameptr NULL as a special
3046          *       mount case, in which case nc_name will be NULL.
3047          */
3048         if (new_ncp == NULL) {
3049                 spin_unlock_shared(&nchpp->spin);
3050                 new_ncp = cache_alloc(nlc->nlc_namelen);
3051                 if (nlc->nlc_namelen) {
3052                         bcopy(nlc->nlc_nameptr, new_ncp->nc_name,
3053                               nlc->nlc_namelen);
3054                         new_ncp->nc_name[nlc->nlc_namelen] = 0;
3055                 }
3056                 goto restart;
3057         }
3058
3059         /*
3060          * NOTE! The spinlock is held exclusively here because new_ncp
3061          *       is non-NULL.
3062          */
3063         if (par_locked == 0) {
3064                 spin_unlock(&nchpp->spin);
3065                 _cache_lock(par_nch->ncp);
3066                 par_locked = 1;
3067                 goto restart;
3068         }
3069
3070         /*
3071          * WARNING!  We still hold the spinlock.  We have to set the hash
3072          *           table entry atomically.
3073          */
3074         ncp = new_ncp;
3075         _cache_link_parent(ncp, par_nch->ncp, nchpp);
3076         spin_unlock(&nchpp->spin);
3077         _cache_unlock(par_nch->ncp);
3078         /* par_locked = 0 - not used */
3079 found:
3080         /*
3081          * stats and namecache size management
3082          */
3083         if (ncp->nc_flag & NCF_UNRESOLVED)
3084                 ++gd->gd_nchstats->ncs_miss;
3085         else if (ncp->nc_vp)
3086                 ++gd->gd_nchstats->ncs_goodhits;
3087         else
3088                 ++gd->gd_nchstats->ncs_neghits;
3089         nch.mount = mp;
3090         nch.ncp = ncp;
3091         _cache_mntref(nch.mount);
3092
3093         return(nch);
3094 }
3095
3096 /*
3097  * Attempt to lookup a namecache entry and return with a shared namecache
3098  * lock.
3099  */
3100 int
3101 cache_nlookup_maybe_shared(struct nchandle *par_nch, struct nlcomponent *nlc,
3102                            int excl, struct nchandle *res_nch)
3103 {
3104         struct namecache *ncp;
3105         struct nchash_head *nchpp;
3106         struct mount *mp;
3107         u_int32_t hash;
3108         globaldata_t gd;
3109
3110         /*
3111          * If exclusive requested or shared namecache locks are disabled,
3112          * return failure.
3113          */
3114         if (ncp_shared_lock_disable || excl)
3115                 return(EWOULDBLOCK);
3116
3117         gd = mycpu;
3118         mp = par_nch->mount;
3119
3120         /*
3121          * This is a good time to call it, no ncp's are locked by
3122          * the caller or us.
3123          */
3124         cache_hysteresis(1);
3125
3126         /*
3127          * Try to locate an existing entry
3128          */
3129         hash = fnv_32_buf(nlc->nlc_nameptr, nlc->nlc_namelen, FNV1_32_INIT);
3130         hash = fnv_32_buf(&par_nch->ncp, sizeof(par_nch->ncp), hash);
3131         nchpp = NCHHASH(hash);
3132
3133         spin_lock_shared(&nchpp->spin);
3134
3135         LIST_FOREACH(ncp, &nchpp->list, nc_hash) {
3136                 /*
3137                  * Break out if we find a matching entry.  Note that
3138                  * UNRESOLVED entries may match, but DESTROYED entries
3139                  * do not.
3140                  */
3141                 if (ncp->nc_parent == par_nch->ncp &&
3142                     ncp->nc_nlen == nlc->nlc_namelen &&
3143                     bcmp(ncp->nc_name, nlc->nlc_nameptr, ncp->nc_nlen) == 0 &&
3144                     (ncp->nc_flag & NCF_DESTROYED) == 0
3145                 ) {
3146                         _cache_hold(ncp);
3147                         spin_unlock_shared(&nchpp->spin);
3148                         if (_cache_lock_shared_special(ncp) == 0) {
3149                                 if (ncp->nc_parent == par_nch->ncp &&
3150                                     ncp->nc_nlen == nlc->nlc_namelen &&
3151                                     bcmp(ncp->nc_name, nlc->nlc_nameptr,
3152                                          ncp->nc_nlen) == 0 &&
3153                                     (ncp->nc_flag & NCF_DESTROYED) == 0 &&
3154                                     (ncp->nc_flag & NCF_UNRESOLVED) == 0 &&
3155                                     _cache_auto_unresolve_test(mp, ncp) == 0) {
3156                                         goto found;
3157                                 }
3158                                 _cache_unlock(ncp);
3159                         }
3160                         _cache_drop(ncp);
3161                         spin_lock_shared(&nchpp->spin);
3162                         break;
3163                 }
3164         }
3165
3166         /*
3167          * Failure
3168          */
3169         spin_unlock_shared(&nchpp->spin);
3170         return(EWOULDBLOCK);
3171
3172         /*
3173          * Success
3174          *
3175          * Note that nc_error might be non-zero (e.g ENOENT).
3176          */
3177 found:
3178         res_nch->mount = mp;
3179         res_nch->ncp = ncp;
3180         ++gd->gd_nchstats->ncs_goodhits;
3181         _cache_mntref(res_nch->mount);
3182
3183         KKASSERT(ncp->nc_error != EWOULDBLOCK);
3184         return(ncp->nc_error);
3185 }
3186
3187 /*
3188  * This is a non-blocking verison of cache_nlookup() used by
3189  * nfs_readdirplusrpc_uio().  It can fail for any reason and
3190  * will return nch.ncp == NULL in that case.
3191  */
3192 struct nchandle
3193 cache_nlookup_nonblock(struct nchandle *par_nch, struct nlcomponent *nlc)
3194 {
3195         struct nchandle nch;
3196         struct namecache *ncp;
3197         struct namecache *new_ncp;
3198         struct nchash_head *nchpp;
3199         struct mount *mp;
3200         u_int32_t hash;
3201         globaldata_t gd;
3202         int par_locked;
3203
3204         gd = mycpu;
3205         mp = par_nch->mount;
3206         par_locked = 0;
3207
3208         /*
3209          * Try to locate an existing entry
3210          */
3211         hash = fnv_32_buf(nlc->nlc_nameptr, nlc->nlc_namelen, FNV1_32_INIT);
3212         hash = fnv_32_buf(&par_nch->ncp, sizeof(par_nch->ncp), hash);
3213         new_ncp = NULL;
3214         nchpp = NCHHASH(hash);
3215 restart:
3216         spin_lock(&nchpp->spin);
3217         LIST_FOREACH(ncp, &nchpp->list, nc_hash) {
3218                 /*
3219                  * Break out if we find a matching entry.  Note that
3220                  * UNRESOLVED entries may match, but DESTROYED entries
3221                  * do not.
3222                  */
3223                 if (ncp->nc_parent == par_nch->ncp &&
3224                     ncp->nc_nlen == nlc->nlc_namelen &&
3225                     bcmp(ncp->nc_name, nlc->nlc_nameptr, ncp->nc_nlen) == 0 &&
3226                     (ncp->nc_flag & NCF_DESTROYED) == 0
3227                 ) {
3228                         _cache_hold(ncp);
3229                         spin_unlock(&nchpp->spin);
3230                         if (par_locked) {
3231                                 _cache_unlock(par_nch->ncp);
3232                                 par_locked = 0;
3233                         }
3234                         if (_cache_lock_special(ncp) == 0) {
3235                                 if (ncp->nc_parent != par_nch->ncp ||
3236                                     ncp->nc_nlen != nlc->nlc_namelen ||
3237                                     bcmp(ncp->nc_name, nlc->nlc_nameptr, ncp->nc_nlen) ||
3238                                     (ncp->nc_flag & NCF_DESTROYED)) {
3239                                         kprintf("cache_lookup_nonblock: "
3240                                                 "ncp-race %p %*.*s\n",
3241                                                 ncp,
3242                                                 nlc->nlc_namelen,
3243                                                 nlc->nlc_namelen,
3244                                                 nlc->nlc_nameptr);
3245                                         _cache_unlock(ncp);
3246                                         _cache_drop(ncp);
3247                                         goto failed;
3248                                 }
3249                                 _cache_auto_unresolve(mp, ncp);
3250                                 if (new_ncp) {
3251                                         _cache_free(new_ncp);
3252                                         new_ncp = NULL;
3253                                 }
3254                                 goto found;
3255                         }
3256                         _cache_drop(ncp);
3257                         goto failed;
3258                 }
3259         }
3260
3261         /*
3262          * We failed to locate an entry, create a new entry and add it to
3263          * the cache.  The parent ncp must also be locked so we
3264          * can link into it.
3265          *
3266          * We have to relookup after possibly blocking in kmalloc or
3267          * when locking par_nch.
3268          *
3269          * NOTE: nlc_namelen can be 0 and nlc_nameptr NULL as a special
3270          *       mount case, in which case nc_name will be NULL.
3271          */
3272         if (new_ncp == NULL) {
3273                 spin_unlock(&nchpp->spin);
3274                 new_ncp = cache_alloc(nlc->nlc_namelen);
3275                 if (nlc->nlc_namelen) {
3276                         bcopy(nlc->nlc_nameptr, new_ncp->nc_name,
3277                               nlc->nlc_namelen);
3278                         new_ncp->nc_name[nlc->nlc_namelen] = 0;
3279                 }
3280                 goto restart;
3281         }
3282         if (par_locked == 0) {
3283                 spin_unlock(&nchpp->spin);
3284                 if (_cache_lock_nonblock(par_nch->ncp) == 0) {
3285                         par_locked = 1;
3286                         goto restart;
3287                 }
3288                 goto failed;
3289         }
3290
3291         /*
3292          * WARNING!  We still hold the spinlock.  We have to set the hash
3293          *           table entry atomically.
3294          */
3295         ncp = new_ncp;
3296         _cache_link_parent(ncp, par_nch->ncp, nchpp);
3297         spin_unlock(&nchpp->spin);
3298         _cache_unlock(par_nch->ncp);
3299         /* par_locked = 0 - not used */
3300 found:
3301         /*
3302          * stats and namecache size management
3303          */
3304         if (ncp->nc_flag & NCF_UNRESOLVED)
3305                 ++gd->gd_nchstats->ncs_miss;
3306         else if (ncp->nc_vp)
3307                 ++gd->gd_nchstats->ncs_goodhits;
3308         else
3309                 ++gd->gd_nchstats->ncs_neghits;
3310         nch.mount = mp;
3311         nch.ncp = ncp;
3312         _cache_mntref(nch.mount);
3313
3314         return(nch);
3315 failed:
3316         if (new_ncp) {
3317                 _cache_free(new_ncp);
3318                 new_ncp = NULL;
3319         }
3320         nch.mount = NULL;
3321         nch.ncp = NULL;
3322         return(nch);
3323 }
3324
3325 /*
3326  * The namecache entry is marked as being used as a mount point. 
3327  * Locate the mount if it is visible to the caller.  The DragonFly
3328  * mount system allows arbitrary loops in the topology and disentangles
3329  * those loops by matching against (mp, ncp) rather than just (ncp).
3330  * This means any given ncp can dive any number of mounts, depending
3331  * on the relative mount (e.g. nullfs) the caller is at in the topology.
3332  *
3333  * We use a very simple frontend cache to reduce SMP conflicts,
3334  * which we have to do because the mountlist scan needs an exclusive
3335  * lock around its ripout info list.  Not to mention that there might
3336  * be a lot of mounts.
3337  */
3338 struct findmount_info {
3339         struct mount *result;
3340         struct mount *nch_mount;
3341         struct namecache *nch_ncp;
3342 };
3343
3344 static
3345 struct ncmount_cache *
3346 ncmount_cache_lookup(struct mount *mp, struct namecache *ncp)
3347 {
3348         int hash;
3349
3350         hash = ((int)(intptr_t)mp / sizeof(*mp)) ^
3351                ((int)(intptr_t)ncp / sizeof(*ncp));
3352         hash = (hash & 0x7FFFFFFF) % NCMOUNT_NUMCACHE;
3353         return (&ncmount_cache[hash]);
3354 }
3355
3356 static
3357 int
3358 cache_findmount_callback(struct mount *mp, void *data)
3359 {
3360         struct findmount_info *info = data;
3361
3362         /*
3363          * Check the mount's mounted-on point against the passed nch.
3364          */
3365         if (mp->mnt_ncmounton.mount == info->nch_mount &&
3366             mp->mnt_ncmounton.ncp == info->nch_ncp
3367         ) {
3368             info->result = mp;
3369             _cache_mntref(mp);
3370             return(-1);
3371         }
3372         return(0);
3373 }
3374
3375 struct mount *
3376 cache_findmount(struct nchandle *nch)
3377 {
3378         struct findmount_info info;
3379         struct ncmount_cache *ncc;
3380         struct mount *mp;
3381
3382         /*
3383          * Fast
3384          */
3385         if (ncmount_cache_enable == 0) {
3386                 ncc = NULL;
3387                 goto skip;
3388         }
3389         ncc = ncmount_cache_lookup(nch->mount, nch->ncp);
3390         if (ncc->ncp == nch->ncp) {
3391                 spin_lock_shared(&ncc->spin);
3392                 if (ncc->isneg == 0 &&
3393                     ncc->ncp == nch->ncp && (mp = ncc->mp) != NULL) {
3394                         if (mp->mnt_ncmounton.mount == nch->mount &&
3395                             mp->mnt_ncmounton.ncp == nch->ncp) {
3396                                 /*
3397                                  * Cache hit (positive)
3398                                  */
3399                                 _cache_mntref(mp);
3400                                 spin_unlock_shared(&ncc->spin);
3401                                 return(mp);
3402                         }
3403                         /* else cache miss */
3404                 }
3405                 if (ncc->isneg &&
3406                     ncc->ncp == nch->ncp && ncc->mp == nch->mount) {
3407                         /*
3408                          * Cache hit (negative)
3409                          */
3410                         spin_unlock_shared(&ncc->spin);
3411                         return(NULL);
3412                 }
3413                 spin_unlock_shared(&ncc->spin);
3414         }
3415 skip:
3416
3417         /*
3418          * Slow
3419          */
3420         info.result = NULL;
3421         info.nch_mount = nch->mount;
3422         info.nch_ncp = nch->ncp;
3423         mountlist_scan(cache_findmount_callback, &info,
3424                                MNTSCAN_FORWARD|MNTSCAN_NOBUSY);
3425
3426         /*
3427          * Cache the result.
3428          *
3429          * Negative lookups: We cache the originating {ncp,mp}. (mp) is
3430          *                   only used for pointer comparisons and is not
3431          *                   referenced (otherwise there would be dangling
3432          *                   refs).
3433          *
3434          * Positive lookups: We cache the originating {ncp} and the target
3435          *                   (mp).  (mp) is referenced.
3436          *
3437          * Indeterminant:    If the match is undergoing an unmount we do
3438          *                   not cache it to avoid racing cache_unmounting(),
3439          *                   but still return the match.
3440          */
3441         if (ncc) {
3442                 spin_lock(&ncc->spin);
3443                 if (info.result == NULL) {
3444                         if (ncc->isneg == 0 && ncc->mp)
3445                                 _cache_mntrel(ncc->mp);
3446                         ncc->ncp = nch->ncp;
3447                         ncc->mp = nch->mount;
3448                         ncc->isneg = 1;
3449                         spin_unlock(&ncc->spin);
3450                 } else if ((info.result->mnt_kern_flag & MNTK_UNMOUNT) == 0) {
3451                         if (ncc->isneg == 0 && ncc->mp)
3452                                 _cache_mntrel(ncc->mp);
3453                         _cache_mntref(info.result);
3454                         ncc->ncp = nch->ncp;
3455                         ncc->mp = info.result;
3456                         ncc->isneg = 0;
3457                         spin_unlock(&ncc->spin);
3458                 } else {
3459                         spin_unlock(&ncc->spin);
3460                 }
3461         }
3462         return(info.result);
3463 }
3464
3465 void
3466 cache_dropmount(struct mount *mp)
3467 {
3468         _cache_mntrel(mp);
3469 }
3470
3471 void
3472 cache_ismounting(struct mount *mp)
3473 {
3474         struct nchandle *nch = &mp->mnt_ncmounton;
3475         struct ncmount_cache *ncc;
3476
3477         ncc = ncmount_cache_lookup(nch->mount, nch->ncp);
3478         if (ncc->isneg &&
3479             ncc->ncp == nch->ncp && ncc->mp == nch->mount) {
3480                 spin_lock(&ncc->spin);
3481                 if (ncc->isneg &&
3482                     ncc->ncp == nch->ncp && ncc->mp == nch->mount) {
3483                         ncc->ncp = NULL;
3484                         ncc->mp = NULL;
3485                 }
3486                 spin_unlock(&ncc->spin);
3487         }
3488 }
3489
3490 void
3491 cache_unmounting(struct mount *mp)
3492 {
3493         struct nchandle *nch = &mp->mnt_ncmounton;
3494         struct ncmount_cache *ncc;
3495
3496         ncc = ncmount_cache_lookup(nch->mount, nch->ncp);
3497         if (ncc->isneg == 0 &&
3498             ncc->ncp == nch->ncp && ncc->mp == mp) {
3499                 spin_lock(&ncc->spin);
3500                 if (ncc->isneg == 0 &&
3501                     ncc->ncp == nch->ncp && ncc->mp == mp) {
3502                         _cache_mntrel(mp);
3503                         ncc->ncp = NULL;
3504                         ncc->mp = NULL;
3505                 }
3506                 spin_unlock(&ncc->spin);
3507         }
3508 }
3509
3510 /*
3511  * Resolve an unresolved namecache entry, generally by looking it up.
3512  * The passed ncp must be locked and refd. 
3513  *
3514  * Theoretically since a vnode cannot be recycled while held, and since
3515  * the nc_parent chain holds its vnode as long as children exist, the
3516  * direct parent of the cache entry we are trying to resolve should
3517  * have a valid vnode.  If not then generate an error that we can 
3518  * determine is related to a resolver bug.
3519  *
3520  * However, if a vnode was in the middle of a recyclement when the NCP
3521  * got locked, ncp->nc_vp might point to a vnode that is about to become
3522  * invalid.  cache_resolve() handles this case by unresolving the entry
3523  * and then re-resolving it.
3524  *
3525  * Note that successful resolution does not necessarily return an error
3526  * code of 0.  If the ncp resolves to a negative cache hit then ENOENT
3527  * will be returned.
3528  */
3529 int
3530 cache_resolve(struct nchandle *nch, struct ucred *cred)
3531 {
3532         struct namecache *par_tmp;
3533         struct namecache *par;
3534         struct namecache *ncp;
3535         struct nchandle nctmp;
3536         struct mount *mp;
3537         struct vnode *dvp;
3538         int error;
3539
3540         ncp = nch->ncp;
3541         mp = nch->mount;
3542         KKASSERT(_cache_lockstatus(ncp) == LK_EXCLUSIVE);
3543 restart:
3544         /*
3545          * If the ncp is already resolved we have nothing to do.  However,
3546          * we do want to guarentee that a usable vnode is returned when
3547          * a vnode is present, so make sure it hasn't been reclaimed.
3548          */
3549         if ((ncp->nc_flag & NCF_UNRESOLVED) == 0) {
3550                 if (ncp->nc_vp && (ncp->nc_vp->v_flag & VRECLAIMED))
3551                         _cache_setunresolved(ncp);
3552                 if ((ncp->nc_flag & NCF_UNRESOLVED) == 0)
3553                         return (ncp->nc_error);
3554         }
3555
3556         /*
3557          * If the ncp was destroyed it will never resolve again.  This
3558          * can basically only happen when someone is chdir'd into an
3559          * empty directory which is then rmdir'd.  We want to catch this
3560          * here and not dive the VFS because the VFS might actually
3561          * have a way to re-resolve the disconnected ncp, which will
3562          * result in inconsistencies in the cdir/nch for proc->p_fd.
3563          */
3564         if (ncp->nc_flag & NCF_DESTROYED)
3565                 return(EINVAL);
3566
3567         /*
3568          * Mount points need special handling because the parent does not
3569          * belong to the same filesystem as the ncp.
3570          */
3571         if (ncp == mp->mnt_ncmountpt.ncp)
3572                 return (cache_resolve_mp(mp));
3573
3574         /*
3575          * We expect an unbroken chain of ncps to at least the mount point,
3576          * and even all the way to root (but this code doesn't have to go
3577          * past the mount point).
3578          */
3579         if (ncp->nc_parent == NULL) {
3580                 kprintf("EXDEV case 1 %p %*.*s\n", ncp,
3581                         ncp->nc_nlen, ncp->nc_nlen, ncp->nc_name);
3582                 ncp->nc_error = EXDEV;
3583                 return(ncp->nc_error);
3584         }
3585
3586         /*
3587          * The vp's of the parent directories in the chain are held via vhold()
3588          * due to the existance of the child, and should not disappear. 
3589          * However, there are cases where they can disappear:
3590          *
3591          *      - due to filesystem I/O errors.
3592          *      - due to NFS being stupid about tracking the namespace and
3593          *        destroys the namespace for entire directories quite often.
3594          *      - due to forced unmounts.
3595          *      - due to an rmdir (parent will be marked DESTROYED)
3596          *
3597          * When this occurs we have to track the chain backwards and resolve
3598          * it, looping until the resolver catches up to the current node.  We
3599          * could recurse here but we might run ourselves out of kernel stack
3600          * so we do it in a more painful manner.  This situation really should
3601          * not occur all that often, or if it does not have to go back too
3602          * many nodes to resolve the ncp.
3603          */
3604         while ((dvp = cache_dvpref(ncp)) == NULL) {
3605                 /*
3606                  * This case can occur if a process is CD'd into a
3607                  * directory which is then rmdir'd.  If the parent is marked
3608                  * destroyed there is no point trying to resolve it.
3609                  */
3610                 if (ncp->nc_parent->nc_flag & NCF_DESTROYED)
3611                         return(ENOENT);
3612                 par = ncp->nc_parent;
3613                 _cache_hold(par);
3614                 _cache_lock(par);
3615                 while ((par_tmp = par->nc_parent) != NULL &&
3616                        par_tmp->nc_vp == NULL) {
3617                         _cache_hold(par_tmp);
3618                         _cache_lock(par_tmp);
3619                         _cache_put(par);
3620                         par = par_tmp;
3621                 }
3622                 if (par->nc_parent == NULL) {
3623                         kprintf("EXDEV case 2 %*.*s\n",
3624                                 par->nc_nlen, par->nc_nlen, par->nc_name);
3625                         _cache_put(par);
3626                         return (EXDEV);
3627                 }
3628                 /*
3629                  * The parent is not set in stone, ref and lock it to prevent
3630                  * it from disappearing.  Also note that due to renames it
3631                  * is possible for our ncp to move and for par to no longer
3632                  * be one of its parents.  We resolve it anyway, the loop 
3633                  * will handle any moves.
3634                  */
3635                 _cache_get(par);        /* additional hold/lock */
3636                 _cache_put(par);        /* from earlier hold/lock */
3637                 if (par == nch->mount->mnt_ncmountpt.ncp) {
3638                         cache_resolve_mp(nch->mount);
3639                 } else if ((dvp = cache_dvpref(par)) == NULL) {
3640                         kprintf("[diagnostic] cache_resolve: raced on %*.*s\n", par->nc_nlen, par->nc_nlen, par->nc_name);
3641                         _cache_put(par);
3642                         continue;
3643                 } else {
3644                         if (par->nc_flag & NCF_UNRESOLVED) {
3645                                 nctmp.mount = mp;
3646                                 nctmp.ncp = par;
3647                                 par->nc_error = VOP_NRESOLVE(&nctmp, dvp, cred);
3648                         }
3649                         vrele(dvp);
3650                 }
3651                 if ((error = par->nc_error) != 0) {
3652                         if (par->nc_error != EAGAIN) {
3653                                 kprintf("EXDEV case 3 %*.*s error %d\n",
3654                                     par->nc_nlen, par->nc_nlen, par->nc_name,
3655                                     par->nc_error);
3656                                 _cache_put(par);
3657                                 return(error);
3658                         }
3659                         kprintf("[diagnostic] cache_resolve: EAGAIN par %p %*.*s\n",
3660                                 par, par->nc_nlen, par->nc_nlen, par->nc_name);
3661                 }
3662                 _cache_put(par);
3663                 /* loop */
3664         }
3665
3666         /*
3667          * Call VOP_NRESOLVE() to get the vp, then scan for any disconnected
3668          * ncp's and reattach them.  If this occurs the original ncp is marked
3669          * EAGAIN to force a relookup.
3670          *
3671          * NOTE: in order to call VOP_NRESOLVE(), the parent of the passed
3672          * ncp must already be resolved.
3673          */
3674         if (dvp) {
3675                 nctmp.mount = mp;
3676                 nctmp.ncp = ncp;
3677                 ncp->nc_error = VOP_NRESOLVE(&nctmp, dvp, cred);
3678                 vrele(dvp);
3679         } else {
3680                 ncp->nc_error = EPERM;
3681         }
3682         if (ncp->nc_error == EAGAIN) {
3683                 kprintf("[diagnostic] cache_resolve: EAGAIN ncp %p %*.*s\n",
3684                         ncp, ncp->nc_nlen, ncp->nc_nlen, ncp->nc_name);
3685                 goto restart;
3686         }
3687         return(ncp->nc_error);
3688 }
3689
3690 /*
3691  * Resolve the ncp associated with a mount point.  Such ncp's almost always
3692  * remain resolved and this routine is rarely called.  NFS MPs tends to force
3693  * re-resolution more often due to its mac-truck-smash-the-namecache
3694  * method of tracking namespace changes.
3695  *
3696  * The semantics for this call is that the passed ncp must be locked on
3697  * entry and will be locked on return.  However, if we actually have to
3698  * resolve the mount point we temporarily unlock the entry in order to
3699  * avoid race-to-root deadlocks due to e.g. dead NFS mounts.  Because of
3700  * the unlock we have to recheck the flags after we relock.
3701  */
3702 static int
3703 cache_resolve_mp(struct mount *mp)
3704 {
3705         struct namecache *ncp = mp->mnt_ncmountpt.ncp;
3706         struct vnode *vp;
3707         int error;
3708
3709         KKASSERT(mp != NULL);
3710
3711         /*
3712          * If the ncp is already resolved we have nothing to do.  However,
3713          * we do want to guarentee that a usable vnode is returned when
3714          * a vnode is present, so make sure it hasn't been reclaimed.
3715          */
3716         if ((ncp->nc_flag & NCF_UNRESOLVED) == 0) {
3717                 if (ncp->nc_vp && (ncp->nc_vp->v_flag & VRECLAIMED))
3718                         _cache_setunresolved(ncp);
3719         }
3720
3721         if (ncp->nc_flag & NCF_UNRESOLVED) {
3722                 _cache_unlock(ncp);
3723                 while (vfs_busy(mp, 0))
3724                         ;
3725                 error = VFS_ROOT(mp, &vp);
3726                 _cache_lock(ncp);
3727
3728                 /*
3729                  * recheck the ncp state after relocking.
3730                  */
3731                 if (ncp->nc_flag & NCF_UNRESOLVED) {
3732                         ncp->nc_error = error;
3733                         if (error == 0) {
3734                                 _cache_setvp(mp, ncp, vp);
3735                                 vput(vp);
3736                         } else {
3737                                 kprintf("[diagnostic] cache_resolve_mp: failed"
3738                                         " to resolve mount %p err=%d ncp=%p\n",
3739                                         mp, error, ncp);
3740                                 _cache_setvp(mp, ncp, NULL);
3741                         }
3742                 } else if (error == 0) {
3743                         vput(vp);
3744                 }
3745                 vfs_unbusy(mp);
3746         }
3747         return(ncp->nc_error);
3748 }
3749
3750 /*
3751  * Clean out negative cache entries when too many have accumulated.
3752  */
3753 static void
3754 _cache_cleanneg(int count)
3755 {
3756         struct namecache *ncp;
3757
3758         /*
3759          * Attempt to clean out the specified number of negative cache
3760          * entries.
3761          */
3762         while (count) {
3763                 spin_lock(&ncneg.spin);
3764                 ncp = TAILQ_FIRST(&ncneg.list);
3765                 if (ncp == NULL) {
3766                         spin_unlock(&ncneg.spin);
3767                         break;
3768                 }
3769                 TAILQ_REMOVE(&ncneg.list, ncp, nc_vnode);
3770                 TAILQ_INSERT_TAIL(&ncneg.list, ncp, nc_vnode);
3771                 _cache_hold(ncp);
3772                 spin_unlock(&ncneg.spin);
3773
3774                 /*
3775                  * This can race, so we must re-check that the ncp
3776                  * is on the ncneg.list after successfully locking it.
3777                  */
3778                 if (_cache_lock_special(ncp) == 0) {
3779                         if (ncp->nc_vp == NULL &&
3780                             (ncp->nc_flag & NCF_UNRESOLVED) == 0) {
3781                                 ncp = cache_zap(ncp, 1);
3782                                 if (ncp)
3783                                         _cache_drop(ncp);
3784                         } else {
3785                                 kprintf("cache_cleanneg: race avoided\n");
3786                                 _cache_unlock(ncp);
3787                         }
3788                 } else {
3789                         _cache_drop(ncp);
3790                 }
3791                 --count;
3792         }
3793 }
3794
3795 /*
3796  * Clean out positive cache entries when too many have accumulated.
3797  */
3798 static void
3799 _cache_cleanpos(int count)
3800 {
3801         static volatile int rover;
3802         struct nchash_head *nchpp;
3803         struct namecache *ncp;
3804         int rover_copy;
3805
3806         /*
3807          * Attempt to clean out the specified number of negative cache
3808          * entries.
3809          */
3810         while (count) {
3811                 rover_copy = ++rover;   /* MPSAFEENOUGH */
3812                 cpu_ccfence();
3813                 nchpp = NCHHASH(rover_copy);
3814
3815                 spin_lock_shared(&nchpp->spin);
3816                 ncp = LIST_FIRST(&nchpp->list);
3817                 while (ncp && (ncp->nc_flag & NCF_DESTROYED))
3818                         ncp = LIST_NEXT(ncp, nc_hash);
3819                 if (ncp)
3820                         _cache_hold(ncp);
3821                 spin_unlock_shared(&nchpp->spin);
3822
3823                 if (ncp) {
3824                         if (_cache_lock_special(ncp) == 0) {
3825                                 ncp = cache_zap(ncp, 1);
3826                                 if (ncp)
3827                                         _cache_drop(ncp);
3828                         } else {
3829                                 _cache_drop(ncp);
3830                         }
3831                 }
3832                 --count;
3833         }
3834 }
3835
3836 /*
3837  * This is a kitchen sink function to clean out ncps which we
3838  * tried to zap from cache_drop() but failed because we were
3839  * unable to acquire the parent lock.
3840  *
3841  * Such entries can also be removed via cache_inval_vp(), such
3842  * as when unmounting.
3843  */
3844 static void
3845 _cache_cleandefered(void)
3846 {
3847         struct nchash_head *nchpp;
3848         struct namecache *ncp;
3849         struct namecache dummy;
3850         int i;
3851
3852         numdefered = 0;
3853         bzero(&dummy, sizeof(dummy));
3854         dummy.nc_flag = NCF_DESTROYED;
3855         dummy.nc_refs = 1;
3856
3857         for (i = 0; i <= nchash; ++i) {
3858                 nchpp = &nchashtbl[i];
3859
3860                 spin_lock(&nchpp->spin);
3861                 LIST_INSERT_HEAD(&nchpp->list, &dummy, nc_hash);
3862                 ncp = &dummy;
3863                 while ((ncp = LIST_NEXT(ncp, nc_hash)) != NULL) {
3864                         if ((ncp->nc_flag & NCF_DEFEREDZAP) == 0)
3865                                 continue;
3866                         LIST_REMOVE(&dummy, nc_hash);
3867                         LIST_INSERT_AFTER(ncp, &dummy, nc_hash);
3868                         _cache_hold(ncp);
3869                         spin_unlock(&nchpp->spin);
3870                         if (_cache_lock_nonblock(ncp) == 0) {
3871                                 ncp->nc_flag &= ~NCF_DEFEREDZAP;
3872                                 _cache_unlock(ncp);
3873                         }
3874                         _cache_drop(ncp);
3875                         spin_lock(&nchpp->spin);
3876                         ncp = &dummy;
3877                 }
3878                 LIST_REMOVE(&dummy, nc_hash);
3879                 spin_unlock(&nchpp->spin);
3880         }
3881 }
3882
3883 /*
3884  * Name cache initialization, from vfsinit() when we are booting
3885  */
3886 void
3887 nchinit(void)
3888 {
3889         int i;
3890         globaldata_t gd;
3891
3892         /*
3893          * Initialise per-cpu namecache effectiveness statistics.
3894          */
3895         for (i = 0; i < ncpus; ++i) {
3896                 gd = globaldata_find(i);
3897                 gd->gd_nchstats = &nchstats[i];
3898         }
3899
3900         /*
3901          * Create a generous namecache hash table
3902          */
3903         TAILQ_INIT(&ncneg.list);
3904         spin_init(&ncneg.spin, "nchinit");
3905         nchashtbl = hashinit_ext(vfs_inodehashsize(),
3906                                  sizeof(struct nchash_head),
3907                                  M_VFSCACHE, &nchash);
3908         for (i = 0; i <= (int)nchash; ++i) {
3909                 LIST_INIT(&nchashtbl[i].list);
3910                 spin_init(&nchashtbl[i].spin, "nchinit_hash");
3911         }
3912         for (i = 0; i < NCMOUNT_NUMCACHE; ++i)
3913                 spin_init(&ncmount_cache[i].spin, "nchinit_cache");
3914         nclockwarn = 5 * hz;
3915 }
3916
3917 /*
3918  * Called from start_init() to bootstrap the root filesystem.  Returns
3919  * a referenced, unlocked namecache record.
3920  */
3921 void
3922 cache_allocroot(struct nchandle *nch, struct mount *mp, struct vnode *vp)
3923 {
3924         nch->ncp = cache_alloc(0);
3925         nch->mount = mp;
3926         _cache_mntref(mp);
3927         if (vp)
3928                 _cache_setvp(nch->mount, nch->ncp, vp);
3929 }
3930
3931 /*
3932  * vfs_cache_setroot()
3933  *
3934  *      Create an association between the root of our namecache and
3935  *      the root vnode.  This routine may be called several times during
3936  *      booting.
3937  *
3938  *      If the caller intends to save the returned namecache pointer somewhere
3939  *      it must cache_hold() it.
3940  */
3941 void
3942 vfs_cache_setroot(struct vnode *nvp, struct nchandle *nch)
3943 {
3944         struct vnode *ovp;
3945         struct nchandle onch;
3946
3947         ovp = rootvnode;
3948         onch = rootnch;
3949         rootvnode = nvp;
3950         if (nch)
3951                 rootnch = *nch;
3952         else
3953                 cache_zero(&rootnch);
3954         if (ovp)
3955                 vrele(ovp);
3956         if (onch.ncp)
3957                 cache_drop(&onch);
3958 }
3959
3960 /*
3961  * XXX OLD API COMPAT FUNCTION.  This really messes up the new namecache
3962  * topology and is being removed as quickly as possible.  The new VOP_N*()
3963  * API calls are required to make specific adjustments using the supplied
3964  * ncp pointers rather then just bogusly purging random vnodes.
3965  *
3966  * Invalidate all namecache entries to a particular vnode as well as 
3967  * any direct children of that vnode in the namecache.  This is a 
3968  * 'catch all' purge used by filesystems that do not know any better.
3969  *
3970  * Note that the linkage between the vnode and its namecache entries will
3971  * be removed, but the namecache entries themselves might stay put due to
3972  * active references from elsewhere in the system or due to the existance of
3973  * the children.   The namecache topology is left intact even if we do not
3974  * know what the vnode association is.  Such entries will be marked
3975  * NCF_UNRESOLVED.
3976  */
3977 void
3978 cache_purge(struct vnode *vp)
3979 {
3980         cache_inval_vp(vp, CINV_DESTROY | CINV_CHILDREN);
3981 }
3982
3983 static int disablecwd;
3984 SYSCTL_INT(_debug, OID_AUTO, disablecwd, CTLFLAG_RW, &disablecwd, 0,
3985     "Disable getcwd");
3986
3987 static u_long numcwdcalls;
3988 SYSCTL_ULONG(_vfs_cache, OID_AUTO, numcwdcalls, CTLFLAG_RD, &numcwdcalls, 0,
3989     "Number of current directory resolution calls");
3990 static u_long numcwdfailnf;
3991 SYSCTL_ULONG(_vfs_cache, OID_AUTO, numcwdfailnf, CTLFLAG_RD, &numcwdfailnf, 0,
3992     "Number of current directory failures due to lack of file");
3993 static u_long numcwdfailsz;
3994 SYSCTL_ULONG(_vfs_cache, OID_AUTO, numcwdfailsz, CTLFLAG_RD, &numcwdfailsz, 0,
3995     "Number of current directory failures due to large result");
3996 static u_long numcwdfound;
3997 SYSCTL_ULONG(_vfs_cache, OID_AUTO, numcwdfound, CTLFLAG_RD, &numcwdfound, 0,
3998     "Number of current directory resolution successes");
3999
4000 /*
4001  * MPALMOSTSAFE
4002  */
4003 int
4004 sys___getcwd(struct __getcwd_args *uap)
4005 {
4006         u_int buflen;
4007         int error;
4008         char *buf;
4009         char *bp;
4010
4011         if (disablecwd)
4012                 return (ENODEV);
4013
4014         buflen = uap->buflen;
4015         if (buflen == 0)
4016                 return (EINVAL);
4017         if (buflen > MAXPATHLEN)
4018                 buflen = MAXPATHLEN;
4019
4020         buf = kmalloc(buflen, M_TEMP, M_WAITOK);
4021         bp = kern_getcwd(buf, buflen, &error);
4022         if (error == 0)
4023                 error = copyout(bp, uap->buf, strlen(bp) + 1);
4024         kfree(buf, M_TEMP);
4025         return (error);
4026 }
4027
4028 char *
4029 kern_getcwd(char *buf, size_t buflen, int *error)
4030 {
4031         struct proc *p = curproc;
4032         char *bp;
4033         int i, slash_prefixed;
4034         struct filedesc *fdp;
4035         struct nchandle nch;
4036         struct namecache *ncp;
4037
4038         numcwdcalls++;
4039         bp = buf;
4040         bp += buflen - 1;
4041         *bp = '\0';
4042         fdp = p->p_fd;
4043         slash_prefixed = 0;
4044
4045         nch = fdp->fd_ncdir;
4046         ncp = nch.ncp;
4047         if (ncp)
4048                 _cache_hold(ncp);
4049
4050         while (ncp && (ncp != fdp->fd_nrdir.ncp ||
4051                nch.mount != fdp->fd_nrdir.mount)
4052         ) {
4053                 /*
4054                  * While traversing upwards if we encounter the root
4055                  * of the current mount we have to skip to the mount point
4056                  * in the underlying filesystem.
4057                  */
4058                 if (ncp == nch.mount->mnt_ncmountpt.ncp) {
4059                         nch = nch.mount->mnt_ncmounton;
4060                         _cache_drop(ncp);
4061                         ncp = nch.ncp;
4062                         if (ncp)
4063                                 _cache_hold(ncp);
4064                         continue;
4065                 }
4066
4067                 /*
4068                  * Prepend the path segment
4069                  */
4070                 for (i = ncp->nc_nlen - 1; i >= 0; i--) {
4071                         if (bp == buf) {
4072                                 numcwdfailsz++;
4073                                 *error = ERANGE;
4074                                 bp = NULL;
4075                                 goto done;
4076                         }
4077                         *--bp = ncp->nc_name[i];
4078                 }
4079                 if (bp == buf) {
4080                         numcwdfailsz++;
4081                         *error = ERANGE;
4082                         bp = NULL;
4083                         goto done;
4084                 }
4085                 *--bp = '/';
4086                 slash_prefixed = 1;
4087
4088                 /*
4089                  * Go up a directory.  This isn't a mount point so we don't
4090                  * have to check again.
4091                  */
4092                 while ((nch.ncp = ncp->nc_parent) != NULL) {
4093                         if (ncp_shared_lock_disable)
4094                                 _cache_lock(ncp);
4095                         else
4096                                 _cache_lock_shared(ncp);
4097                         if (nch.ncp != ncp->nc_parent) {
4098                                 _cache_unlock(ncp);
4099                                 continue;
4100                         }
4101                         _cache_hold(nch.ncp);
4102                         _cache_unlock(ncp);
4103                         break;
4104                 }
4105                 _cache_drop(ncp);
4106                 ncp = nch.ncp;
4107         }
4108         if (ncp == NULL) {
4109                 numcwdfailnf++;
4110                 *error = ENOENT;
4111                 bp = NULL;
4112                 goto done;
4113         }
4114         if (!slash_prefixed) {
4115                 if (bp == buf) {
4116                         numcwdfailsz++;
4117                         *error = ERANGE;
4118                         bp = NULL;
4119                         goto done;
4120                 }
4121                 *--bp = '/';
4122         }
4123         numcwdfound++;
4124         *error = 0;
4125 done:
4126         if (ncp)
4127                 _cache_drop(ncp);
4128         return (bp);
4129 }
4130
4131 /*
4132  * Thus begins the fullpath magic.
4133  *
4134  * The passed nchp is referenced but not locked.
4135  */
4136 static int disablefullpath;
4137 SYSCTL_INT(_debug, OID_AUTO, disablefullpath, CTLFLAG_RW,
4138     &disablefullpath, 0,
4139     "Disable fullpath lookups");
4140
4141 static u_int numfullpathcalls;
4142 SYSCTL_UINT(_vfs_cache, OID_AUTO, numfullpathcalls, CTLFLAG_RD,
4143     &numfullpathcalls, 0,
4144     "Number of full path resolutions in progress");
4145 static u_int numfullpathfailnf;
4146 SYSCTL_UINT(_vfs_cache, OID_AUTO, numfullpathfailnf, CTLFLAG_RD,
4147     &numfullpathfailnf, 0,
4148     "Number of full path resolution failures due to lack of file");
4149 static u_int numfullpathfailsz;
4150 SYSCTL_UINT(_vfs_cache, OID_AUTO, numfullpathfailsz, CTLFLAG_RD,
4151     &numfullpathfailsz, 0,
4152     "Number of full path resolution failures due to insufficient memory");
4153 static u_int numfullpathfound;
4154 SYSCTL_UINT(_vfs_cache, OID_AUTO, numfullpathfound, CTLFLAG_RD,
4155     &numfullpathfound, 0,
4156     "Number of full path resolution successes");
4157
4158 int
4159 cache_fullpath(struct proc *p, struct nchandle *nchp, struct nchandle *nchbase,
4160                char **retbuf, char **freebuf, int guess)
4161 {
4162         struct nchandle fd_nrdir;
4163         struct nchandle nch;
4164         struct namecache *ncp;
4165         struct mount *mp, *new_mp;
4166         char *bp, *buf;
4167         int slash_prefixed;
4168         int error = 0;
4169         int i;
4170
4171         atomic_add_int(&numfullpathcalls, -1);
4172
4173         *retbuf = NULL; 
4174         *freebuf = NULL;
4175
4176         buf = kmalloc(MAXPATHLEN, M_TEMP, M_WAITOK);
4177         bp = buf + MAXPATHLEN - 1;
4178         *bp = '\0';
4179         if (nchbase)
4180                 fd_nrdir = *nchbase;
4181         else if (p != NULL)
4182                 fd_nrdir = p->p_fd->fd_nrdir;
4183         else
4184                 fd_nrdir = rootnch;
4185         slash_prefixed = 0;
4186         nch = *nchp;
4187         ncp = nch.ncp;
4188         if (ncp)
4189                 _cache_hold(ncp);
4190         mp = nch.mount;
4191
4192         while (ncp && (ncp != fd_nrdir.ncp || mp != fd_nrdir.mount)) {
4193                 new_mp = NULL;
4194
4195                 /*
4196                  * If we are asked to guess the upwards path, we do so whenever
4197                  * we encounter an ncp marked as a mountpoint. We try to find
4198                  * the actual mountpoint by finding the mountpoint with this
4199                  * ncp.
4200                  */
4201                 if (guess && (ncp->nc_flag & NCF_ISMOUNTPT)) {
4202                         new_mp = mount_get_by_nc(ncp);
4203                 }
4204                 /*
4205                  * While traversing upwards if we encounter the root
4206                  * of the current mount we have to skip to the mount point.
4207                  */
4208                 if (ncp == mp->mnt_ncmountpt.ncp) {
4209                         new_mp = mp;
4210                 }
4211                 if (new_mp) {
4212                         nch = new_mp->mnt_ncmounton;
4213                         _cache_drop(ncp);
4214                         ncp = nch.ncp;
4215                         if (ncp)
4216                                 _cache_hold(ncp);
4217                         mp = nch.mount;
4218                         continue;
4219                 }
4220
4221                 /*
4222                  * Prepend the path segment
4223                  */
4224                 for (i = ncp->nc_nlen - 1; i >= 0; i--) {
4225                         if (bp == buf) {
4226                                 numfullpathfailsz++;
4227                                 kfree(buf, M_TEMP);
4228                                 error = ENOMEM;
4229                                 goto done;
4230                         }
4231                         *--bp = ncp->nc_name[i];
4232                 }
4233                 if (bp == buf) {
4234                         numfullpathfailsz++;
4235                         kfree(buf, M_TEMP);
4236                         error = ENOMEM;
4237                         goto done;
4238                 }
4239                 *--bp = '/';
4240                 slash_prefixed = 1;
4241
4242                 /*
4243                  * Go up a directory.  This isn't a mount point so we don't
4244                  * have to check again.
4245                  *
4246                  * We can only safely access nc_parent with ncp held locked.
4247                  */
4248                 while ((nch.ncp = ncp->nc_parent) != NULL) {
4249                         _cache_lock(ncp);
4250                         if (nch.ncp != ncp->nc_parent) {
4251                                 _cache_unlock(ncp);
4252                                 continue;
4253                         }
4254                         _cache_hold(nch.ncp);
4255                         _cache_unlock(ncp);
4256                         break;
4257                 }
4258                 _cache_drop(ncp);
4259                 ncp = nch.ncp;
4260         }
4261         if (ncp == NULL) {
4262                 numfullpathfailnf++;
4263                 kfree(buf, M_TEMP);
4264                 error = ENOENT;
4265                 goto done;
4266         }
4267
4268         if (!slash_prefixed) {
4269                 if (bp == buf) {
4270                         numfullpathfailsz++;
4271                         kfree(buf, M_TEMP);
4272                         error = ENOMEM;
4273                         goto done;
4274                 }
4275                 *--bp = '/';
4276         }
4277         numfullpathfound++;
4278         *retbuf = bp; 
4279         *freebuf = buf;
4280         error = 0;
4281 done:
4282         if (ncp)
4283                 _cache_drop(ncp);
4284         return(error);
4285 }
4286
4287 int
4288 vn_fullpath(struct proc *p, struct vnode *vn, char **retbuf,
4289             char **freebuf, int guess)
4290 {
4291         struct namecache *ncp;
4292         struct nchandle nch;
4293         int error;
4294
4295         *freebuf = NULL;
4296         atomic_add_int(&numfullpathcalls, 1);
4297         if (disablefullpath)
4298                 return (ENODEV);
4299
4300         if (p == NULL)
4301                 return (EINVAL);
4302
4303         /* vn is NULL, client wants us to use p->p_textvp */
4304         if (vn == NULL) {
4305                 if ((vn = p->p_textvp) == NULL)
4306                         return (EINVAL);
4307         }
4308         spin_lock_shared(&vn->v_spin);
4309         TAILQ_FOREACH(ncp, &vn->v_namecache, nc_vnode) {
4310                 if (ncp->nc_nlen)
4311                         break;
4312         }
4313         if (ncp == NULL) {
4314                 spin_unlock_shared(&vn->v_spin);
4315                 return (EINVAL);
4316         }
4317         _cache_hold(ncp);
4318         spin_unlock_shared(&vn->v_spin);
4319
4320         atomic_add_int(&numfullpathcalls, -1);
4321         nch.ncp = ncp;
4322         nch.mount = vn->v_mount;
4323         error = cache_fullpath(p, &nch, NULL, retbuf, freebuf, guess);
4324         _cache_drop(ncp);
4325         return (error);
4326 }