From 532bc6e84c47a7c54cd3d900c74145c3dd23ee44 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 16 Feb 2006 22:06:02 +0000 Subject: [PATCH] windows-optimize-find-uid-20060216 Rename smb_GetUser to smb_GetUserFromVCP and add smb_GetUserFromUID. Use calls to smb_GetUserFromUID to reduce the number of times that the smb_user_t object is obtained and released during the processing of an smb call. --- src/WINNT/afsd/smb.c | 68 ++++++++++++++++++++++---------------- src/WINNT/afsd/smb.h | 4 ++- src/WINNT/afsd/smb3.c | 29 +++++++--------- src/WINNT/afsd/smb_ioctl.c | 9 +++-- 4 files changed, 59 insertions(+), 51 deletions(-) diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 9d04c4afb..349e24bdf 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -1279,11 +1279,29 @@ void smb_ReleaseUID(smb_user_t *uidp) } } +cm_user_t *smb_GetUserFromUID(smb_user_t *uidp) +{ + cm_user_t *up = NULL; + + if (!uidp) + return NULL; + + lock_ObtainMutex(&uidp->mx); + if (uidp->unp) { + up = uidp->unp->userp; + cm_HoldUser(up); + } + lock_ReleaseMutex(&uidp->mx); + + return up; +} + + /* retrieve a held reference to a user structure corresponding to an incoming * request. * corresponding release function is cm_ReleaseUser. */ -cm_user_t *smb_GetUser(smb_vc_t *vcp, smb_packet_t *inp) +cm_user_t *smb_GetUserFromVCP(smb_vc_t *vcp, smb_packet_t *inp) { smb_user_t *uidp; cm_user_t *up = NULL; @@ -1294,12 +1312,7 @@ cm_user_t *smb_GetUser(smb_vc_t *vcp, smb_packet_t *inp) if (!uidp) return NULL; - lock_ObtainMutex(&uidp->mx); - if (uidp->unp) { - up = uidp->unp->userp; - cm_HoldUser(up); - } - lock_ReleaseMutex(&uidp->mx); + up = smb_GetUserFromUID(uidp); smb_ReleaseUID(uidp); return up; @@ -2951,7 +2964,7 @@ long smb_ReceiveCoreReadRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp } lock_ReleaseMutex(&fidp->mx); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); #ifndef DJGPP code = smb_ReadData(fidp, &offset, count, rawBuf, userp, &finalCount); @@ -3534,14 +3547,13 @@ long smb_ReceiveCoreTreeConnect(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t * return CM_ERROR_BADSMB; strcpy(shareName, tp+1); - userp = smb_GetUser(vcp, inp); - lock_ObtainMutex(&vcp->mx); newTid = vcp->tidCounter++; lock_ReleaseMutex(&vcp->mx); tidp = smb_FindTID(vcp, newTid, SMB_FLAG_CREATE); uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); + userp = smb_GetUserFromUID(uidp); shareFound = smb_FindShare(vcp, uidp, shareName, &sharePath); if (uidp) smb_ReleaseUID(uidp); @@ -3960,7 +3972,7 @@ long smb_ReceiveCoreSearchDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou osi_Log3(smb_logp, "SMB search dir cookie 0x%x, connection %d, attr 0x%x", nextCookie, dsp->cookie, attribute); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); /* try to get the vnode for the path name next */ lock_ObtainMutex(&dsp->mx); @@ -4392,7 +4404,7 @@ long smb_ReceiveCoreCheckPath(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou rootScp = cm_data.rootSCachep; - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); caseFold = CM_FLAG_CASEFOLD; @@ -4476,7 +4488,7 @@ long smb_ReceiveCoreSetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_pack rootScp = cm_data.rootSCachep; - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); caseFold = CM_FLAG_CASEFOLD; @@ -4589,7 +4601,7 @@ long smb_ReceiveCoreGetFileAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_pack rootScp = cm_data.rootSCachep; - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); /* we shouldn't need this for V3 requests, but we seem to */ caseFold = CM_FLAG_CASEFOLD; @@ -4793,7 +4805,7 @@ long smb_ReceiveCoreOpen(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) return 0; } - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); caseFold = CM_FLAG_CASEFOLD; @@ -4966,7 +4978,7 @@ long smb_ReceiveCoreUnlink(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) spacep = inp->spacep; smb_StripLastComponent(spacep->data, &lastNamep, pathp); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); caseFold = CM_FLAG_FOLLOW | CM_FLAG_CASEFOLD; @@ -5105,7 +5117,7 @@ smb_Rename(smb_vc_t *vcp, smb_packet_t *inp, char * oldPathp, char * newPathp, i DWORD filter; cm_req_t req; - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); if (code) { cm_ReleaseUser(userp); @@ -5283,7 +5295,7 @@ smb_Link(smb_vc_t *vcp, smb_packet_t *inp, char * oldPathp, char * newPathp) DWORD filter; cm_req_t req; - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); if (code) { @@ -5513,7 +5525,7 @@ long smb_ReceiveCoreRemoveDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *ou spacep = inp->spacep; smb_StripLastComponent(spacep->data, &lastNamep, pathp); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); caseFold = CM_FLAG_CASEFOLD; @@ -5601,7 +5613,7 @@ long smb_ReceiveCoreFlush(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) } lock_ReleaseMutex(&fidp->mx); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); lock_ObtainMutex(&fidp->mx); if (fidp->flags & SMB_FID_OPENWRITE) @@ -5816,7 +5828,7 @@ long smb_ReceiveCoreClose(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) return CM_ERROR_BADFD; } - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); code = smb_CloseFID(vcp, fidp, userp, dosTime); @@ -6266,7 +6278,7 @@ long smb_ReceiveCoreWrite(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) return code; } lock_ReleaseMutex(&fidp->mx); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); /* special case: 0 bytes transferred means truncate to this position */ if (count == 0) { @@ -6373,7 +6385,7 @@ void smb_CompleteWriteRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp, osi_Log2(smb_logp, "Completing Raw Write offset %x count %x", rwcp->offset.LowPart, rwcp->count); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); #ifndef DJGPP rawBuf = rwcp->buf; @@ -6485,7 +6497,7 @@ long smb_ReceiveCoreWriteRaw(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out } } - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); /* * Work around bug in NT client @@ -6629,7 +6641,7 @@ long smb_ReceiveCoreRead(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) return code; } - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); /* remember this for final results */ smb_SetSMBParm(outp, 0, count); @@ -6703,7 +6715,7 @@ long smb_ReceiveCoreMakeDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp spacep = inp->spacep; smb_StripLastComponent(spacep->data, &lastNamep, pathp); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); caseFold = CM_FLAG_CASEFOLD; @@ -6827,7 +6839,7 @@ long smb_ReceiveCoreCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) spacep = inp->spacep; smb_StripLastComponent(spacep->data, &lastNamep, pathp); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); caseFold = CM_FLAG_CASEFOLD; @@ -7003,7 +7015,7 @@ long smb_ReceiveCoreSeek(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) } lock_ReleaseMutex(&fidp->mx); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); lock_ObtainMutex(&fidp->mx); scp = fidp->scp; diff --git a/src/WINNT/afsd/smb.h b/src/WINNT/afsd/smb.h index d2ebb5e3c..7537bae8a 100644 --- a/src/WINNT/afsd/smb.h +++ b/src/WINNT/afsd/smb.h @@ -530,7 +530,9 @@ extern void smb_HoldUIDNoLock(smb_user_t *uidp); extern void smb_ReleaseUID(smb_user_t *uidp); -extern cm_user_t *smb_GetUser(smb_vc_t *vcp, smb_packet_t *inp); +extern cm_user_t *smb_GetUserFromVCP(smb_vc_t *vcp, smb_packet_t *inp); + +extern cm_user_t *smb_GetUserFromUID(smb_user_t *uidp); extern long smb_LookupTIDPath(smb_vc_t *vcp, unsigned short tid, char ** tidPathp); diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index 8c0395b23..090ff853f 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -52,12 +52,7 @@ cm_user_t *smb_GetTran2User(smb_vc_t *vcp, smb_tran2Packet_t *inp) if (!uidp) return NULL; - lock_ObtainMutex(&uidp->mx); - if (uidp->unp) { - up = uidp->unp->userp; - cm_HoldUser(up); - } - lock_ReleaseMutex(&uidp->mx); + up = smb_GetUserFromUID(uidp); smb_ReleaseUID(uidp); @@ -1022,7 +1017,8 @@ long smb_ReceiveV3TreeConnectX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *o #endif } - userp = smb_GetUser(vcp, inp); + uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); + userp = smb_GetUserFromUID(uidp); lock_ObtainMutex(&vcp->mx); newTid = vcp->tidCounter++; @@ -1031,11 +1027,9 @@ long smb_ReceiveV3TreeConnectX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *o tidp = smb_FindTID(vcp, newTid, SMB_FLAG_CREATE); if (!ipc) { - uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); shareFound = smb_FindShare(vcp, uidp, shareName, &sharePath); - if (uidp) - smb_ReleaseUID(uidp); if (!shareFound) { + smb_ReleaseUID(uidp); smb_ReleaseTID(tidp); return CM_ERROR_BADSHARENAME; } @@ -1053,6 +1047,7 @@ long smb_ReceiveV3TreeConnectX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *o smb_SetSMBParm(outp, 2, 0); sharePath = NULL; } + smb_ReleaseUID(uidp); lock_ObtainMutex(&tidp->mx); tidp->userp = userp; @@ -4595,7 +4590,7 @@ long smb_ReceiveV3OpenX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) free(hexp); } #endif - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); dscp = NULL; code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &tidPathp); @@ -4868,7 +4863,7 @@ long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) /* set inp->fid so that later read calls in same msg can find fid */ inp->fid = fid; - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); scp = fidp->scp; @@ -5102,7 +5097,7 @@ long smb_ReceiveV3GetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t * } lock_ReleaseMutex(&fidp->mx); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); scp = fidp->scp; @@ -5173,7 +5168,7 @@ long smb_ReceiveV3SetAttributes(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t * } lock_ReleaseMutex(&fidp->mx); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); scp = fidp->scp; @@ -5263,7 +5258,7 @@ long smb_ReceiveV3ReadX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) } lock_ReleaseMutex(&fidp->mx); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); /* 0 and 1 are reserved for request chaining, were setup by our caller, * and will be further filled in after we return. @@ -5489,7 +5484,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) } #endif - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); if (!userp) { osi_Log1(smb_logp, "NTCreateX Invalid user [%d]", ((smb_t *) inp)->uid); free(realPathp); @@ -6225,7 +6220,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out } #endif - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); if (!userp) { osi_Log1(smb_logp, "NTTranCreate invalid user [%d]", ((smb_t *) inp)->uid); free(realPathp); diff --git a/src/WINNT/afsd/smb_ioctl.c b/src/WINNT/afsd/smb_ioctl.c index 869738ef9..1b4690ddf 100644 --- a/src/WINNT/afsd/smb_ioctl.c +++ b/src/WINNT/afsd/smb_ioctl.c @@ -190,7 +190,7 @@ long smb_IoctlRead(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, iop = fidp->ioctlp; count = smb_GetSMBParm(inp, 1); - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); /* Identify tree */ code = smb_LookupTIDPath(vcp, ((smb_t *)inp)->tid, &iop->tidPathp); @@ -290,10 +290,9 @@ long smb_IoctlV3Read(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, smb_pack iop = fidp->ioctlp; count = smb_GetSMBParm(inp, 5); - userp = smb_GetUser(vcp, inp); - osi_assert(userp != 0); - uidp = smb_FindUID(vcp, ((smb_t *)inp)->uid, 0); + userp = smb_GetUserFromUID(uidp); + osi_assert(userp != 0); iop->uidp = uidp; if (uidp && uidp->unp) { osi_Log3(afsd_logp, "Ioctl uid %d user %x name %s", @@ -391,7 +390,7 @@ long smb_IoctlReadRaw(smb_fid_t *fidp, smb_vc_t *vcp, smb_packet_t *inp, iop = fidp->ioctlp; - userp = smb_GetUser(vcp, inp); + userp = smb_GetUserFromVCP(vcp, inp); /* Log the user */ { -- 2.39.5