]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-freelance-20080407
authorJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 7 Apr 2008 06:48:19 +0000 (06:48 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 7 Apr 2008 06:48:19 +0000 (06:48 +0000)
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
src/WINNT/afsd/cm_scache.c

index ae3f0eaf71d5c7c4d444f1ffc2f7c6eef7160b08..d530f65c8ac51ac85c5372a570f555f7f1ac5df4 100644 (file)
@@ -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);
 
index 4a2235bc4529903b0497ab229fd45fc37a5dd33a..25116d0d0e575c5c21afe3c7b615d8cf53b0c64e 100644 (file)
@@ -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);