From 97e1874be5c58263639c394e0764b1d163f27327 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 14 Aug 2008 18:25:04 +0000 Subject: [PATCH] DEVEL15-windows-memdump-20080814 LICENSE MIT add locks, waiting lock requests, smb user, smb tid, and cell expiration to the memory dump output (fs memdump) (cherry picked from commit f430aee67c4f3d1f3c644f97c30db081d2a9880f) --- src/WINNT/afsd/cm_cell.c | 4 +- src/WINNT/afsd/cm_scache.c | 30 +++++++-- src/WINNT/afsd/smb.c | 129 +++++++++++++++++++++++++++++++++---- 3 files changed, 145 insertions(+), 18 deletions(-) diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index 128e53ab6..33269c8df 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -448,8 +448,8 @@ int cm_DumpCells(FILE *outputFile, char *cookie, int lock) WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); for (cellp = cm_data.allCellsp; cellp; cellp=cellp->allNextp) { - sprintf(output, "%s cellp=0x%p,name=%s ID=%d flags=0x%x\r\n", - cookie, cellp, cellp->name, cellp->cellID, cellp->flags); + sprintf(output, "%s cellp=0x%p,name=%s ID=%d flags=0x%x timeout=%I64u\r\n", + cookie, cellp, cellp->name, cellp->cellID, cellp->flags, cellp->timeout); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); } diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 5b7b521b5..2179f4491 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -1924,11 +1924,30 @@ int cm_DumpSCache(FILE *outputFile, char *cookie, int lock) for (scp = cm_data.allSCachesp; scp; scp = scp->allNextp) { - sprintf(output, "%s scp=0x%p, fid (cell=%d, volume=%d, vnode=%d, unique=%d) type=%d dv=%I64d len=0x%I64x mp='%s' flags=0x%x cb=0x%x refCount=%u\r\n", + sprintf(output, "%s scp=0x%p, fid (cell=%d, volume=%d, vnode=%d, unique=%d) type=%d dv=%I64d len=0x%I64x mp='%s' Locks (server=0x%x shared=%d excl=%d clnt=%d) flags=0x%x cb=0x%x refCount=%u\r\n", cookie, scp, scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique, - scp->fileType, scp->dataVersion, scp->length.QuadPart, scp->mountPointStringp, scp->flags, - (unsigned long)scp->cbExpires, scp->refCount); + scp->fileType, scp->dataVersion, scp->length.QuadPart, scp->mountPointStringp, + scp->serverLock, scp->sharedLocks, scp->exclusiveLocks, scp->clientLocks, + scp->flags, (unsigned long)scp->cbExpires, scp->refCount); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + if (scp->fileLocksH) { + osi_queue_t *q; + + sprintf(output, " %s - begin dumping all locks\r\n", cookie); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + for (q = scp->fileLocksH; q; q = osi_QNext(q)) { + cm_file_lock_t * lockp = (cm_file_lock_t *)((char *) q - offsetof(cm_file_lock_t, fileq)); + sprintf(output, " %s lockp=0x%p scp=0x%p, cm_userp=0x%p offset=0x%I64x len=0x%08I64x type=0x%x key=0x%I64x flags=0x%x update=0x%I64u\r\n", + cookie, lockp, lockp->scp, lockp->userp, lockp->range.offset, lockp->range.length, + lockp->lockType, lockp->key, lockp->flags, (afs_uint64)lockp->lastUpdate); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + } + + sprintf(output, " %s - done dumping all locks\r\n", cookie); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + } } sprintf(output, "%s - Done dumping all scache.\r\n", cookie); @@ -1948,7 +1967,10 @@ int cm_DumpSCache(FILE *outputFile, char *cookie, int lock) sprintf(output, "%s - Done dumping cm_data.scacheHashTable\r\n", cookie); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); - + + + + if (lock) lock_ReleaseRead(&cm_scacheLock); return (0); diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index cb223b1f2..4ee4b46ee 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -9976,37 +9976,119 @@ void smb_LogPacket(smb_packet_t *packet) int smb_DumpVCP(FILE *outputFile, char *cookie, int lock) { int zilch; - char output[1024]; + char output[4196]; smb_vc_t *vcp; - + smb_username_t *unp; + smb_waitingLockRequest_t *wlrp; + if (lock) lock_ObtainRead(&smb_rctLock); + sprintf(output, "begin dumping smb_username_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + for (unp = usernamesp; unp; unp=unp->nextp) + { + cm_ucell_t *ucellp; + + sprintf(output, "%s -- smb_unp=0x%p, refCount=%d, cm_userp=0x%p, flags=0x%x, logoff=%u, name=%S, machine=%S\r\n", + cookie, unp, unp->refCount, unp->userp, unp->flags, unp->last_logoff_t, + unp->name ? unp->name : _C("NULL"), + unp->machine ? unp->machine : _C("NULL")); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + sprintf(output, " begin dumping cm_ucell_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + for ( ucellp = unp->userp->cellInfop; ucellp; ucellp = ucellp->nextp ) { + sprintf(output, " %s -- ucellp=0x%p, cellp=0x%p, flags=0x%x, tktLen=%04u, kvno=%03u, expires=%I64u, gen=%d, name=%s, cellname=%s\r\n", + cookie, ucellp, ucellp->cellp, ucellp->flags, ucellp->ticketLen, ucellp->kvno, + ucellp->expirationTime, ucellp->gen, + ucellp->userName, + ucellp->cellp->name); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + } + + sprintf(output, " done dumping cm_ucell_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + } + sprintf(output, "done dumping smb_username_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + + sprintf(output, "begin dumping smb_waitingLockRequest_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + + for ( wlrp = smb_allWaitingLocks; wlrp; wlrp = (smb_waitingLockRequest_t *) osi_QNext(&wlrp->q)) { + smb_waitingLock_t *lockp; + + sprintf(output, "%s wlrp=0x%p vcp=0x%p, scp=0x%p, type=0x%x, start_t=0x%I64u msTimeout=0x%x\r\n", + cookie, wlrp, wlrp->vcp, wlrp->scp, wlrp->lockType, wlrp->start_t, wlrp->msTimeout); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + sprintf(output, " begin dumping smb_waitingLock_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + for (lockp = wlrp->locks; lockp; lockp = (smb_waitingLock_t *) osi_QNext(&lockp->q)) { + sprintf(output, " %s -- waitlockp=0x%p lockp=0x%p key=0x%I64x offset=0x%I64x length=0x%I64x state=0x%x\r\n", + cookie, lockp, lockp->lockp, lockp->key, lockp->LOffset.QuadPart, lockp->LLength.QuadPart, lockp->state); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + } + sprintf(output, " done dumping smb_waitingLock_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + } + + sprintf(output, "done dumping smb_waitingLockRequest_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + sprintf(output, "begin dumping smb_vc_t\r\n"); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); for (vcp = smb_allVCsp; vcp; vcp=vcp->nextp) { smb_fid_t *fidp; + smb_tid_t *tidp; + smb_user_t *userp; sprintf(output, "%s vcp=0x%p, refCount=%d, flags=0x%x, vcID=%d, lsn=%d, uidCounter=%d, tidCounter=%d, fidCounter=%d\r\n", cookie, vcp, vcp->refCount, vcp->flags, vcp->vcID, vcp->lsn, vcp->uidCounter, vcp->tidCounter, vcp->fidCounter); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); - sprintf(output, "begin dumping smb_fid_t\r\n"); + sprintf(output, " begin dumping smb_user_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + for (userp = vcp->usersp; userp; userp = userp->nextp) { + sprintf(output, " %s -- smb_userp=0x%p, refCount=%d, uid=%d, vcp=0x%p, unp=0x%p, flags=0x%x, delOk=%d\r\n", + cookie, userp, userp->refCount, userp->userID, userp->vcp, userp->unp, userp->flags, userp->deleteOk); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + } + sprintf(output, " done dumping smb_user_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + sprintf(output, " begin dumping smb_tid_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + for (tidp = vcp->tidsp; tidp; tidp = tidp->nextp) { + sprintf(output, " %s -- smb_tidp=0x%p, refCount=%d, tid=%d, vcp=0x%p, cm_userp=0x%p, flags=0x%x, delOk=%d, path=%S\r\n", + cookie, tidp, tidp->refCount, tidp->tid, tidp->vcp, tidp->userp, tidp->flags, tidp->deleteOk, + tidp->pathname ? tidp->pathname : _C("NULL")); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + } + sprintf(output, " done dumping smb_tid_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + sprintf(output, " begin dumping smb_fid_t\r\n"); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); for (fidp = vcp->fidsp; fidp; fidp = (smb_fid_t *) osi_QNext(&fidp->q)) { - sprintf(output, "%s -- smb_fidp=0x%p, refCount=%d, fid=%d, vcp=0x%p, scp=0x%p, ioctlp=0x%p, NTopen_pathp=%S, NTopen_wholepathp=%S\r\n", - cookie, fidp, fidp->refCount, fidp->fid, fidp->vcp, fidp->scp, fidp->ioctlp, + sprintf(output, " %s -- smb_fidp=0x%p, refCount=%d, fid=%d, vcp=0x%p, scp=0x%p, userp=0x%p, ioctlp=0x%p, flags=0x%x, delOk=%d, NTopen_pathp=%S, NTopen_wholepathp=%S\r\n", + cookie, fidp, fidp->refCount, fidp->fid, fidp->vcp, fidp->scp, fidp->userp, fidp->ioctlp, fidp->flags, fidp->deleteOk, fidp->NTopen_pathp ? fidp->NTopen_pathp : _C("NULL"), fidp->NTopen_wholepathp ? fidp->NTopen_wholepathp : _C("NULL")); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); } - sprintf(output, "done dumping smb_fid_t\r\n"); + sprintf(output, " done dumping smb_fid_t\r\n"); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); } @@ -10019,24 +10101,47 @@ int smb_DumpVCP(FILE *outputFile, char *cookie, int lock) for (vcp = smb_deadVCsp; vcp; vcp=vcp->nextp) { smb_fid_t *fidp; - + smb_tid_t *tidp; + smb_user_t *userp; + sprintf(output, "%s vcp=0x%p, refCount=%d, flags=0x%x, vcID=%d, lsn=%d, uidCounter=%d, tidCounter=%d, fidCounter=%d\r\n", - cookie, vcp, vcp->refCount, vcp->flags, vcp->vcID, vcp->lsn, vcp->uidCounter, vcp->tidCounter, vcp->fidCounter); + cookie, vcp, vcp->refCount, vcp->flags, vcp->vcID, vcp->lsn, vcp->uidCounter, vcp->tidCounter, vcp->fidCounter); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); - sprintf(output, "begin dumping smb_fid_t\r\n"); + sprintf(output, " begin dumping smb_user_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + for (userp = vcp->usersp; userp; userp = userp->nextp) { + sprintf(output, " %s -- smb_userp=0x%p, refCount=%d, uid=%d, vcp=0x%p, unp=0x%p, flags=0x%x, delOk=%d\r\n", + cookie, userp, userp->refCount, userp->userID, userp->vcp, userp->unp, userp->flags, userp->deleteOk); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + } + sprintf(output, " done dumping smb_user_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + sprintf(output, " begin dumping smb_tid_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + for (tidp = vcp->tidsp; tidp; tidp = tidp->nextp) { + sprintf(output, " %s -- smb_tidp=0x%p, refCount=%d, tid=%d, vcp=0x%p, cm_userp=0x%p, flags=0x%x, delOk=%d, path=%S\r\n", + cookie, tidp, tidp->refCount, tidp->tid, tidp->vcp, tidp->userp, tidp->flags, tidp->deleteOk, + tidp->pathname ? tidp->pathname : _C("NULL")); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + } + sprintf(output, " done dumping smb_tid_t\r\n"); + WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); + + sprintf(output, " begin dumping smb_fid_t\r\n"); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); for (fidp = vcp->fidsp; fidp; fidp = (smb_fid_t *) osi_QNext(&fidp->q)) { - sprintf(output, "%s -- smb_fidp=0x%p, refCount=%d, fid=%d, vcp=0x%p, scp=0x%p, ioctlp=0x%p, NTopen_pathp=%S, NTopen_wholepathp=%S\r\n", - cookie, fidp, fidp->refCount, fidp->fid, fidp->vcp, fidp->scp, fidp->ioctlp, + sprintf(output, " %s -- smb_fidp=0x%p, refCount=%d, fid=%d, vcp=0x%p, scp=0x%p, userp=0x%p, ioctlp=0x%p, flags=0x%x, delOk=%d, NTopen_pathp=%S, NTopen_wholepathp=%S\r\n", + cookie, fidp, fidp->refCount, fidp->fid, fidp->vcp, fidp->scp, fidp->userp, fidp->ioctlp, fidp->flags, fidp->deleteOk, fidp->NTopen_pathp ? fidp->NTopen_pathp : _C("NULL"), fidp->NTopen_wholepathp ? fidp->NTopen_wholepathp : _C("NULL")); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); } - sprintf(output, "done dumping smb_fid_t\r\n"); + sprintf(output, " done dumping smb_fid_t\r\n"); WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL); } -- 2.39.5