fidp->refCount++;
}
+
+/* smb_ReleaseFID cannot be called while an cm_scache_t mutex lock is held */
+/* the sm_fid_t->mx and smb_rctLock must not be held */
void smb_ReleaseFID(smb_fid_t *fidp)
{
cm_scache_t *scp = NULL;
vcp = fidp->vcp;
fidp->vcp = NULL;
scp = fidp->scp; /* release after lock is released */
- if (scp) {
- lock_ObtainMutex(&scp->mx);
- scp->flags &= ~CM_SCACHEFLAG_SMB_FID;
- lock_ReleaseMutex(&scp->mx);
- osi_Log2(afsd_logp,"smb_ReleaseFID fidp 0x%p scp 0x%p", fidp, scp);
- fidp->scp = NULL;
- }
+ if (scp) {
+ lock_ObtainMutex(&scp->mx);
+ scp->flags &= ~CM_SCACHEFLAG_SMB_FID;
+ lock_ReleaseMutex(&scp->mx);
+ osi_Log2(afsd_logp,"smb_ReleaseFID fidp 0x%p scp 0x%p", fidp, scp);
+ fidp->scp = NULL;
+ }
userp = fidp->userp;
fidp->userp = NULL;
cm_user_t *userp;
cm_space_t *spacep;
cm_scache_t *scp, *dscp;
+ int scp_mx_held = 0;
int delonclose = 0;
long code = 0;
char *pathp;
#endif /* DFS_SUPPORT */
lock_ObtainMutex(&scp->mx);
+ scp_mx_held = 1;
code = cm_SyncOp(scp, NULL, userp, &req, 0,
CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
if (code) goto done;
if (fidp) {
lock_ReleaseMutex(&scp->mx);
+ scp_mx_held = 0;
lock_ObtainMutex(&fidp->mx);
- lock_ObtainMutex(&scp->mx);
delonclose = fidp->flags & SMB_FID_DELONCLOSE;
lock_ReleaseMutex(&fidp->mx);
smb_ReleaseFID(fidp);
/* send and free the packets */
done:
- lock_ReleaseMutex(&scp->mx);
+ if (scp_mx_held)
+ lock_ReleaseMutex(&scp->mx);
cm_ReleaseSCache(scp);
cm_ReleaseUser(userp);
if (code == 0) {
fidp = smb_FindFIDByScache(vcp, scp);
if (!fidp) {
- cm_ReleaseUser(userp);
cm_ReleaseSCache(scp);
+ cm_ReleaseUser(userp);
smb_SendTran2Error(vcp, p, opx, code);
return 0;
}
lock_ObtainMutex(&fidp->mx);
if (!(fidp->flags & SMB_FID_OPENWRITE)) {
lock_ReleaseMutex(&fidp->mx);
+ cm_ReleaseSCache(scp);
smb_ReleaseFID(fidp);
cm_ReleaseUser(userp);
- cm_ReleaseSCache(scp);
smb_SendTran2Error(vcp, p, opx, CM_ERROR_NOACCESS);
return 0;
}
smb_SetSMBDataLength(outp, 0);
done:
- smb_ReleaseFID(fidp);
cm_ReleaseUser(userp);
+ smb_ReleaseFID(fidp);
return code;
}
smb_SetSMBParm(outp, 5, finalCount);
smb_SetSMBDataLength(outp, finalCount);
- smb_ReleaseFID(fidp);
-
cm_ReleaseUser(userp);
+ smb_ReleaseFID(fidp);
return code;
}
treeStartp = realPathp + (tp - spacep->data);
if (*tp && !smb_IsLegalFilename(tp)) {
+ cm_ReleaseUser(userp);
if (baseFidp)
smb_ReleaseFID(baseFidp);
- cm_ReleaseUser(userp);
free(realPathp);
if (scp)
cm_ReleaseSCache(scp);
lock_ReleaseMutex(&scp->mx);
if (code) {
- /* shouldn't this be smb_CloseFID() fidp->flags = SMB_FID_DELETE; */
- smb_CloseFID(vcp, fidp, NULL, 0);
- smb_ReleaseFID(fidp);
-
cm_ReleaseSCache(scp);
if (dscp)
cm_ReleaseSCache(dscp);
cm_ReleaseUser(userp);
+ /* shouldn't this be smb_CloseFID() fidp->flags = SMB_FID_DELETE; */
+ smb_CloseFID(vcp, fidp, NULL, 0);
+ smb_ReleaseFID(fidp);
free(realPathp);
-
return code;
}
}
osi_Log2(smb_logp, "SMB NT CreateX opening fid %d path %s", fidp->fid,
osi_LogSaveString(smb_logp, realPathp));
- smb_ReleaseFID(fidp);
-
cm_ReleaseUser(userp);
+ smb_ReleaseFID(fidp);
/* Can't free realPathp if we get here since
fidp->NTopen_wholepathp is pointing there */
lock_ReleaseMutex(&scp->mx);
if (code) {
+ cm_ReleaseSCache(scp);
+ cm_ReleaseUser(userp);
/* Shouldn't this be smb_CloseFID()? fidp->flags = SMB_FID_DELETE; */
smb_CloseFID(vcp, fidp, NULL, 0);
smb_ReleaseFID(fidp);
-
- cm_ReleaseSCache(scp);
- cm_ReleaseUser(userp);
free(realPathp);
-
return CM_ERROR_SHARING_VIOLATION;
}
}
osi_Log1(smb_logp, "SMB NTTranCreate opening fid %d", fidp->fid);
- smb_ReleaseFID(fidp);
-
cm_ReleaseUser(userp);
+ smb_ReleaseFID(fidp);
/* free(realPathp); Can't free realPathp here because fidp->NTopen_wholepathp points there */
/* leave scp held since we put it in fidp->scp */