From 0ca9a136a79d78a81fb6a2e941b2a6feef0d4952 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 24 Jul 2008 18:54:53 +0000 Subject: [PATCH] windows-cm-makedir-20080724 LICENSE MIT Extend the cm_MakeDir() function signature to permit the (optional) return of the cm_scache_t object that was created by the operation in the same way that cm_Create() does. Make the return of the cm_scache_t by cm_Create() optional although it is never used that way. In both cm_Create() and cm_MakeDir() avoid releasing the cm_scache_t object until we are actually finished with it. --- src/WINNT/afsd/cm_vnodeops.c | 17 ++++++++++++++--- src/WINNT/afsd/cm_vnodeops.h | 3 ++- src/WINNT/afsd/smb.c | 2 +- src/WINNT/afsd/smb3.c | 4 ++-- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index 189c1af76..0ba90caf3 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -2701,7 +2701,6 @@ long cm_Create(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t *a didEnd = 1; } lock_ReleaseWrite(&scp->rw); - *scpp = scp; } } @@ -2720,6 +2719,12 @@ long cm_Create(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t *a if (fnamep) free(fnamep); + if (scp) { + if (scpp) + *scpp = scp; + else + cm_ReleaseSCache(scp); + } return code; } @@ -2747,7 +2752,7 @@ long cm_FSync(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp) } long cm_MakeDir(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t *attrp, - cm_user_t *userp, cm_req_t *reqp) + cm_user_t *userp, cm_req_t *reqp, cm_scache_t **scpp) { cm_conn_t *connp; long code; @@ -2860,7 +2865,6 @@ long cm_MakeDir(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t * didEnd = 1; } lock_ReleaseWrite(&scp->rw); - cm_ReleaseSCache(scp); } } @@ -2878,6 +2882,13 @@ long cm_MakeDir(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t * free(fnamep); + if (scp) { + if (scpp) + *scpp = scp; + else + cm_ReleaseSCache(scp); + } + /* and return error code */ return code; } diff --git a/src/WINNT/afsd/cm_vnodeops.h b/src/WINNT/afsd/cm_vnodeops.h index 8fcd51f55..1b780c6e2 100644 --- a/src/WINNT/afsd/cm_vnodeops.h +++ b/src/WINNT/afsd/cm_vnodeops.h @@ -124,7 +124,8 @@ extern long cm_ApplyDir(cm_scache_t *scp, cm_DirFuncp_t funcp, void *parmp, cm_scache_t **retscp); extern long cm_MakeDir(cm_scache_t *dscp, clientchar_t *lastNamep, long flags, - cm_attr_t *attrp, cm_user_t *userp, cm_req_t *reqp); + cm_attr_t *attrp, cm_user_t *userp, cm_req_t *reqp, + cm_scache_t **scpp); extern long cm_RemoveDir(cm_scache_t *dscp, fschar_t *lastNamep, clientchar_t *originalNamep, cm_user_t *userp, cm_req_t *reqp); diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 4b270a7e7..6005d9f37 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -7417,7 +7417,7 @@ long smb_ReceiveCoreMakeDir(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp setAttr.mask = CM_ATTRMASK_CLIENTMODTIME; setAttr.clientModTime = time(NULL); - code = cm_MakeDir(dscp, lastNamep, 0, &setAttr, userp, &req); + code = cm_MakeDir(dscp, lastNamep, 0, &setAttr, userp, &req, NULL); if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) smb_NotifyChange(FILE_ACTION_ADDED, FILE_NOTIFY_CHANGE_DIR_NAME, diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index 3744bce5d..5974819a7 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -7201,7 +7201,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) continue; /* the supplied path can't have consecutive slashes either , but */ /* cp is the next component to be created. */ - code = cm_MakeDir(tscp1, cp, 0, &setAttr, userp, &req); + code = cm_MakeDir(tscp1, cp, 0, &setAttr, userp, &req, NULL); if (code == 0 && (tscp1->flags & CM_SCACHEFLAG_ANYWATCH)) smb_NotifyChange(FILE_ACTION_ADDED, FILE_NOTIFY_CHANGE_DIR_NAME, @@ -7897,7 +7897,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out openAction = 2; /* created directory */ setAttr.mask = CM_ATTRMASK_CLIENTMODTIME; setAttr.clientModTime = time(NULL); - code = cm_MakeDir(dscp, lastNamep, 0, &setAttr, userp, &req); + code = cm_MakeDir(dscp, lastNamep, 0, &setAttr, userp, &req, NULL); if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) smb_NotifyChange(FILE_ACTION_ADDED, FILE_NOTIFY_CHANGE_DIR_NAME, -- 2.39.5