From: Jeffrey Altman Date: Sun, 17 Feb 2008 05:59:30 +0000 (+0000) Subject: DEVEL15-windows-invalidate-file-locks-vnovnode-20080217 X-Git-Tag: openafs-devel-1_5_32~16 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=e64053d95f5ef0013d447c771dbf1f7936031974;p=packages%2Fo%2Fopenafs.git DEVEL15-windows-invalidate-file-locks-vnovnode-20080217 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) --- diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index 0985ace4d..43b9f5cd0 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -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); diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index 9b44b808e..bea15dfbe 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -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); } diff --git a/src/WINNT/afsd/cm_vnodeops.h b/src/WINNT/afsd/cm_vnodeops.h index b376efdaa..91b616dc9 100644 --- a/src/WINNT/afsd/cm_vnodeops.h +++ b/src/WINNT/afsd/cm_vnodeops.h @@ -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