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;
}
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 */
/* 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
cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
done2:
+ cm_DiscardSCache(scp);
lock_ReleaseWrite(&scp->rw);
cm_ReleaseSCache(scp);
#endif
{
long hash;
- cm_scache_t *scp;
+ cm_scache_t *scp = NULL;
long code;
cm_volume_t *volp = NULL;
cm_cell_t *cellp;
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);
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;
cm_AdjustScacheLRU(scp);
// 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
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);
}
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);