From c8d8ea2e30c573a45ae9c465c5cbfda77b9c4a42 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Mon, 7 Apr 2008 06:48:19 +0000 Subject: [PATCH] DEVEL15-windows-freelance-20080407 LICENSE MIT When freelance symlinks and mountpoints were modified the target string value was not being updated and the old data was not being invalidated. (cherry picked from commit a642541b960f601d7396c28ca08ee7fd32975ce6) --- src/WINNT/afsd/cm_ioctl.c | 61 +++++++++++++++++++++----------------- src/WINNT/afsd/cm_scache.c | 34 ++++++++++++++++----- 2 files changed, 60 insertions(+), 35 deletions(-) diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index ae3f0eaf7..d530f65c8 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -1322,44 +1322,51 @@ long cm_IoctlDeleteMountPoint(struct smb_ioctl *ioctlp, struct cm_user *userp) code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp); /* if something went wrong, bail out now */ - if (code) { - goto done2; - } + if (code) + goto done3; lock_ObtainWrite(&scp->rw); code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - if (code) { - lock_ReleaseWrite(&scp->rw); - cm_ReleaseSCache(scp); + if (code) goto done2; - } /* now check that this is a real mount point */ if (scp->fileType != CM_SCACHETYPE_MOUNTPOINT) { - lock_ReleaseWrite(&scp->rw); - cm_ReleaseSCache(scp); code = CM_ERROR_INVAL; goto done1; } /* time to make the RPC, so drop the lock */ lock_ReleaseWrite(&scp->rw); - cm_ReleaseSCache(scp); - /* easier to do it this way */ - code = cm_Unlink(dscp, cp, userp, &req); +#ifdef AFS_FREELANCE_CLIENT + if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) { + /* we are adding the mount point to the root dir., so call + * the freelance code to do the add. */ + osi_Log0(afsd_logp,"IoctlDeleteMountPoint from Freelance root dir"); + code = cm_FreelanceRemoveMount(cp); + } else +#endif + { + /* easier to do it this way */ + code = cm_Unlink(dscp, cp, userp, &req); + } if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) smb_NotifyChange(FILE_ACTION_REMOVED, FILE_NOTIFY_CHANGE_DIR_NAME, dscp, cp, NULL, TRUE); - done1: lock_ObtainWrite(&scp->rw); + done1: cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - lock_ReleaseWrite(&scp->rw); done2: + cm_DiscardSCache(scp); + lock_ReleaseWrite(&scp->rw); + cm_ReleaseSCache(scp); + + done3: cm_ReleaseSCache(dscp); return code; } @@ -2174,17 +2181,6 @@ long cm_IoctlDeletelink(struct smb_ioctl *ioctlp, struct cm_user *userp) cp = ioctlp->inDatap; -#ifdef AFS_FREELANCE_CLIENT - if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) { - /* we are adding the mount point to the root dir., so call - * the freelance code to do the add. */ - osi_Log0(afsd_logp,"IoctlDeletelink from Freelance root dir"); - code = cm_FreelanceRemoveSymlink(cp); - cm_ReleaseSCache(dscp); - return code; - } -#endif - code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp); /* if something went wrong, bail out now */ @@ -2208,8 +2204,18 @@ long cm_IoctlDeletelink(struct smb_ioctl *ioctlp, struct cm_user *userp) /* time to make the RPC, so drop the lock */ lock_ReleaseWrite(&scp->rw); - /* easier to do it this way */ - code = cm_Unlink(dscp, cp, userp, &req); +#ifdef AFS_FREELANCE_CLIENT + if (cm_freelanceEnabled && dscp == cm_data.rootSCachep) { + /* we are adding the mount point to the root dir., so call + * the freelance code to do the add. */ + osi_Log0(afsd_logp,"IoctlDeletelink from Freelance root dir"); + code = cm_FreelanceRemoveSymlink(cp); + } else +#endif + { + /* easier to do it this way */ + code = cm_Unlink(dscp, cp, userp, &req); + } if (code == 0 && (dscp->flags & CM_SCACHEFLAG_ANYWATCH)) smb_NotifyChange(FILE_ACTION_REMOVED, FILE_NOTIFY_CHANGE_FILE_NAME @@ -2221,6 +2227,7 @@ long cm_IoctlDeletelink(struct smb_ioctl *ioctlp, struct cm_user *userp) cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); done2: + cm_DiscardSCache(scp); lock_ReleaseWrite(&scp->rw); cm_ReleaseSCache(scp); diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 4a2235bc4..25116d0d0 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -639,7 +639,7 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, #endif { long hash; - cm_scache_t *scp; + cm_scache_t *scp = NULL; long code; cm_volume_t *volp = NULL; cm_cell_t *cellp; @@ -651,6 +651,15 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, osi_assertx(fidp->cell != 0, "unassigned cell value"); +#ifdef AFS_FREELANCE_CLIENT + special = (fidp->cell==AFS_FAKE_ROOT_CELL_ID && + fidp->volume==AFS_FAKE_ROOT_VOL_ID && + !(fidp->vnode==0x1 && fidp->unique==0x1)); + isRoot = (fidp->cell==AFS_FAKE_ROOT_CELL_ID && + fidp->volume==AFS_FAKE_ROOT_VOL_ID && + fidp->vnode==0x1 && fidp->unique==0x1); +#endif + // yj: check if we have the scp, if so, we don't need // to do anything else lock_ObtainWrite(&cm_scacheLock); @@ -659,6 +668,11 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, #ifdef DEBUG_REFCOUNT afsi_log("%s:%d cm_GetSCache (1) outScpp 0x%p ref %d", file, line, scp, scp->refCount); osi_Log1(afsd_logp,"cm_GetSCache (1) outScpp 0x%p", scp); +#endif +#ifdef AFS_FREELANCE_CLIENT + if (cm_freelanceEnabled && special && + cm_data.fakeDirVersion != scp->dataVersion) + break; #endif cm_HoldSCacheNoLock(scp); *outScpp = scp; @@ -677,12 +691,6 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, // because we have to fill in the status stuff 'coz we // don't want trybulkstat to fill it in for us #ifdef AFS_FREELANCE_CLIENT - special = (fidp->cell==AFS_FAKE_ROOT_CELL_ID && - fidp->volume==AFS_FAKE_ROOT_VOL_ID && - !(fidp->vnode==0x1 && fidp->unique==0x1)); - isRoot = (fidp->cell==AFS_FAKE_ROOT_CELL_ID && - fidp->volume==AFS_FAKE_ROOT_VOL_ID && - fidp->vnode==0x1 && fidp->unique==0x1); if (cm_freelanceEnabled && isRoot) { osi_Log0(afsd_logp,"cm_GetSCache Freelance and isRoot"); /* freelance: if we are trying to get the root scp for the first @@ -696,6 +704,14 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, afs_uint32 fileType; osi_Log0(afsd_logp,"cm_GetSCache Freelance and special"); + + if (cm_getLocalMountPointChange()) { // check for changes + cm_clearLocalMountPointChange(); // clear the changefile + lock_ReleaseWrite(&cm_scacheLock); + cm_reInitLocalMountPoints(); // start reinit + lock_ObtainWrite(&cm_scacheLock); + } + lock_ObtainMutex(&cm_Freelance_Lock); if (fidp->vnode >= 2 && fidp->vnode - 2 < cm_noLocalMountPoints) { strncpy(mp,(cm_localMountPoints+fidp->vnode-2)->mountPointStringp, MOUNTPOINTLEN); @@ -710,7 +726,9 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, } lock_ReleaseMutex(&cm_Freelance_Lock); - scp = cm_GetNewSCache(); + if (scp == NULL) + scp = cm_GetNewSCache(); + if (scp == NULL) { osi_Log0(afsd_logp,"cm_GetSCache unable to obtain *new* scache entry"); lock_ReleaseWrite(&cm_scacheLock); -- 2.39.5