Index: openafs/src/WINNT/afsd/cm_buf.c
diff -c openafs/src/WINNT/afsd/cm_buf.c:1.13.2.9 openafs/src/WINNT/afsd/cm_buf.c:1.13.2.10
*** openafs/src/WINNT/afsd/cm_buf.c:1.13.2.9	Sun May 29 23:52:52 2005
--- openafs/src/WINNT/afsd/cm_buf.c	Sun Jun  5 02:45:31 2005
***************
*** 309,314 ****
--- 309,317 ----
              for (i=0; i<cm_data.buf_nbuffers; i++) {
                  lock_InitializeMutex(&bp->mx, "Buffer mutex");
                  bp->userp = NULL;
+                 bp->waitCount = 0;
+                 bp->waitRequests = 0;
+                 bp->flags &= ~CM_BUF_WAITING;
                  bp++;
              }       
          }
***************
*** 426,433 ****
  /* wait for reading or writing to clear; called with write-locked
   * buffer, and returns with locked buffer.
   */
! void buf_WaitIO(cm_buf_t *bp)
  {
      osi_assert(bp->magic == CM_BUF_MAGIC);
  
      while (1) {
--- 429,438 ----
  /* wait for reading or writing to clear; called with write-locked
   * buffer, and returns with locked buffer.
   */
! void buf_WaitIO(cm_scache_t * scp, cm_buf_t *bp)
  {
+     if (scp)
+         osi_assert(scp->magic == CM_SCACHE_MAGIC);
      osi_assert(bp->magic == CM_BUF_MAGIC);
  
      while (1) {
***************
*** 439,458 ****
           * the I/O already.  Wait for that guy to figure out what happened,
           * and then check again.
           */
!         if ( bp->flags & CM_BUF_WAITING ) 
              osi_Log1(buf_logp, "buf_WaitIO CM_BUF_WAITING already set for 0x%x", bp);
! 
!         bp->flags |= CM_BUF_WAITING;
          osi_SleepM((long) bp, &bp->mx);
          lock_ObtainMutex(&bp->mx);
          osi_Log1(buf_logp, "buf_WaitIO conflict wait done for 0x%x", bp);
      }
          
      /* if we get here, the IO is done, but we may have to wakeup people waiting for
       * the I/O to complete.  Do so.
       */
      if (bp->flags & CM_BUF_WAITING) {
!         bp->flags &= ~CM_BUF_WAITING;
          osi_Wakeup((long) bp);
      }
      osi_Log1(buf_logp, "WaitIO finished wait for bp 0x%x", (long) bp);
--- 444,483 ----
           * the I/O already.  Wait for that guy to figure out what happened,
           * and then check again.
           */
!         if ( bp->flags & CM_BUF_WAITING ) {
!             bp->waitCount++;
!             bp->waitRequests++;
              osi_Log1(buf_logp, "buf_WaitIO CM_BUF_WAITING already set for 0x%x", bp);
!         } else {
!             osi_Log1(buf_logp, "buf_WaitIO CM_BUF_WAITING set for 0x%x", bp);
!             bp->flags |= CM_BUF_WAITING;
!             bp->waitCount = bp->waitRequests = 1;
!         }
          osi_SleepM((long) bp, &bp->mx);
          lock_ObtainMutex(&bp->mx);
          osi_Log1(buf_logp, "buf_WaitIO conflict wait done for 0x%x", bp);
+         bp->waitCount--;
+         if (bp->waitCount == 0) {
+             osi_Log1(afsd_logp, "buf_WaitIO CM_BUF_WAITING reset for 0x%x", bp);
+             bp->flags &= ~CM_BUF_WAITING;
+             bp->waitRequests = 0;
+         }
+ 
+         if ( scp ) {
+             lock_ObtainMutex(&scp->mx);
+             if (scp->flags & CM_SCACHEFLAG_WAITING) {
+                 osi_Log1(buf_logp, "buf_WaitIO waking scp 0x%x", scp);
+                 osi_Wakeup(&scp->flags);
+                 lock_ReleaseMutex(&scp->mx);
+             }
+         }
      }
          
      /* if we get here, the IO is done, but we may have to wakeup people waiting for
       * the I/O to complete.  Do so.
       */
      if (bp->flags & CM_BUF_WAITING) {
!         osi_Log1(buf_logp, "buf_WaitIO Waking bp 0x%x", bp);
          osi_Wakeup((long) bp);
      }
      osi_Log1(buf_logp, "WaitIO finished wait for bp 0x%x", (long) bp);
***************
*** 550,556 ****
       */
      if (bp->flags & CM_BUF_WAITING) {
          /* turn off flags and wakeup users */
!         bp->flags &= ~CM_BUF_WAITING;
          osi_Wakeup((long) bp);
      }
  }
--- 575,581 ----
       */
      if (bp->flags & CM_BUF_WAITING) {
          /* turn off flags and wakeup users */
!         osi_Log1(buf_logp, "buf_WaitIO Waking bp 0x%x", bp);
          osi_Wakeup((long) bp);
      }
  }
***************
*** 833,839 ****
  
      /* wait for reads */
      if (bp->flags & CM_BUF_READING)
!         buf_WaitIO(bp);
  
      /* once it has been read once, we can unlock it and return it, still
       * with its refcount held.
--- 858,864 ----
  
      /* wait for reads */
      if (bp->flags & CM_BUF_READING)
!         buf_WaitIO(scp, bp);
  
      /* once it has been read once, we can unlock it and return it, still
       * with its refcount held.
***************
*** 933,939 ****
                  bp->flags |= CM_BUF_ERROR;
                  bp->flags &= ~CM_BUF_READING;
                  if (bp->flags & CM_BUF_WAITING) {
!                     bp->flags &= ~CM_BUF_WAITING;
                      osi_Wakeup((long) bp);
                  }
                  lock_ReleaseMutex(&bp->mx);
--- 958,964 ----
                  bp->flags |= CM_BUF_ERROR;
                  bp->flags &= ~CM_BUF_READING;
                  if (bp->flags & CM_BUF_WAITING) {
!                     osi_Log1(buf_logp, "buf_Get Waking bp 0x%x", bp);
                      osi_Wakeup((long) bp);
                  }
                  lock_ReleaseMutex(&bp->mx);
***************
*** 956,962 ****
              }
              bp->flags &= ~CM_BUF_READING;
              if (bp->flags & CM_BUF_WAITING) {
!                 bp->flags &= ~CM_BUF_WAITING;
                  osi_Wakeup((long) bp);
              }
          }
--- 981,987 ----
              }
              bp->flags &= ~CM_BUF_READING;
              if (bp->flags & CM_BUF_WAITING) {
!                 osi_Log1(buf_logp, "buf_Get Waking bp 0x%x", bp);
                  osi_Wakeup((long) bp);
              }
          }
***************
*** 967,973 ****
       * else started.  We don't care if we return a buffer being cleaned.
       */
      if (bp->flags & CM_BUF_READING)
!         buf_WaitIO(bp);
  
      /* once it has been read once, we can unlock it and return it, still
       * with its refcount held.
--- 992,998 ----
       * else started.  We don't care if we return a buffer being cleaned.
       */
      if (bp->flags & CM_BUF_READING)
!         buf_WaitIO(scp, bp);
  
      /* once it has been read once, we can unlock it and return it, still
       * with its refcount held.
***************
*** 1030,1042 ****
  }       
  
  /* wait for a buffer's cleaning to finish */
! void buf_CleanWait(cm_buf_t *bp)
  {
      osi_assert(bp->magic == CM_BUF_MAGIC);
  
      lock_ObtainMutex(&bp->mx);
      if (bp->flags & CM_BUF_WRITING) {
!         buf_WaitIO(bp);
      }
      lock_ReleaseMutex(&bp->mx);
  }       
--- 1055,1067 ----
  }       
  
  /* wait for a buffer's cleaning to finish */
! void buf_CleanWait(cm_scache_t * scp, cm_buf_t *bp)
  {
      osi_assert(bp->magic == CM_BUF_MAGIC);
  
      lock_ObtainMutex(&bp->mx);
      if (bp->flags & CM_BUF_WRITING) {
!         buf_WaitIO(scp, bp);
      }
      lock_ReleaseMutex(&bp->mx);
  }       
***************
*** 1096,1102 ****
                  /* now no locks are held; clean buffer and go on */
                  cm_InitReq(&req);
                  buf_CleanAsync(bp, &req);
!                 buf_CleanWait(bp);
  
                  /* relock and release buffer */
                  lock_ObtainWrite(&buf_globalLock);
--- 1121,1127 ----
                  /* now no locks are held; clean buffer and go on */
                  cm_InitReq(&req);
                  buf_CleanAsync(bp, &req);
!                 buf_CleanWait(NULL, bp);
  
                  /* relock and release buffer */
                  lock_ObtainWrite(&buf_globalLock);
***************
*** 1207,1213 ****
  
          if (cm_FidCmp(&bufp->fid, &scp->fid) == 0 &&
               LargeIntegerLessThan(*sizep, bufEnd)) {
!             buf_WaitIO(bufp);
          }
          lock_ObtainMutex(&scp->mx);
  	
--- 1232,1238 ----
  
          if (cm_FidCmp(&bufp->fid, &scp->fid) == 0 &&
               LargeIntegerLessThan(*sizep, bufEnd)) {
!             buf_WaitIO(scp, bufp);
          }
          lock_ObtainMutex(&scp->mx);
  	
***************
*** 1316,1322 ****
  
              /* start cleaning the buffer, and wait for it to finish */
              buf_LockedCleanAsync(bp, reqp);
!             buf_WaitIO(bp);
              lock_ReleaseMutex(&bp->mx);
  
              code = (*cm_buf_opsp->Stabilizep)(scp, userp, reqp);
--- 1341,1347 ----
  
              /* start cleaning the buffer, and wait for it to finish */
              buf_LockedCleanAsync(bp, reqp);
!             buf_WaitIO(scp, bp);
              lock_ReleaseMutex(&bp->mx);
  
              code = (*cm_buf_opsp->Stabilizep)(scp, userp, reqp);
***************
*** 1387,1393 ****
                  lock_ReleaseMutex(&bp->mx);
              }   
              buf_CleanAsync(bp, reqp);
!             buf_CleanWait(bp);
              lock_ObtainMutex(&bp->mx);
              if (bp->flags & CM_BUF_ERROR) {
                  if (code == 0 || code == -1) 
--- 1412,1418 ----
                  lock_ReleaseMutex(&bp->mx);
              }   
              buf_CleanAsync(bp, reqp);
!             buf_CleanWait(scp, bp);
              lock_ObtainMutex(&bp->mx);
              if (bp->flags & CM_BUF_ERROR) {
                  if (code == 0 || code == -1) 
Index: openafs/src/WINNT/afsd/cm_buf.h
diff -c openafs/src/WINNT/afsd/cm_buf.h:1.4.2.5 openafs/src/WINNT/afsd/cm_buf.h:1.4.2.6
*** openafs/src/WINNT/afsd/cm_buf.h:1.4.2.5	Fri Mar 11 01:58:40 2005
--- openafs/src/WINNT/afsd/cm_buf.h	Sun Jun  5 02:45:31 2005
***************
*** 95,100 ****
--- 95,104 ----
  #ifdef DISKCACHE95
      cm_diskcache_t *dcp;        /* diskcache structure */
  #endif /* DISKCACHE95 */
+ 
+     /* syncop state */
+     afs_uint32 waitCount;           /* number of threads waiting */
+     afs_uint32 waitRequests;        /* num of thread wait requests */
  } cm_buf_t;
  
  /* values for cmFlags */
***************
*** 140,146 ****
  
  extern void buf_Hold(cm_buf_t *);
  
! extern void buf_WaitIO(cm_buf_t *);
  
  extern void buf_LockedRelease(cm_buf_t *);
  
--- 144,150 ----
  
  extern void buf_Hold(cm_buf_t *);
  
! extern void buf_WaitIO(cm_scache_t *, cm_buf_t *);
  
  extern void buf_LockedRelease(cm_buf_t *);
  
***************
*** 162,168 ****
  
  extern void buf_CleanAsync(cm_buf_t *, cm_req_t *);
  
! extern void buf_CleanWait(cm_buf_t *);
  
  extern void buf_SetDirty(cm_buf_t *);
  
--- 166,172 ----
  
  extern void buf_CleanAsync(cm_buf_t *, cm_req_t *);
  
! extern void buf_CleanWait(cm_scache_t *, cm_buf_t *);
  
  extern void buf_SetDirty(cm_buf_t *);
  
Index: openafs/src/WINNT/afsd/cm_callback.c
diff -c openafs/src/WINNT/afsd/cm_callback.c:1.20.2.11 openafs/src/WINNT/afsd/cm_callback.c:1.20.2.12
*** openafs/src/WINNT/afsd/cm_callback.c:1.20.2.11	Wed Apr 27 11:32:52 2005
--- openafs/src/WINNT/afsd/cm_callback.c	Sun Jun  5 02:45:31 2005
***************
*** 1701,1708 ****
  
          /* now check to see if we got an error */
          if (code) {
!             osi_Log4(afsd_logp, "GetCallback Failed code 0x%x scp 0x%x cell %d vol %d", 
!                      code, scp, scp->fid.cell, scp->fid.volume);
              return code;
          }
      }
--- 1701,1709 ----
  
          /* now check to see if we got an error */
          if (code) {
!             osi_Log2(afsd_logp, "GetCallback Failed code 0x%x scp 0x%x -->",code, scp);
!             osi_Log4(afsd_logp, "            cell %d vol %d vn %d uniq %d",
!                      scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique);
              return code;
          }
      }
Index: openafs/src/WINNT/afsd/cm_conn.c
diff -c openafs/src/WINNT/afsd/cm_conn.c:1.25.2.9 openafs/src/WINNT/afsd/cm_conn.c:1.25.2.10
*** openafs/src/WINNT/afsd/cm_conn.c:1.25.2.9	Wed May 18 18:57:08 2005
--- openafs/src/WINNT/afsd/cm_conn.c	Sun Jun  5 02:45:31 2005
***************
*** 303,310 ****
      }
  
      /* special codes:  missing volumes */
!     else if (errorCode == VNOVOL || errorCode == VMOVED || errorCode == VOFFLINE
!          || errorCode == VSALVAGE || errorCode == VNOSERVICE) 
      {       
          /* Log server being offline for this volume */
          osi_Log4(afsd_logp, "cm_Analyze found server %d.%d.%d.%d marked offline for a volume",
--- 303,310 ----
      }
  
      /* special codes:  missing volumes */
!     else if (errorCode == VNOVOL || errorCode == VMOVED || errorCode == VOFFLINE ||
!              errorCode == VSALVAGE || errorCode == VNOSERVICE || errorCode == VIO) 
      {       
          /* Log server being offline for this volume */
          osi_Log4(afsd_logp, "cm_Analyze found server %d.%d.%d.%d marked offline for a volume",
***************
*** 398,418 ****
              char * s = "unknown error";
              switch ( errorCode ) {
              case RXKADINCONSISTENCY: s = "RXKADINCONSISTENCY"; break;
!             case RXKADPACKETSHORT  : s = "RXKADPACKETSHORT  "; break;
!             case RXKADLEVELFAIL    : s = "RXKADLEVELFAIL    "; break;
!             case RXKADTICKETLEN    : s = "RXKADTICKETLEN    "; break;
              case RXKADOUTOFSEQUENCE: s = "RXKADOUTOFSEQUENCE"; break;
!             case RXKADNOAUTH       : s = "RXKADNOAUTH       "; break;
!             case RXKADBADKEY       : s = "RXKADBADKEY       "; break;
!             case RXKADBADTICKET    : s = "RXKADBADTICKET    "; break;
!             case RXKADUNKNOWNKEY   : s = "RXKADUNKNOWNKEY   "; break;
!             case RXKADEXPIRED      : s = "RXKADEXPIRED      "; break;
!             case RXKADSEALEDINCON  : s = "RXKADSEALEDINCON  "; break;
!             case RXKADDATALEN      : s = "RXKADDATALEN      "; break;
!             case RXKADILLEGALLEVEL : s = "RXKADILLEGALLEVEL "; break;
              }
              osi_Log2(afsd_logp, "cm_Analyze: ignoring error code 0x%x (%s)", 
                       errorCode, s);
          }
      }
  
--- 398,434 ----
              char * s = "unknown error";
              switch ( errorCode ) {
              case RXKADINCONSISTENCY: s = "RXKADINCONSISTENCY"; break;
!             case RXKADPACKETSHORT  : s = "RXKADPACKETSHORT";   break;
!             case RXKADLEVELFAIL    : s = "RXKADLEVELFAIL";     break;
!             case RXKADTICKETLEN    : s = "RXKADTICKETLEN";     break;
              case RXKADOUTOFSEQUENCE: s = "RXKADOUTOFSEQUENCE"; break;
!             case RXKADNOAUTH       : s = "RXKADNOAUTH";        break;
!             case RXKADBADKEY       : s = "RXKADBADKEY";        break;
!             case RXKADBADTICKET    : s = "RXKADBADTICKET";     break;
!             case RXKADUNKNOWNKEY   : s = "RXKADUNKNOWNKEY";    break;
!             case RXKADEXPIRED      : s = "RXKADEXPIRED";       break;
!             case RXKADSEALEDINCON  : s = "RXKADSEALEDINCON";   break;
!             case RXKADDATALEN      : s = "RXKADDATALEN";       break;
!             case RXKADILLEGALLEVEL : s = "RXKADILLEGALLEVEL";  break;
!             case VSALVAGE          : s = "VSALVAGE";           break;
!             case VNOVNODE          : s = "VNOVNODE";           break;
!             case VNOVOL            : s = "VNOVOL";             break;
!             case VVOLEXISTS        : s = "VVOLEXISTS";         break;
!             case VNOSERVICE        : s = "VNOSERVICE";         break;
!             case VOFFLINE          : s = "VOFFLINE";           break;
!             case VONLINE           : s = "VONLINE";            break;
!             case VDISKFULL         : s = "VDISKFULL";          break;
!             case VOVERQUOTA        : s = "VOVERQUOTA";         break;
!             case VBUSY             : s = "VBUSY";              break;
!             case VMOVED            : s = "VMOVED";             break;
!             case VIO               : s = "VIO";                break;
!             case VRESTRICTED       : s = "VRESTRICTED";        break;
!             case VRESTARTING       : s = "VRESTARTING";        break;
!             case VREADONLY         : s = "VREADONLY";          break;
              }
              osi_Log2(afsd_logp, "cm_Analyze: ignoring error code 0x%x (%s)", 
                       errorCode, s);
+             retry = 0;
          }
      }
  
Index: openafs/src/WINNT/afsd/cm_conn.h
diff -c openafs/src/WINNT/afsd/cm_conn.h:1.8.2.1 openafs/src/WINNT/afsd/cm_conn.h:1.8.2.2
*** openafs/src/WINNT/afsd/cm_conn.h:1.8.2.1	Mon Oct 18 00:09:26 2004
--- openafs/src/WINNT/afsd/cm_conn.h	Sun Jun  5 02:45:31 2005
***************
*** 77,82 ****
--- 77,88 ----
  #define VMOVED		111	/* Volume has moved to another server;
  				   do a VGetVolumeInfo to THIS server to find
  				   out where */
+ #define VIO             112     /* Vnode temporarily unaccessible, but not known
+                                  * to be permanently bad. */
+ #define VRESTRICTED     120     /* Volume is restricted from using one or more
+                                  * of the given residencies; do a
+                                  * vos examine to find out the current
+                                  * restrictions. */
  
  #define VRESTARTING	-100    /* server is restarting, otherwise similar to 
  				   VBUSY above.  This is negative so that old
Index: openafs/src/WINNT/afsd/cm_dcache.c
diff -c openafs/src/WINNT/afsd/cm_dcache.c:1.11.2.11 openafs/src/WINNT/afsd/cm_dcache.c:1.11.2.12
*** openafs/src/WINNT/afsd/cm_dcache.c:1.11.2.11	Tue May 31 16:34:26 2005
--- openafs/src/WINNT/afsd/cm_dcache.c	Sun Jun  5 02:45:31 2005
***************
*** 379,387 ****
      int code;
      if (!cm_HaveCallback(scp))
          return 0;
!     if ((bufp->cmFlags
!           & (CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED))
!          == (CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED))
          return 1;
      if (bufp->dataVersion == scp->dataVersion)
          return 1;
--- 379,385 ----
      int code;
      if (!cm_HaveCallback(scp))
          return 0;
!     if ((bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED)) == (CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED))
          return 1;
      if (bufp->dataVersion == scp->dataVersion)
          return 1;
***************
*** 443,450 ****
          bp = buf_Find(scp, &tbase);
          /* We cheat slightly by not locking the bp mutex. */
          if (bp) {
!             if ((bp->cmFlags
!                   & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING)) == 0
                   && bp->dataVersion != scp->dataVersion)
                  stop = 1;
              buf_Release(bp);
--- 441,447 ----
          bp = buf_Find(scp, &tbase);
          /* We cheat slightly by not locking the bp mutex. */
          if (bp) {
!             if ((bp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING)) == 0
                   && bp->dataVersion != scp->dataVersion)
                  stop = 1;
              buf_Release(bp);
***************
*** 907,913 ****
  
          code = buf_Get(scp, &pageBase, &tbp);
          if (code) {
!             lock_ReleaseMutex(&cm_bufGetMutex);
              lock_ObtainMutex(&scp->mx);
              cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
              return code;
--- 904,910 ----
  
          code = buf_Get(scp, &pageBase, &tbp);
          if (code) {
!             //lock_ReleaseMutex(&cm_bufGetMutex);
              lock_ObtainMutex(&scp->mx);
              cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
              return code;
***************
*** 1097,1105 ****
          /* turn off writing and wakeup users */
          if (isStore) {
              if (bufp->flags & CM_BUF_WAITING) {
                  osi_Wakeup((long) bufp);
              }
!             bufp->flags &= ~(CM_BUF_WAITING | CM_BUF_WRITING | CM_BUF_DIRTY);
          }
  
          lock_ReleaseMutex(&bufp->mx);
--- 1094,1103 ----
          /* turn off writing and wakeup users */
          if (isStore) {
              if (bufp->flags & CM_BUF_WAITING) {
+                 osi_Log1(afsd_logp, "cm_ReleaseBIOD Waking bp 0x%x", bufp);
                  osi_Wakeup((long) bufp);
              }
!             bufp->flags &= ~(CM_BUF_WRITING | CM_BUF_DIRTY);
          }
  
          lock_ReleaseMutex(&bufp->mx);
***************
*** 1125,1131 ****
      AFSCallBack callback;
      AFSVolSync volSync;
      char *bufferp;
!     cm_buf_t *tbufp;		/* buf we're filling */
      osi_queueData_t *qdp;		/* q element we're scanning */
      AFSFid tfid;
      struct rx_call *callp;
--- 1123,1129 ----
      AFSCallBack callback;
      AFSVolSync volSync;
      char *bufferp;
!     cm_buf_t *tbufp;		        /* buf we're filling */
      osi_queueData_t *qdp;		/* q element we're scanning */
      AFSFid tfid;
      struct rx_call *callp;
***************
*** 1319,1325 ****
                  tbufp->cmFlags |= CM_BUF_CMFULLYFETCHED;
                  lock_ObtainMutex(&scp->mx);
                  if (scp->flags & CM_SCACHEFLAG_WAITING) {
!                     scp->flags &= ~CM_SCACHEFLAG_WAITING;
                      osi_Wakeup((long) &scp->flags);
                  }
                  if (cpffp && !*cpffp && !osi_QPrev(&qdp->q)) {
--- 1317,1323 ----
                  tbufp->cmFlags |= CM_BUF_CMFULLYFETCHED;
                  lock_ObtainMutex(&scp->mx);
                  if (scp->flags & CM_SCACHEFLAG_WAITING) {
!                     osi_Log1(afsd_logp, "CM GetBuffer Waking scp 0x%x", scp);
                      osi_Wakeup((long) &scp->flags);
                  }
                  if (cpffp && !*cpffp && !osi_QPrev(&qdp->q)) {
***************
*** 1412,1416 ****
--- 1410,1415 ----
  
      if (code == 0) 
          cm_MergeStatus(scp, &afsStatus, &volSync, up, 0);
+     
      return code;
  }
Index: openafs/src/WINNT/afsd/cm_scache.c
diff -c openafs/src/WINNT/afsd/cm_scache.c:1.14.2.8 openafs/src/WINNT/afsd/cm_scache.c:1.14.2.10
*** openafs/src/WINNT/afsd/cm_scache.c:1.14.2.8	Thu Mar 31 01:05:48 2005
--- openafs/src/WINNT/afsd/cm_scache.c	Sun Jun  5 09:39:29 2005
***************
*** 100,105 ****
--- 100,111 ----
              scp->serverModTime = 0;
              scp->dataVersion = 0;
              scp->bulkStatProgress = hzero;
+             scp->waitCount = 0;
+ 
+             scp->fid.vnode = 0;
+             scp->fid.volume = 0;
+             scp->fid.unique = 0;
+             scp->fid.cell = 0;
  
              /* discard callback */
              if (scp->cbServerp) {
***************
*** 281,289 ****
      for ( scp = cm_data.scacheLRULastp; scp;
            scp = (cm_scache_t *) osi_QPrev(&scp->q) ) {
          if (scp->randomACLp) {
!             lock_ObtainWrite(&scp->mx);
              cm_FreeAllACLEnts(scp);
!             lock_ReleaseWrite(&scp->mx);
          }
          lock_FinalizeMutex(&scp->mx);
          lock_FinalizeRWLock(&scp->bufCreateLock);
--- 287,295 ----
      for ( scp = cm_data.scacheLRULastp; scp;
            scp = (cm_scache_t *) osi_QPrev(&scp->q) ) {
          if (scp->randomACLp) {
!             lock_ObtainMutex(&scp->mx);
              cm_FreeAllACLEnts(scp);
!             lock_ReleaseMutex(&scp->mx);
          }
          lock_FinalizeMutex(&scp->mx);
          lock_FinalizeRWLock(&scp->bufCreateLock);
***************
*** 318,323 ****
--- 324,331 ----
                  scp->openWrites = 0;
                  scp->openShares = 0;
                  scp->openExcls = 0;
+                 scp->waitCount = 0;
+                 scp->flags &= ~CM_SCACHEFLAG_WAITING;
              }
          }
          cm_allFileLocks = NULL;
***************
*** 412,418 ****
  	  
      if (cm_freelanceEnabled && special) {
          osi_Log0(afsd_logp,"cm_getSCache Freelance and special");
!         if (fidp->vnode > 1 && fidp->vnode <= cm_localMountPoints + 2) {
  	    lock_ObtainMutex(&cm_Freelance_Lock);
              mp =(cm_localMountPoints+fidp->vnode-2)->mountPointStringp;
              lock_ReleaseMutex(&cm_Freelance_Lock);
--- 420,426 ----
  	  
      if (cm_freelanceEnabled && special) {
          osi_Log0(afsd_logp,"cm_getSCache Freelance and special");
!         if (fidp->vnode > 1 && fidp->vnode <= cm_noLocalMountPoints + 2) {
  	    lock_ObtainMutex(&cm_Freelance_Lock);
              mp =(cm_localMountPoints+fidp->vnode-2)->mountPointStringp;
              lock_ReleaseMutex(&cm_Freelance_Lock);
***************
*** 432,438 ****
          cm_data.hashTablep[hash]=scp;
          scp->flags |= CM_SCACHEFLAG_INHASH;
          scp->refCount = 1;
!         if (fidp->vnode > 1 && fidp->vnode <= cm_localMountPoints + 2)
              scp->fileType = (cm_localMountPoints+fidp->vnode-2)->fileType;
          else 
              scp->fileType = CM_SCACHETYPE_INVALID;
--- 440,446 ----
          cm_data.hashTablep[hash]=scp;
          scp->flags |= CM_SCACHEFLAG_INHASH;
          scp->refCount = 1;
!         if (fidp->vnode > 1 && fidp->vnode <= cm_noLocalMountPoints + 2)
              scp->fileType = (cm_localMountPoints+fidp->vnode-2)->fileType;
          else 
              scp->fileType = CM_SCACHETYPE_INVALID;
***************
*** 658,664 ****
                  goto sleep;
              }
              if (bufp && (bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING))) {
!                 osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is BUF_CMFETCHING|BUF_CMSTORING want FETCHDATA", scp);
                  goto sleep;
              }
          }
--- 666,672 ----
                  goto sleep;
              }
              if (bufp && (bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING))) {
!                 osi_Log2(afsd_logp, "CM SyncOp scp 0x%x bufp 0x%x is BUF_CMFETCHING|BUF_CMSTORING want FETCHDATA", scp, bufp);
                  goto sleep;
              }
          }
***************
*** 670,676 ****
                  goto sleep;
              }
              if (bufp && (bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING))) {
!                 osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is BUF_CMFETCHING|BUF_CMSTORING want STOREDATA", scp);
                  goto sleep;
              }
          }
--- 678,684 ----
                  goto sleep;
              }
              if (bufp && (bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING))) {
!                 osi_Log2(afsd_logp, "CM SyncOp scp 0x%x bufp 0x%x is BUF_CMFETCHING|BUF_CMSTORING want STOREDATA", scp, bufp);
                  goto sleep;
              }
          }
***************
*** 718,725 ****
               * operations don't change any of the data that we're
               * changing here.
               */
!             if (scp->flags & (CM_SCACHEFLAG_FETCHING | CM_SCACHEFLAG_STORING
!                                | CM_SCACHEFLAG_SIZESTORING)) {
                  osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING|STORING|SIZESTORING want SETSTATUS", scp);
                  goto sleep;
              }
--- 726,732 ----
               * operations don't change any of the data that we're
               * changing here.
               */
!             if (scp->flags & (CM_SCACHEFLAG_FETCHING | CM_SCACHEFLAG_STORING | CM_SCACHEFLAG_SIZESTORING)) {
                  osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING|STORING|SIZESTORING want SETSTATUS", scp);
                  goto sleep;
              }
***************
*** 733,743 ****
                  osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING want READ", scp);
                  goto sleep;
              }
!             if (bufp && ((bufp->cmFlags
!                            & (CM_BUF_CMFETCHING
!                                | CM_BUF_CMFULLYFETCHED))
!                           == CM_BUF_CMFETCHING)) {
!                 osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is BUF_CMFETCHING want READ", scp);
                  goto sleep;
              }
          }
--- 740,747 ----
                  osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is FETCHING want READ", scp);
                  goto sleep;
              }
!             if (bufp && ((bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED)) == CM_BUF_CMFETCHING)) {
!                 osi_Log2(afsd_logp, "CM SyncOp scp 0x%x bufp 0x%x is BUF_CMFETCHING want READ", scp, bufp);
                  goto sleep;
              }
          }
***************
*** 751,757 ****
                  goto sleep;
              }
              if (bufp && (bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING))) {
!                 osi_Log1(afsd_logp, "CM SyncOp scp 0x%x is BUF_CMFETCHING|BUF_CMSTORING want WRITE", scp);
                  goto sleep;
              }
          }
--- 755,761 ----
                  goto sleep;
              }
              if (bufp && (bufp->cmFlags & (CM_BUF_CMFETCHING | CM_BUF_CMSTORING))) {
!                 osi_Log2(afsd_logp, "CM SyncOp scp 0x%x bufp 0x%x is BUF_CMFETCHING|BUF_CMSTORING want WRITE", scp, bufp);
                  goto sleep;
              }
          }
***************
*** 822,831 ****
          /* wait here, then try again */
          osi_Log1(afsd_logp, "CM SyncOp sleeping scp 0x%x", scp);
          if ( scp->flags & CM_SCACHEFLAG_WAITING ) {
!             osi_Log1(afsd_logp, "CM SyncOp CM_SCACHEFLAG_WAITING already set for 0x%x", scp);
          } else {
              osi_Log1(afsd_logp, "CM SyncOp CM_SCACHEFLAG_WAITING set for 0x%x", scp);
              scp->flags |= CM_SCACHEFLAG_WAITING;
          }
          if (bufLocked) 
              lock_ReleaseMutex(&bufp->mx);
--- 826,839 ----
          /* wait here, then try again */
          osi_Log1(afsd_logp, "CM SyncOp sleeping scp 0x%x", scp);
          if ( scp->flags & CM_SCACHEFLAG_WAITING ) {
!             scp->waitCount++;
!             scp->waitRequests++;
!             osi_Log3(afsd_logp, "CM SyncOp CM_SCACHEFLAG_WAITING already set for 0x%x; %d threads; %d requests", 
!                      scp, scp->waitCount, scp->waitRequests);
          } else {
              osi_Log1(afsd_logp, "CM SyncOp CM_SCACHEFLAG_WAITING set for 0x%x", scp);
              scp->flags |= CM_SCACHEFLAG_WAITING;
+             scp->waitCount = scp->waitRequests = 1;
          }
          if (bufLocked) 
              lock_ReleaseMutex(&bufp->mx);
***************
*** 833,839 ****
          if (bufLocked) 
              lock_ObtainMutex(&bufp->mx);
          lock_ObtainMutex(&scp->mx);
!         osi_Log1(afsd_logp, "CM SyncOp woke! scp 0x%x", scp);
      } /* big while loop */
          
      /* now, update the recorded state for RPC-type calls */
--- 841,854 ----
          if (bufLocked) 
              lock_ObtainMutex(&bufp->mx);
          lock_ObtainMutex(&scp->mx);
!         scp->waitCount--;
!         osi_Log3(afsd_logp, "CM SyncOp woke! scp 0x%x; still waiting %d threads of %d requests", 
!                  scp, scp->waitCount, scp->waitRequests);
!         if (scp->waitCount == 0) {
!             osi_Log1(afsd_logp, "CM SyncOp CM_SCACHEFLAG_WAITING reset for 0x%x", scp);
!             scp->flags &= ~CM_SCACHEFLAG_WAITING;
!             scp->waitRequests = 0;
!         }
      } /* big while loop */
          
      /* now, update the recorded state for RPC-type calls */
***************
*** 930,937 ****
          osi_QRemove((osi_queue_t **) &scp->bufReadsp, &qdp->q);
          osi_QDFree(qdp);
          if (bufp) {
!             bufp->cmFlags &=
!                 ~(CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED);
              buf_Release(bufp);
          }
      }
--- 945,955 ----
          osi_QRemove((osi_queue_t **) &scp->bufReadsp, &qdp->q);
          osi_QDFree(qdp);
          if (bufp) {
!             bufp->cmFlags &= ~(CM_BUF_CMFETCHING | CM_BUF_CMFULLYFETCHED);
!             if (bufp->flags & CM_BUF_WAITING) {
!                 osi_Log2(afsd_logp, "CM SyncOpDone Waking [scp 0x%x] bufp 0x%x", scp, bufp);
!                 osi_Wakeup((long) &bufp);
!             }
              buf_Release(bufp);
          }
      }
***************
*** 949,962 ****
          osi_QDFree(qdp);
          if (bufp) {
              bufp->cmFlags &= ~CM_BUF_CMSTORING;
              buf_Release(bufp);
          }
      }
  
      /* and wakeup anyone who is waiting */
      if (scp->flags & CM_SCACHEFLAG_WAITING) {
!         osi_Log1(afsd_logp, "CM SyncOp CM_SCACHEFLAG_WAITING reset for 0x%x", scp);
!         scp->flags &= ~CM_SCACHEFLAG_WAITING;
          osi_Wakeup((long) &scp->flags);
      }
  }       
--- 967,983 ----
          osi_QDFree(qdp);
          if (bufp) {
              bufp->cmFlags &= ~CM_BUF_CMSTORING;
+             if (bufp->flags & CM_BUF_WAITING) {
+                 osi_Log2(afsd_logp, "CM SyncOpDone Waking [scp 0x%x] bufp 0x%x", scp, bufp);
+                 osi_Wakeup((long) &bufp);
+             }
              buf_Release(bufp);
          }
      }
  
      /* and wakeup anyone who is waiting */
      if (scp->flags & CM_SCACHEFLAG_WAITING) {
!         osi_Log1(afsd_logp, "CM SyncOpDone Waking scp 0x%x", scp);
          osi_Wakeup((long) &scp->flags);
      }
  }       
Index: openafs/src/WINNT/afsd/cm_scache.h
diff -c openafs/src/WINNT/afsd/cm_scache.h:1.4.2.6 openafs/src/WINNT/afsd/cm_scache.h:1.4.2.7
*** openafs/src/WINNT/afsd/cm_scache.h:1.4.2.6	Fri Mar 11 01:58:42 2005
--- openafs/src/WINNT/afsd/cm_scache.h	Sun Jun  5 02:45:31 2005
***************
*** 130,135 ****
--- 130,139 ----
          afs_uint16 openWrites;		/* open for writing */
          afs_uint16 openShares;		/* open for read excl */
          afs_uint16 openExcls;		/* open for exclusives */
+ 
+         /* syncop state */
+         afs_uint32 waitCount;           /* number of threads waiting */
+         afs_uint32 waitRequests;        /* num of thread wait requests */
  } cm_scache_t;
  
  /* mask field - tell what has been modified */
Index: openafs/src/WINNT/afsd/cm_vnodeops.c
diff -c openafs/src/WINNT/afsd/cm_vnodeops.c:1.19.2.18 openafs/src/WINNT/afsd/cm_vnodeops.c:1.19.2.19
*** openafs/src/WINNT/afsd/cm_vnodeops.c:1.19.2.18	Tue May 31 13:36:57 2005
--- openafs/src/WINNT/afsd/cm_vnodeops.c	Sun Jun  5 02:45:31 2005
***************
*** 128,134 ****
  int cm_Is8Dot3(char *namep)
  {
      int sawDot = 0;
-     int sawUpper = 0, sawLower = 0;
      unsigned char tc;
      int charCount = 0;
          
--- 128,133 ----
***************
*** 153,162 ****
          }
          if (cm_LegalChars[tc] == 0)
              return 0;
-         if (tc >= 'A' && tc <= 'Z')
-             sawUpper = 1;
-         else if (tc >= 'a' && tc <= 'z')
-             sawLower = 1;
          charCount++;
          if (!sawDot && charCount > 8)
              /* more than 8 chars in name */
--- 152,157 ----
***************
*** 165,178 ****
              /* more than 3 chars in extension */
              return 0;
      }
-     /*
-      * Used to check that all characters were the same case.
-      * This doesn't help 16-bit apps, and meanwhile it causes the
-      * MS-DOS Command Prompt to misbehave; see Sybase defect 10709.
-      *
-      if (sawUpper && sawLower)
-          return 0;
-      */
      return 1;
  }
  
--- 160,165 ----
Index: openafs/src/WINNT/afsd/smb.c
diff -c openafs/src/WINNT/afsd/smb.c:1.55.2.23 openafs/src/WINNT/afsd/smb.c:1.55.2.24
*** openafs/src/WINNT/afsd/smb.c:1.55.2.23	Wed May 18 18:57:09 2005
--- openafs/src/WINNT/afsd/smb.c	Sun Jun  5 02:45:32 2005
***************
*** 2250,2257 ****
      code = Netbios(ncbp, dos_ncb);
  #endif /* !DJGPP */
          
!     if (code != 0)
!         osi_Log1(smb_logp, "SendPacket failure code %d", code);
  
      if (localNCB)
          FreeNCB(ncbp);
--- 2250,2300 ----
      code = Netbios(ncbp, dos_ncb);
  #endif /* !DJGPP */
          
!     if (code != 0) {
!         char * s;
!         switch ( code ) {
!         case 0x01: s = "llegal buffer length                     "; break; 
!         case 0x03: s = "illegal command                          "; break; 
!         case 0x05: s = "command timed out                        "; break; 
!         case 0x06: s = "message incomplete, issue another command"; break; 
!         case 0x07: s = "illegal buffer address                   "; break; 
!         case 0x08: s = "session number out of range              "; break; 
!         case 0x09: s = "no resource available                    "; break; 
!         case 0x0a: s = "session closed                           "; break; 
!         case 0x0b: s = "command cancelled                        "; break; 
!         case 0x0d: s = "duplicate name                           "; break; 
!         case 0x0e: s = "name table full                          "; break; 
!         case 0x0f: s = "no deletions, name has active sessions   "; break; 
!         case 0x11: s = "local session table full                 "; break; 
!         case 0x12: s = "remote session table full                "; break; 
!         case 0x13: s = "illegal name number                      "; break; 
!         case 0x14: s = "no callname                              "; break; 
!         case 0x15: s = "cannot put * in NCB_NAME                 "; break; 
!         case 0x16: s = "name in use on remote adapter            "; break; 
!         case 0x17: s = "name deleted                             "; break; 
!         case 0x18: s = "session ended abnormally                 "; break; 
!         case 0x19: s = "name conflict detected                   "; break; 
!         case 0x21: s = "interface busy, IRET before retrying     "; break; 
!         case 0x22: s = "too many commands outstanding, retry later"; break;
!         case 0x23: s = "ncb_lana_num field invalid               "; break; 
!         case 0x24: s = "command completed while cancel occurring "; break; 
!         case 0x26: s = "command not valid to cancel              "; break; 
!         case 0x30: s = "name defined by anther local process     "; break; 
!         case 0x34: s = "environment undefined. RESET required    "; break; 
!         case 0x35: s = "required OS resources exhausted          "; break; 
!         case 0x36: s = "max number of applications exceeded      "; break; 
!         case 0x37: s = "no saps available for netbios            "; break; 
!         case 0x38: s = "requested resources are not available    "; break; 
!         case 0x39: s = "invalid ncb address or length > segment  "; break; 
!         case 0x3B: s = "invalid NCB DDID                         "; break; 
!         case 0x3C: s = "lock of user area failed                 "; break; 
!         case 0x3f: s = "NETBIOS not loaded                       "; break; 
!         case 0x40: s = "system error                             "; break;                 
!         default:
!             s = "unknown error";
!         }
!         osi_Log2(smb_logp, "SendPacket failure code %d \"%s\"", code, s);
!     }
  
      if (localNCB)
          FreeNCB(ncbp);
***************
*** 5519,5532 ****
      lock_ObtainMutex(&scp->mx);
  
      /* start by looking up the file's end */
-     osi_Log1(smb_logp, "smb_WriteData fid %d calling cm_SyncOp NEEDCALLBACK|SETSTATUS|GETSTATUS",
-               fidp->fid);
      code = cm_SyncOp(scp, NULL, userp, &req, 0,
                        CM_SCACHESYNC_NEEDCALLBACK
                        | CM_SCACHESYNC_SETSTATUS
                        | CM_SCACHESYNC_GETSTATUS);
-     osi_Log2(smb_logp, "smb_WriteData fid %d calling cm_SyncOp NEEDCALLBACK|SETSTATUS|GETSTATUS returns %d",
-               fidp->fid,code);
      if (code) 
          goto done;
          
--- 5562,5571 ----
***************
*** 5606,5619 ****
  
              /* now get the data in the cache */
              while (1) {
-                 osi_Log1(smb_logp, "smb_WriteData fid %d calling cm_SyncOp NEEDCALLBACK|WRITE|BUFLOCKED",
-                           fidp->fid);
                  code = cm_SyncOp(scp, bufferp, userp, &req, 0,
                                    CM_SCACHESYNC_NEEDCALLBACK
                                    | CM_SCACHESYNC_WRITE
                                    | CM_SCACHESYNC_BUFLOCKED);
-                 osi_Log2(smb_logp, "smb_WriteData fid %d calling cm_SyncOp NEEDCALLBACK|WRITE|BUFLOCKED returns %d",
-                           fidp->fid,code);
                  if (code) 
                      goto done;
  
--- 5645,5654 ----
Index: openafs/src/afs/afs_dcache.c
diff -c openafs/src/afs/afs_dcache.c:1.42.2.12 openafs/src/afs/afs_dcache.c:1.42.2.13
*** openafs/src/afs/afs_dcache.c:1.42.2.12	Mon May 30 00:05:40 2005
--- openafs/src/afs/afs_dcache.c	Sun Jun  5 11:34:49 2005
***************
*** 14,20 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_dcache.c,v 1.42.2.12 2005/05/30 04:05:40 shadow Exp $");
  
  #include "afs/sysincludes.h"	/*Standard vendor system headers */
  #include "afsincludes.h"	/*AFS-based standard headers */
--- 14,20 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/afs_dcache.c,v 1.42.2.13 2005/06/05 15:34:49 shadow Exp $");
  
  #include "afs/sysincludes.h"	/*Standard vendor system headers */
  #include "afsincludes.h"	/*AFS-based standard headers */
***************
*** 646,654 ****
  		if (tvc) {
  		    tchunkoffset = AFS_CHUNKTOBASE(tdc->f.chunk);
  		    chunkFlags = afs_indexFlags[tdc->index];
! 		    if ((((phase / 2) & 1) == 0) && osi_Active(tvc))
                          skip = 1;
! 		    if ((((phase / 2) & 1) == 1) && osi_Active(tvc)
                          && (tvc->states & CDCLock)
                          && (chunkFlags & IFAnyPages))
                          skip = 1;
--- 646,654 ----
  		if (tvc) {
  		    tchunkoffset = AFS_CHUNKTOBASE(tdc->f.chunk);
  		    chunkFlags = afs_indexFlags[tdc->index];
! 		    if (((phase & 1) == 0) && osi_Active(tvc))
                          skip = 1;
! 		    if (((phase & 1) == 1) && osi_Active(tvc)
                          && (tvc->states & CDCLock)
                          && (chunkFlags & IFAnyPages))
                          skip = 1;
***************
*** 794,800 ****
  	    }
  	} else {
  	    /* found no one in phases 0-5, we're hosed */
! 	    if (victimPtr == 0)
  		break;
  	}
      }				/* big while loop */
--- 794,800 ----
  	    }
  	} else {
  	    /* found no one in phases 0-5, we're hosed */
! 	    if (j == 0)
  		break;
  	}
      }				/* big while loop */
Index: openafs/src/afs/LINUX/osi_vfsops.c
diff -c openafs/src/afs/LINUX/osi_vfsops.c:1.29.2.3 openafs/src/afs/LINUX/osi_vfsops.c:1.29.2.4
*** openafs/src/afs/LINUX/osi_vfsops.c:1.29.2.3	Thu Mar 10 23:37:18 2005
--- openafs/src/afs/LINUX/osi_vfsops.c	Sun Jun  5 11:34:42 2005
***************
*** 16,22 ****
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_vfsops.c,v 1.29.2.3 2005/03/11 04:37:18 shadow Exp $");
  
  #define __NO_VERSION__		/* don't define kernel_version in module.h */
  #include <linux/module.h> /* early to avoid printf->printk mapping */
--- 16,22 ----
  #include "afs/param.h"
  
  RCSID
!     ("$Header: /cvs/openafs/src/afs/LINUX/osi_vfsops.c,v 1.29.2.4 2005/06/05 15:34:42 shadow Exp $");
  
  #define __NO_VERSION__		/* don't define kernel_version in module.h */
  #include <linux/module.h> /* early to avoid printf->printk mapping */
***************
*** 287,292 ****
--- 287,300 ----
  #endif
  }
  
+ #if defined(AFS_LINUX26_ENV)
+ static void
+ afs_drop_inode(struct inode *ip)
+ {
+ 	generic_delete_inode(ip);
+ 	AFS_GUNLOCK();		/* locked by afs_delete_inode() */
+ }
+ #endif
  
  static void
  afs_destroy_inode(struct inode *ip)
***************
*** 305,317 ****
  static void
  afs_delete_inode(struct inode *ip)
  {
! #ifdef AFS_LINUX26_ENV
      put_inode_on_dummy_list(ip);
! #endif
! 
      AFS_GLOCK();
      osi_clear_inode(ip);
      AFS_GUNLOCK();
  }
  
  
--- 313,327 ----
  static void
  afs_delete_inode(struct inode *ip)
  {
! #if defined(AFS_LINUX26_ENV)
!     AFS_GLOCK();		/* after spin_unlock(inode_lock) */
      put_inode_on_dummy_list(ip);
!     osi_clear_inode(ip);
! #else
      AFS_GLOCK();
      osi_clear_inode(ip);
      AFS_GUNLOCK();
+ #endif
  }
  
  
***************
*** 404,410 ****
  
  struct super_operations afs_sops = {
  #if defined(AFS_LINUX26_ENV)
!   .drop_inode =		generic_delete_inode,
    .destroy_inode =	afs_destroy_inode,
  #endif
    .delete_inode =	afs_delete_inode,
--- 414,420 ----
  
  struct super_operations afs_sops = {
  #if defined(AFS_LINUX26_ENV)
!   .drop_inode =		afs_drop_inode,
    .destroy_inode =	afs_destroy_inode,
  #endif
    .delete_inode =	afs_delete_inode,
Index: openafs/src/config/NTMakefile.amd64_w2k
diff -c openafs/src/config/NTMakefile.amd64_w2k:1.1.2.8 openafs/src/config/NTMakefile.amd64_w2k:1.1.2.9
*** openafs/src/config/NTMakefile.amd64_w2k:1.1.2.8	Wed May 18 18:57:11 2005
--- openafs/src/config/NTMakefile.amd64_w2k	Sun Jun  5 10:52:45 2005
***************
*** 80,86 ****
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=3
! AFSPRODUCT_VER_PATCH=8300
  AFSPRODUCT_VER_BUILD=0
  
  # For MSI installer, each major release should have a different GUID
--- 80,86 ----
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=3
! AFSPRODUCT_VER_PATCH=8400
  AFSPRODUCT_VER_BUILD=0
  
  # For MSI installer, each major release should have a different GUID
Index: openafs/src/config/NTMakefile.i386_nt40
diff -c openafs/src/config/NTMakefile.i386_nt40:1.46.2.23 openafs/src/config/NTMakefile.i386_nt40:1.46.2.24
*** openafs/src/config/NTMakefile.i386_nt40:1.46.2.23	Wed May 18 18:57:11 2005
--- openafs/src/config/NTMakefile.i386_nt40	Sun Jun  5 10:52:45 2005
***************
*** 80,86 ****
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=3
! AFSPRODUCT_VER_PATCH=8300
  AFSPRODUCT_VER_BUILD=0
  
  # For MSI installer, each major release should have a different GUID
--- 80,86 ----
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=3
! AFSPRODUCT_VER_PATCH=8400
  AFSPRODUCT_VER_BUILD=0
  
  # For MSI installer, each major release should have a different GUID
Index: openafs/src/config/NTMakefile.i386_w2k
diff -c openafs/src/config/NTMakefile.i386_w2k:1.1.2.8 openafs/src/config/NTMakefile.i386_w2k:1.1.2.9
*** openafs/src/config/NTMakefile.i386_w2k:1.1.2.8	Wed May 18 18:57:11 2005
--- openafs/src/config/NTMakefile.i386_w2k	Sun Jun  5 10:52:45 2005
***************
*** 80,86 ****
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=3
! AFSPRODUCT_VER_PATCH=8300
  AFSPRODUCT_VER_BUILD=0
  
  # For MSI installer, each major release should have a different GUID
--- 80,86 ----
  #define used in WinNT/2000 installation and program version display
  AFSPRODUCT_VER_MAJOR=1
  AFSPRODUCT_VER_MINOR=3
! AFSPRODUCT_VER_PATCH=8400
  AFSPRODUCT_VER_BUILD=0
  
  # For MSI installer, each major release should have a different GUID
Index: openafs/src/des/des.c
diff -c openafs/src/des/des.c:1.11.2.3 openafs/src/des/des.c:1.11.2.4
*** openafs/src/des/des.c:1.11.2.3	Mon May 30 00:57:34 2005
--- openafs/src/des/des.c	Thu Jun  2 01:21:57 2005
***************
*** 37,43 ****
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/des/des.c,v 1.11.2.3 2005/05/30 04:57:34 shadow Exp $");
  
  #ifndef KERNEL
  #include <stdio.h>
--- 37,43 ----
  #include <afs/param.h>
  
  RCSID
!     ("$Header: /cvs/openafs/src/des/des.c,v 1.11.2.4 2005/06/02 05:21:57 shadow Exp $");
  
  #ifndef KERNEL
  #include <stdio.h>
***************
*** 92,98 ****
  #endif
  #endif
      afs_uint32 P_temp;
!     register unsigned char *P_temp_p = (unsigned char *)&P_temp;
  #ifdef BITS16
      sbox_out S_out;
      afs_uint32 *S_out_p = (afs_uint32 *) & S_out;
--- 92,98 ----
  #endif
  #endif
      afs_uint32 P_temp;
!     volatile unsigned char *P_temp_p = (unsigned char *)&P_temp;
  #ifdef BITS16
      sbox_out S_out;
      afs_uint32 *S_out_p = (afs_uint32 *) & S_out;
Index: openafs/src/libafs/afs.ppc_darwin_70.plist.in
diff -c openafs/src/libafs/afs.ppc_darwin_70.plist.in:1.2.2.2 openafs/src/libafs/afs.ppc_darwin_70.plist.in:1.2.2.3
*** openafs/src/libafs/afs.ppc_darwin_70.plist.in:1.2.2.2	Tue May 31 10:49:19 2005
--- openafs/src/libafs/afs.ppc_darwin_70.plist.in	Sun Jun  5 11:43:42 2005
***************
*** 15,25 ****
  	<key>CFBundlePackageType</key>
  	<string>KEXT</string>
  	<key>CFBundleShortVersionString</key>
! 	<string>1.3.83</string>
  	<key>CFBundleSignature</key>
  	<string>????</string>
  	<key>CFBundleVersion</key>
! 	<string>1.3.83</string>
  	<key>OSBundleLibraries</key>
  	<dict>
  		<key>com.apple.kernel.bsd</key>
--- 15,25 ----
  	<key>CFBundlePackageType</key>
  	<string>KEXT</string>
  	<key>CFBundleShortVersionString</key>
! 	<string>1.3.84</string>
  	<key>CFBundleSignature</key>
  	<string>????</string>
  	<key>CFBundleVersion</key>
! 	<string>1.3.84</string>
  	<key>OSBundleLibraries</key>
  	<dict>
  		<key>com.apple.kernel.bsd</key>
Index: openafs/src/packaging/MacOS/OpenAFS.Info.plist
diff -c openafs/src/packaging/MacOS/OpenAFS.Info.plist:1.2.2.10 openafs/src/packaging/MacOS/OpenAFS.Info.plist:1.2.2.11
*** openafs/src/packaging/MacOS/OpenAFS.Info.plist:1.2.2.10	Tue May 31 10:51:03 2005
--- openafs/src/packaging/MacOS/OpenAFS.Info.plist	Sun Jun  5 11:43:43 2005
***************
*** 3,19 ****
  <plist version="1.0">
  <dict>
  	<key>CFBundleGetInfoString</key>
! 	<string>OpenAFS 1.3.83</string>
  	<key>CFBundleIdentifier</key>
  	<string>org.openafs.OpenAFS.pkg</string>
  	<key>CFBundleName</key>
  	<string>OpenAFS</string>
  	<key>CFBundleShortVersionString</key>
! 	<string>1.3.83</string>
  	<key>IFMajorVersion</key>
  	<integer>1</integer>
  	<key>IFMinorVersion</key>
! 	<integer>3</integer>
  	<key>IFPkgFlagAllowBackRev</key>
  	<false/>
  	<key>IFPkgFlagAuthorizationAction</key>
--- 3,19 ----
  <plist version="1.0">
  <dict>
  	<key>CFBundleGetInfoString</key>
! 	<string>OpenAFS 1.3.84</string>
  	<key>CFBundleIdentifier</key>
  	<string>org.openafs.OpenAFS.pkg</string>
  	<key>CFBundleName</key>
  	<string>OpenAFS</string>
  	<key>CFBundleShortVersionString</key>
! 	<string>1.3.84</string>
  	<key>IFMajorVersion</key>
  	<integer>1</integer>
  	<key>IFMinorVersion</key>
! 	<integer>2</integer>
  	<key>IFPkgFlagAllowBackRev</key>
  	<false/>
  	<key>IFPkgFlagAuthorizationAction</key>
Index: openafs/src/packaging/MacOS/OpenAFS.info
diff -c openafs/src/packaging/MacOS/OpenAFS.info:1.1.4.10 openafs/src/packaging/MacOS/OpenAFS.info:1.1.4.11
*** openafs/src/packaging/MacOS/OpenAFS.info:1.1.4.10	Tue May 31 10:51:03 2005
--- openafs/src/packaging/MacOS/OpenAFS.info	Sun Jun  5 11:43:43 2005
***************
*** 1,5 ****
  Title OpenAFS
! Version 1.3.83
  Description The OpenAFS distributed filesystem. This package installs an almost-ready-to-run client for OpenAFS. see http://www.openafs.org for more information.
  DefaultLocation /
  Diskname (null)
--- 1,5 ----
  Title OpenAFS
! Version 1.3.84
  Description The OpenAFS distributed filesystem. This package installs an almost-ready-to-run client for OpenAFS. see http://www.openafs.org for more information.
  DefaultLocation /
  Diskname (null)
Index: openafs/src/rxkad/rxkad_common.c
diff -c openafs/src/rxkad/rxkad_common.c:1.20.2.6 openafs/src/rxkad/rxkad_common.c:1.20.2.7
*** openafs/src/rxkad/rxkad_common.c:1.20.2.6	Mon May 30 14:30:36 2005
--- openafs/src/rxkad/rxkad_common.c	Tue May 31 17:12:59 2005
***************
*** 23,29 ****
  #define INCLUDE_RXKAD_PRIVATE_DECLS
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/rxkad_common.c,v 1.20.2.6 2005/05/30 18:30:36 shadow Exp $");
  
  #ifdef KERNEL
  #ifndef UKERNEL
--- 23,29 ----
  #define INCLUDE_RXKAD_PRIVATE_DECLS
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/rxkad_common.c,v 1.20.2.7 2005/05/31 21:12:59 shadow Exp $");
  
  #ifdef KERNEL
  #ifndef UKERNEL
***************
*** 89,96 ****
  pthread_mutex_t rxkad_global_stats_lock;
  pthread_key_t rxkad_stats_key;
  #else /* AFS_PTHREAD_ENV */
  /* Move delaration of this to des/key_sched.c */
! /* struct rxkad_stats rxkad_stats = { { 0 } }; */
  #endif /* AFS_PTHREAD_ENV */
  
  #ifdef AFS_PTHREAD_ENV
--- 89,99 ----
  pthread_mutex_t rxkad_global_stats_lock;
  pthread_key_t rxkad_stats_key;
  #else /* AFS_PTHREAD_ENV */
+ #if defined(KERNEL) && !defined(UKERNEL)
+ struct rxkad_stats rxkad_stats = { { 0 } }; 
+ #else
  /* Move delaration of this to des/key_sched.c */
! #endif
  #endif /* AFS_PTHREAD_ENV */
  
  #ifdef AFS_PTHREAD_ENV
Index: openafs/src/rxkad/domestic/fcrypt.c
diff -c openafs/src/rxkad/domestic/fcrypt.c:1.11.2.3 openafs/src/rxkad/domestic/fcrypt.c:1.11.2.4
*** openafs/src/rxkad/domestic/fcrypt.c:1.11.2.3	Mon May 30 00:57:38 2005
--- openafs/src/rxkad/domestic/fcrypt.c	Thu Jun  2 01:21:58 2005
***************
*** 20,26 ****
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/domestic/fcrypt.c,v 1.11.2.3 2005/05/30 04:57:38 shadow Exp $");
  
  #define DEBUG 0
  #ifdef KERNEL
--- 20,26 ----
  #endif
  
  RCSID
!     ("$Header: /cvs/openafs/src/rxkad/domestic/fcrypt.c,v 1.11.2.4 2005/06/02 05:21:58 shadow Exp $");
  
  #define DEBUG 0
  #ifdef KERNEL
***************
*** 112,120 ****
  	       fc_KeySchedule schedule, int encrypt)
  {
      afs_uint32 L, R;
!     afs_uint32 S, P;
!     unsigned char *Pchar = (unsigned char *)&P;
!     unsigned char *Schar = (unsigned char *)&S;
      int i;
  
  #if defined(vax) || (defined(mips) && defined(MIPSEL)) || defined(AFSLITTLE_ENDIAN)
--- 112,120 ----
  	       fc_KeySchedule schedule, int encrypt)
  {
      afs_uint32 L, R;
!     volatile afs_uint32 S, P;
!     volatile unsigned char *Pchar = (unsigned char *)&P;
!     volatile unsigned char *Schar = (unsigned char *)&S;
      int i;
  
  #if defined(vax) || (defined(mips) && defined(MIPSEL)) || defined(AFSLITTLE_ENDIAN)
Index: openafs/src/util/softsig.c
diff -c openafs/src/util/softsig.c:1.8 openafs/src/util/softsig.c:1.8.2.1
*** openafs/src/util/softsig.c:1.8	Sat Dec 27 20:26:32 2003
--- openafs/src/util/softsig.c	Thu Jun  2 00:41:30 2005
***************
*** 36,44 ****
  static struct {
      void (*handler) (int);
      int pending;
! #if !defined(AFS_DARWIN60_ENV)
      int fatal;
! #endif /* !defined(AFS_DARWIN60_ENV) */
      int inited;
  } softsig_sigs[NSIG];
  
--- 36,44 ----
  static struct {
      void (*handler) (int);
      int pending;
! #if !defined(AFS_DARWIN60_ENV) || !defined(AFS_NBSD_ENV)
      int fatal;
! #endif /* !defined(AFS_DARWIN60_ENV) || !defined(AFS_NBSD_ENV) */
      int inited;
  } softsig_sigs[NSIG];
  
***************
*** 53,69 ****
      pthread_sigmask(SIG_BLOCK, &ss, &os);
      pthread_sigmask(SIG_SETMASK, &os, NULL);
      sigaddset(&ss, SIGUSR1);
! #if defined(AFS_DARWIN60_ENV)
      pthread_sigmask (SIG_BLOCK, &ss, NULL);
      sigdelset (&os, SIGUSR1);
! #else /* !defined(AFS_DARWIN60_ENV) */
      for (i = 0; i < NSIG; i++) {
  	if (!sigismember(&os, i) && i != SIGSTOP && i != SIGKILL) {
  	    sigaddset(&ss, i);
  	    softsig_sigs[i].fatal = 1;
  	}
      }
! #endif /* defined(AFS_DARWIN60_ENV) */
  
      while (1) {
  	void (*h) (int);
--- 53,69 ----
      pthread_sigmask(SIG_BLOCK, &ss, &os);
      pthread_sigmask(SIG_SETMASK, &os, NULL);
      sigaddset(&ss, SIGUSR1);
! #if defined(AFS_DARWIN60_ENV) || defined(AFS_NBSD_ENV)
      pthread_sigmask (SIG_BLOCK, &ss, NULL);
      sigdelset (&os, SIGUSR1);
! #else /* !defined(AFS_DARWIN60_ENV) && !defined(AFS_NBSD_ENV) */
      for (i = 0; i < NSIG; i++) {
  	if (!sigismember(&os, i) && i != SIGSTOP && i != SIGKILL) {
  	    sigaddset(&ss, i);
  	    softsig_sigs[i].fatal = 1;
  	}
      }
! #endif /* defined(AFS_DARWIN60_ENV) || defined(AFS_NBSD_ENV) */
  
      while (1) {
  	void (*h) (int);
***************
*** 74,83 ****
  	for (i = 0; i < NSIG; i++) {
  	    if (softsig_sigs[i].handler && !softsig_sigs[i].inited) {
  		sigaddset(&ss, i);
! #if defined(AFS_DARWIN60_ENV)
  		pthread_sigmask (SIG_BLOCK, &ss, NULL);
  		sigdelset (&os, i);
! #endif /* defined(AFS_DARWIN60_ENV) */
  		softsig_sigs[i].inited = 1;
  	    }
  	    if (softsig_sigs[i].pending) {
--- 74,83 ----
  	for (i = 0; i < NSIG; i++) {
  	    if (softsig_sigs[i].handler && !softsig_sigs[i].inited) {
  		sigaddset(&ss, i);
! #if defined(AFS_DARWIN60_ENV) || defined(AFS_NBSD_ENV)
  		pthread_sigmask (SIG_BLOCK, &ss, NULL);
  		sigdelset (&os, i);
! #endif /* defined(AFS_DARWIN60_ENV) || defined(AFS_NBSD_ENV) */
  		softsig_sigs[i].inited = 1;
  	    }
  	    if (softsig_sigs[i].pending) {
***************
*** 87,102 ****
  	    }
  	}
  	if (i == NSIG) {
! #if defined(AFS_DARWIN60_ENV)
  	    sigsuspend (&os);
! #else /* !defined(AFS_DARWIN60_ENV) */
  	    sigwait(&ss, &sigw);
  	    if (sigw != SIGUSR1) {
  		if (softsig_sigs[sigw].fatal)
  		    exit(0);
  		softsig_sigs[sigw].pending = 1;
  	    }
! #endif /* defined(AFS_DARWIN60_ENV) */
  	} else if (h)
  	    h(i);
      }
--- 87,102 ----
  	    }
  	}
  	if (i == NSIG) {
! #if defined(AFS_DARWIN60_ENV) || defined(AFS_NBSD_ENV)
  	    sigsuspend (&os);
! #else /* !defined(AFS_DARWIN60_ENV) && !defined(AFS_NBSD_ENV) */
  	    sigwait(&ss, &sigw);
  	    if (sigw != SIGUSR1) {
  		if (softsig_sigs[sigw].fatal)
  		    exit(0);
  		softsig_sigs[sigw].pending = 1;
  	    }
! #endif /* defined(AFS_DARWIN60_ENV) || defined(AFS_NBSD_ENV) */
  	} else if (h)
  	    h(i);
      }
