From b2e3e6427522c92ce4132abf2ca08ce18599b16b Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 28 Mar 2008 14:01:03 +0000 Subject: [PATCH] windows-freelance-20080328 LICENSE MIT 1. return CM_ERROR_NOSUCHFILE when attempting to remove a symlink or mount point that does not exist 2. When adding a new symlink or mountpoint, be sure to increment the number of local mount points 3. When re-initializing the fake root.cell the unique value is always one, not two. Use cm_FidCmp() to compare fids. The use of the value two prevented the invalidation of existing values because all of the directory entries are created with the unique set to one. --- src/WINNT/afsd/cm_freelance.c | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/WINNT/afsd/cm_freelance.c b/src/WINNT/afsd/cm_freelance.c index 8dca8af..276d2fb 100644 --- a/src/WINNT/afsd/cm_freelance.c +++ b/src/WINNT/afsd/cm_freelance.c @@ -257,7 +257,6 @@ void cm_InitFakeRootDir() { curChunk = 13; // stick the first 2 entries "." and ".." in - fakeEntry.fid.unique = htonl(1); fakeEntry.fid.vnode = htonl(1); strcpy(fakeEntry.name, "."); currentPos = cm_FakeRootDir + curPage * CM_DIR_PAGESIZE + curChunk * CM_DIR_CHUNKSIZE; @@ -386,18 +385,14 @@ int cm_reInitLocalMountPoints() { osi_Log0(afsd_logp,"Invalidating local mount point scp... "); - cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, 1, 2); + cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, 1, 1); lock_ObtainWrite(&cm_scacheLock); lock_ObtainMutex(&cm_Freelance_Lock); /* always scache then freelance lock */ for (i=0; inextp) { - if (scp->fid.volume == aFid.volume && - scp->fid.vnode == aFid.vnode && - scp->fid.unique == aFid.unique - ) { - + if (cm_FidCmp(&scp->fid, &aFid) == 0) { // mark the scp to be reused cm_HoldSCacheNoLock(scp); lock_ReleaseWrite(&cm_scacheLock); @@ -422,7 +417,7 @@ int cm_reInitLocalMountPoints() { } } } - cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, aFid.vnode + 1, 2); + cm_SetFid(&aFid, AFS_FAKE_ROOT_CELL_ID, AFS_FAKE_ROOT_VOL_ID, aFid.vnode + 1, 1); } lock_ReleaseWrite(&cm_scacheLock); osi_Log0(afsd_logp,"\tall old scp cleared!"); @@ -1070,7 +1065,7 @@ long cm_FreelanceAddMount(char *filename, char *cellname, char *volume, int rw, /* cm_reInitLocalMountPoints(); */ if (fidp) - cm_SetFid(fidp, fidp->cell, fidp->volume, cm_noLocalMountPoints + 1, 1); + cm_SetFid(fidp, fidp->cell, fidp->volume, ++cm_noLocalMountPoints, 1); cm_noteLocalMountPointChange(); return 0; } @@ -1126,6 +1121,7 @@ long cm_FreelanceRemoveMount(char *toremove) if (!strcmp(shortname, toremove)) { RegDeleteValue( hkFreelance, szValueName ); + found = 1; break; } } @@ -1167,16 +1163,18 @@ long cm_FreelanceRemoveMount(char *toremove) fclose(fp1); fclose(fp2); - if (!found) - return CM_ERROR_NOSUCHFILE; - - unlink(hfile); - rename(hfile2, hfile); + if (found) { + unlink(hfile); + rename(hfile2, hfile); + } } lock_ReleaseMutex(&cm_Freelance_Lock); - cm_noteLocalMountPointChange(); - return 0; + if (found) { + cm_noteLocalMountPointChange(); + return 0; + } else + return CM_ERROR_NOSUCHFILE; } long cm_FreelanceAddSymlink(char *filename, char *destination, cm_fid_t *fidp) @@ -1274,7 +1272,7 @@ long cm_FreelanceAddSymlink(char *filename, char *destination, cm_fid_t *fidp) /* cm_reInitLocalMountPoints(); */ if (fidp) - cm_SetFid(fidp, fidp->cell, fidp->volume, cm_noLocalMountPoints + 1, 1); + cm_SetFid(fidp, fidp->cell, fidp->volume, ++cm_noLocalMountPoints, 1); cm_noteLocalMountPointChange(); return 0; } @@ -1325,6 +1323,7 @@ long cm_FreelanceRemoveSymlink(char *toremove) if (!strcmp(shortname, toremove)) { RegDeleteValue( hkFreelanceSymlinks, szValueName ); + found = 1; break; } } @@ -1332,7 +1331,10 @@ long cm_FreelanceRemoveSymlink(char *toremove) } lock_ReleaseMutex(&cm_Freelance_Lock); - cm_noteLocalMountPointChange(); - return 0; + if (found) { + cm_noteLocalMountPointChange(); + return 0; + } else + return CM_ERROR_NOSUCHFILE; } #endif /* AFS_FREELANCE_CLIENT */ -- 1.9.4