]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-invalidate-file-locks-vnovnode-20080217
authorJeffrey Altman <jaltman@secure-endpoints.com>
Sun, 17 Feb 2008 05:59:30 +0000 (05:59 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sun, 17 Feb 2008 05:59:30 +0000 (05:59 +0000)
LICENSE MIT

Upon receiving a VNOVNODE error from a file server, be sure to
invalidate any file locks.  This prevents on-going attempts to
extend the locks and will cause subsequent attempts to access
the file to receive a invalid handle error.

(cherry picked from commit 38c2524bd16f1e535ea28f9d0788b7eaa8d26c3d)

src/WINNT/afsd/cm_conn.c
src/WINNT/afsd/cm_vnodeops.c
src/WINNT/afsd/cm_vnodeops.h

index 0985ace4d3df1cd1025612f6d30db7040975c9b2..43b9f5cd0382514b3cc7cfea01750460c66f8758 100644 (file)
@@ -459,17 +459,19 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
             break;
         }
 
-        /* Log server being offline for this volume */
-        sprintf(addr, "%d.%d.%d.%d", 
-                 ((serverp->addr.sin_addr.s_addr & 0xff)),
-                 ((serverp->addr.sin_addr.s_addr & 0xff00)>> 8),
-                 ((serverp->addr.sin_addr.s_addr & 0xff0000)>> 16),
-                 ((serverp->addr.sin_addr.s_addr & 0xff000000)>> 24)); 
-
-       osi_Log2(afsd_logp, format, osi_LogSaveString(afsd_logp,addr), fidp->volume);
+        if (serverp && fidp) {
+            /* Log server being offline for this volume */
+            sprintf(addr, "%d.%d.%d.%d", 
+                    ((serverp->addr.sin_addr.s_addr & 0xff)),
+                    ((serverp->addr.sin_addr.s_addr & 0xff00)>> 8),
+                    ((serverp->addr.sin_addr.s_addr & 0xff0000)>> 16),
+                    ((serverp->addr.sin_addr.s_addr & 0xff000000)>> 24)); 
+
+            osi_Log2(afsd_logp, format, osi_LogSaveString(afsd_logp,addr), fidp->volume);
 #ifndef DJGPP
-       LogEvent(EVENTLOG_WARNING_TYPE, msgID, addr, fidp->volume);
+            LogEvent(EVENTLOG_WARNING_TYPE, msgID, addr, fidp->volume);
 #endif
+        }
 
         /* Mark server offline for this volume */
         if (!serversp && fidp) {
@@ -479,6 +481,7 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
                 free_svr_list = 1;
             }
         }
+
         lock_ObtainWrite(&cm_serverLock);
         for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
             if (tsrp->server == serverp) {
@@ -538,6 +541,7 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
                lock_ObtainWrite(&cm_scacheLock);
                cm_RemoveSCacheFromHashTable(scp);
                lock_ReleaseWrite(&cm_scacheLock);
+                cm_LockMarkSCacheLost(scp);
                scp->flags |= CM_SCACHEFLAG_DELETED;
                lock_ReleaseMutex(&scp->mx);
                cm_ReleaseSCache(scp);
index 9b44b808ec32c758ff1430c8bae2756bdcb71685..bea15dfbefb8338f866fee72d5659b739dcb5e6d 100644 (file)
@@ -3959,9 +3959,6 @@ long cm_LockCheckWrite(cm_scache_t *scp,
 #endif
 }
 
-/* Forward dcl. */
-static void cm_LockMarkSCacheLost(cm_scache_t * scp);
-
 /* Called with cm_scacheLock write locked */
 static cm_file_lock_t * cm_GetFileLock(void) {
     cm_file_lock_t * l;
@@ -4907,7 +4904,7 @@ long cm_Unlock(cm_scache_t *scp,
 }
 
 /* called with scp->mx held */
-static void cm_LockMarkSCacheLost(cm_scache_t * scp)
+void cm_LockMarkSCacheLost(cm_scache_t * scp)
 {
     cm_file_lock_t *fileLock;
     osi_queue_t *q;
@@ -5031,7 +5028,7 @@ void cm_CheckLocks()
                 if (!IS_LOCK_ACTIVE(fileLock))
                     goto pre_syncopdone;
 
-                if (scp->serverLock != -1) {
+                if (scp->serverLock != -1 && !(scp->flags & CM_SCACHEFLAG_DELETED)) {
                     cm_fid_t cfid;
                     cm_user_t * userp;
 
@@ -5108,7 +5105,8 @@ void cm_CheckLocks()
                         }
                     }
 
-                    if (code == EINVAL || code == CM_ERROR_INVAL) {
+                    if (code == EINVAL || code == CM_ERROR_INVAL ||
+                        code == CM_ERROR_BADFD) {
                         cm_LockMarkSCacheLost(scp);
                     }
 
index b376efdaaf9b07536998e334460eafcc7a92bb84..91b616dc9ca218fda2b173f9da7540ff26d376ff 100644 (file)
@@ -224,6 +224,8 @@ extern void cm_CheckLocks(void);
 
 extern void cm_ReleaseAllLocks(void);
 
+extern void cm_LockMarkSCacheLost(cm_scache_t * scp);
+
 extern long cm_RetryLock(cm_file_lock_t *oldFileLock, int client_is_dead);
 
 #define CM_SESSION_SMB      0xffff