-/*
- * NFSTRACE points were changed to FSDBG (KERNEL_DEBUG)
- * But some of this code may prove useful someday...
- */
-#undef NFSDIAG
-#if NFSDIAG
-int nfstraceindx = 0;
-struct nfstracerec nfstracebuf[NFSTBUFSIZ] = {{0,0,0,0}};
-
-#define NFSTRACESUSPENDERS
-#ifdef NFSTRACESUSPENDERS
-uint nfstracemask = 0xfff00200;
-int nfstracexid = -1;
-uint onfstracemask = 0;
-int nfstracesuspend = -1;
-#define NFSTRACE_SUSPEND \
- { \
- if (nfstracemask) { \
- onfstracemask = nfstracemask; \
- nfstracemask = 0; \
- } \
- }
-#define NFSTRACE_RESUME \
- { \
- nfstracesuspend = -1; \
- if (!nfstracemask) \
- nfstracemask = onfstracemask; \
- }
-#define NFSTRACE_STARTSUSPENDCOUNTDOWN \
- { \
- nfstracesuspend = (nfstraceindx+100) % NFSTBUFSIZ; \
- }
-#define NFSTRACE_SUSPENDING (nfstracesuspend != -1)
-#define NFSTRACE_SUSPENSEOVER \
- (nfstracesuspend > 100 ? \
- (nfstraceindx >= nfstracesuspend || \
- nfstraceindx < nfstracesuspend - 100) : \
- (nfstraceindx >= nfstracesuspend && \
- nfstraceindx < nfstracesuspend + 8192 - 100))
-#else
-uint nfstracemask = 0;
-#endif /* NFSTRACESUSPENDERS */
-
-int nfsprnttimo = 1;
-
-int nfsodata[1024];
-int nfsoprocnum, nfsolen;
-int nfsbt[32], nfsbtlen;
-
-#if defined(__ppc__)
-int
-backtrace(int *where, int size)
-{
- int register sp, *fp, numsaved;
-
- __asm__ volatile("mr %0,r1" : "=r" (sp));
-
- fp = (int *)*((int *)sp);
- size /= sizeof(int);
- for (numsaved = 0; numsaved < size; numsaved++) {
- *where++ = fp[2];
- if ((int)fp <= 0)
- break;
- fp = (int *)*fp;
- }
- return (numsaved);
-}
-#elif defined(__i386__)
-int
-backtrace()
-{
- return (0); /* Till someone implements a real routine */
-}
-#else
-#error architecture not implemented.
-#endif
-
-void
-nfsdup(struct nfsreq *rep)
-{
- int *ip, i, first = 1, end;
- char *s, b[240];
- struct mbuf *mb;
-
- if ((nfs_debug & NFS_DEBUG_DUP) == 0)
- return;
- /* last mbuf in chain will be nfs content */
- for (mb = rep->r_mreq; mb->m_next; mb = mb->m_next)
- ;
- if (rep->r_procnum == nfsoprocnum && mb->m_len == nfsolen &&
- !bcmp((caddr_t)nfsodata, mb->m_data, nfsolen)) {
- s = b + sprintf(b, "nfsdup x=%x p=%d h=", rep->r_xid,
- rep->r_procnum);
- end = (int)(VTONFS(rep->r_vp)->n_fhp);
- ip = (int *)(end & ~3);
- end += VTONFS(rep->r_vp)->n_fhsize;
- while ((int)ip < end) {
- i = *ip++;
- if (first) { /* avoid leading zeroes */
- if (i == 0)
- continue;
- first = 0;
- s += sprintf(s, "%x", i);
- } else
- s += sprintf(s, "%08x", i);
- }
- if (first)
- sprintf(s, "%x", 0);
- else /* eliminate trailing zeroes */
- while (*--s == '0')
- *s = 0;
- /*
- * set a breakpoint here and you can view the
- * current backtrace and the one saved in nfsbt
- */
- kprintf("%s\n", b);
- }
- nfsoprocnum = rep->r_procnum;
- nfsolen = mb->m_len;
- bcopy(mb->m_data, (caddr_t)nfsodata, mb->m_len);
- nfsbtlen = backtrace(&nfsbt, sizeof(nfsbt));
-}
-#endif /* NFSDIAG */
-