X-Git-Url: https://git.openafs.org/?p=openafs.git;a=blobdiff_plain;f=src%2FWINNT%2Fafsrdr%2Fuser%2FRDRFunction.c;h=0ecfdaea3c9987ea92070cbfdc4fe41f6cbcf373;hp=fca4332f9557f49cc2b35e0afa342893abf64bd3;hb=2632c3f459dc47946b2e973c045056c3dca719f2;hpb=6c73b8350a4bc67db271a5294c5fdf1e51e9033a diff --git a/src/WINNT/afsrdr/user/RDRFunction.c b/src/WINNT/afsrdr/user/RDRFunction.c index fca4332..0ecfdae 100644 --- a/src/WINNT/afsrdr/user/RDRFunction.c +++ b/src/WINNT/afsrdr/user/RDRFunction.c @@ -2327,6 +2327,37 @@ RDR_DeleteFileEntry( IN cm_user_t *userp, return; } + if (scp->fileType == CM_SCACHETYPE_DIRECTORY) { + cm_dirOp_t dirop; + + lock_ReleaseWrite(&scp->rw); + + code = cm_BeginDirOp(scp, userp, &req, CM_DIRLOCK_READ, + CM_DIROP_FLAG_NONE, &dirop); + if (code == 0) { + /* is the directory empty? if not, CM_ERROR_NOTEMPTY */ + afs_uint32 bEmpty; + + code = cm_BPlusDirIsEmpty(&dirop, &bEmpty); + if (code == 0 && !bEmpty) + code = CM_ERROR_NOTEMPTY; + + cm_EndDirOp(&dirop); + } + + if (code) { + smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE); + (*ResultCB)->ResultStatus = status; + (*ResultCB)->ResultBufferLength = 0; + cm_ReleaseSCache(scp); + cm_ReleaseSCache(dscp); + osi_Log3(afsd_logp, "RDR_DeleteFileEntry cm_SyncOp failure scp=0x%p code=0x%x status=0x%x", + scp, code, status); + return; + } + lock_ObtainWrite(&scp->rw); + } + if (!bCheckOnly) { /* Drop all locks since the file is being deleted */ code = cm_SyncOp(scp, NULL, userp, &req, 0,