]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Windows: force vldb lookup if server list is empty
authorJeffrey Altman <jaltman@your-file-system.com>
Wed, 20 Jun 2012 04:05:44 +0000 (00:05 -0400)
committerJeffrey Altman <jaltman@your-file-system.com>
Tue, 3 Jul 2012 16:05:56 +0000 (09:05 -0700)
The Windows cache manager can mark server references as "deleted"
which can give the impression that a server reference list is not
empty when it is.  If the volume list is empty any attempt to
issue an RPC would fail with a CM_ERROR_ALLDOWN error.  Since the
VLDB data is current, this condition will remain for two hours.

This patchset adds a new error, CM_ERROR_EMPTY, which is returned
when the server reference list is empty.  cm_Analyze() is modified
to process the CM_ERROR_EMPTY error by attempting to update the
server reference list.  If the update succeeds and the list is no
longer empty, the RPC is retried.  Otherwise, the RPC fails as
before.

Change-Id: I13891c28ec9916bdd03c1b02e1c9049ed0581ed3
Reviewed-on: http://gerrit.openafs.org/7637
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>
Tested-by: Jeffrey Altman <jaltman@your-file-system.com>
14 files changed:
src/WINNT/afsd/cm_callback.c
src/WINNT/afsd/cm_cell.c
src/WINNT/afsd/cm_conn.c
src/WINNT/afsd/cm_conn.h
src/WINNT/afsd/cm_dcache.c
src/WINNT/afsd/cm_error.h
src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/cm_server.c
src/WINNT/afsd/cm_server.h
src/WINNT/afsd/cm_vnodeops.c
src/WINNT/afsd/cm_volume.c
src/WINNT/afsd/cm_volume.h
src/WINNT/afsd/smb.c
src/WINNT/afsrdr/user/RDRFunction.c

index 9604ac1a127ed41c437f17e76ba690970eaf77c4..fdcd9476709f2fe2309fc90428e6c5c1e39c8954 100644 (file)
@@ -1862,7 +1862,7 @@ long cm_GetCallback(cm_scache_t *scp, struct cm_user *userp,
                                      &afsStatus, &callback, &volSync);
             rx_PutConnection(rxconnp);
 
-        } while (cm_Analyze(connp, userp, reqp, &sfid, 0, &volSync, NULL,
+        } while (cm_Analyze(connp, userp, reqp, &sfid, NULL, 0, &volSync, NULL,
                             &cbr, code));
         code = cm_MapRPCError(code, reqp);
         if (code)
index cf0448f3c066fa0c0079a67be71fa59bcb4eaca6..3c344062bddd6ea0e4e23dd6887d4085e30aa026 100644 (file)
@@ -92,7 +92,7 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags)
     }
 #endif
 
-    if ((cp->vlServersp == NULL) ||
+    if (cm_IsServerListEmpty(cp->vlServersp) ||
         (time(0) > cp->timeout) ||
         (cm_dnsEnabled &&
          (cp->flags & CM_CELLFLAG_DNS) &&
index 8f865e00dc3c3293f82ce8b50e2c591dfe10f8c2..2f950ae7463a5f8589484c6925c33dede21fd73f 100644 (file)
@@ -286,7 +286,7 @@ cm_ResetServerBusyStatus(cm_serverRef_t *serversp)
  *
  * If the error code is from cm_ConnFromFID() or friends, connp will be NULL.
  *
- * For VLDB calls, fidp will be NULL.
+ * For VLDB calls, fidp will be NULL and cellp will not be.
  *
  * volSyncp and/or cbrp may also be NULL.
  */
@@ -295,6 +295,7 @@ cm_Analyze(cm_conn_t *connp,
            cm_user_t *userp,
            cm_req_t *reqp,
            struct cm_fid *fidp,
+           cm_cell_t *cellp,
            afs_uint32 storeOp,
            AFSVolSync *volSyncp,
            cm_serverRef_t * serversp,
@@ -304,7 +305,6 @@ cm_Analyze(cm_conn_t *connp,
     cm_server_t *serverp = NULL;
     cm_serverRef_t **serverspp = NULL;
     cm_serverRef_t *tsrp;
-    cm_cell_t  *cellp = NULL;
     cm_ucell_t *ucellp;
     cm_volume_t * volp = NULL;
     cm_vol_state_t *statep = NULL;
@@ -404,6 +404,38 @@ cm_Analyze(cm_conn_t *connp,
          */
     }
 
+    else if (errorCode == CM_ERROR_EMPTY) {
+        /*
+         * The server list is empty (or all entries have been deleted).
+         * If fidp is NULL, this was a vlServer list and we can attempt
+         * to force a cell lookup.  If fidp is not NULL, we can attempt
+         * to refresh the volume location list.
+         */
+        if (fidp) {
+            code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp,
+                                     CM_GETVOL_FLAG_NO_LRU_UPDATE,
+                                     &volp);
+            if (code == 0) {
+                if (cm_UpdateVolumeLocation(cellp, userp, reqp, volp) == 0) {
+                    code = cm_GetServerList(fidp, userp, reqp, &replicated, &serverspp);
+                    if (code == 0) {
+                        if (!cm_IsServerListEmpty(*serverspp))
+                            retry = 1;
+                        cm_FreeServerList(serverspp, 0);
+                    }
+                }
+
+                lock_ObtainRead(&cm_volumeLock);
+                cm_PutVolume(volp);
+                lock_ReleaseRead(&cm_volumeLock);
+                volp = NULL;
+            }
+        } else {
+            cm_cell_t * newCellp = cm_UpdateCell( cellp, 0);
+            if (newCellp)
+                retry = 1;
+        }
+    }
     else if (errorCode == CM_ERROR_ALLDOWN) {
        /* Servers marked DOWN will be restored by the background daemon
         * thread as they become available.  The volume status is
@@ -419,7 +451,6 @@ cm_Analyze(cm_conn_t *connp,
             osi_Log0(afsd_logp, "cm_Analyze passed CM_ERROR_ALLDOWN (VL Server)");
         }
     }
-
     else if (errorCode == CM_ERROR_ALLOFFLINE) {
         /* Volume instances marked offline will be restored by the
          * background daemon thread as they become available
@@ -1079,7 +1110,7 @@ cm_Analyze(cm_conn_t *connp,
                  errorCode);
         if (!dead_session) {
             lock_ObtainMutex(&userp->mx);
-            ucellp = cm_GetUCell(userp, serverp->cellp);
+            ucellp = cm_GetUCell(userp, cellp);
             if (ucellp->ticketp) {
                 free(ucellp->ticketp);
                 ucellp->ticketp = NULL;
@@ -1295,15 +1326,15 @@ long cm_ConnByMServers(cm_serverRef_t *serversp, afs_uint32 replicated, cm_user_
     cm_serverRef_t *tsrp;
     cm_server_t *tsp;
     long firstError = 0;
-    int someBusy = 0, someOffline = 0, allOffline = 1, allBusy = 1, allDown = 1;
+    int someBusy = 0, someOffline = 0, allOffline = 1, allBusy = 1, allDown = 1, allDeleted = 1;
 #ifdef SET_RX_TIMEOUTS_TO_TIMELEFT
     long timeUsed, timeLeft, hardTimeLeft;
 #endif
     *connpp = NULL;
 
     if (serversp == NULL) {
-       osi_Log1(afsd_logp, "cm_ConnByMServers returning 0x%x", CM_ERROR_ALLDOWN);
-       return CM_ERROR_ALLDOWN;
+       osi_Log1(afsd_logp, "cm_ConnByMServers returning 0x%x", CM_ERROR_EMPTY);
+       return CM_ERROR_EMPTY;
     }
 
 #ifdef SET_RX_TIMEOUTS_TO_TIMELEFT
@@ -1319,6 +1350,8 @@ long cm_ConnByMServers(cm_serverRef_t *serversp, afs_uint32 replicated, cm_user_
         if (tsrp->status == srv_deleted)
             continue;
 
+        allDeleted = 0;
+
         tsp = tsrp->server;
         if (reqp->errorServp) {
             /*
@@ -1376,7 +1409,9 @@ long cm_ConnByMServers(cm_serverRef_t *serversp, afs_uint32 replicated, cm_user_
     lock_ReleaseRead(&cm_serverLock);
 
     if (firstError == 0) {
-        if (allDown) {
+        if (allDeleted) {
+            firstError = CM_ERROR_EMPTY;
+        } else if (allDown) {
             firstError = (reqp->tokenError ? reqp->tokenError :
                           (reqp->idleError ? RX_CALL_TIMEOUT : CM_ERROR_ALLDOWN));
             /*
index b995f27673b15108ac92316a593fbffbf57709d4..ea5c0f5af1e62b032d2a29a7105a03e3e55de484 100644 (file)
@@ -138,7 +138,7 @@ extern void cm_InitConn(void);
 extern void cm_InitReq(cm_req_t *reqp);
 
 extern int cm_Analyze(cm_conn_t *connp, struct cm_user *up, struct cm_req *reqp,
-                      struct cm_fid *fidp,
+                      struct cm_fid *fidp, struct cm_cell *cellp,
                       afs_uint32 storeOp,
                       struct AFSVolSync *volInfop,
                       cm_serverRef_t * serversp,
index 3ee073d66cd99d3f2d38731e1b76c573cb42e36c..3517ea065e086ed346ccdadc38a44555708105fa 100644 (file)
@@ -375,7 +375,7 @@ long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags,
             osi_Log2(afsd_logp, "rx_EndCall converted 0x%x to 0x%x", code, code1);
             code = code1;
         }
-    } while (cm_Analyze(connp, userp, reqp, &scp->fid, 1, &volSync, NULL, NULL, code));
+    } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 1, &volSync, NULL, NULL, code));
 
     code = cm_MapRPCError(code, reqp);
 
@@ -564,7 +564,7 @@ long cm_StoreMini(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
         /* prefer StoreData error over rx_EndCall error */
         if (code == 0 && code1 != 0)
             code = code1;
-    } while (cm_Analyze(connp, userp, reqp, &scp->fid, 1, &volSync, NULL, NULL, code));
+    } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 1, &volSync, NULL, NULL, code));
     code = cm_MapRPCError(code, reqp);
 
     /* now, clean up our state */
@@ -2167,7 +2167,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp
             code = code1;
         osi_Log0(afsd_logp, "CALL FetchData DONE");
 
-    } while (cm_Analyze(connp, userp, reqp, &scp->fid, 0, &volSync, NULL, NULL, code));
+    } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &volSync, NULL, NULL, code));
 
   fetchingcompleted:
     code = cm_MapRPCError(code, reqp);
@@ -2545,7 +2545,7 @@ long cm_GetData(cm_scache_t *scp, osi_hyper_t *offsetp, char *datap, int data_le
             code = code1;
         osi_Log0(afsd_logp, "CALL FetchData DONE");
 
-    } while (cm_Analyze(connp, userp, reqp, &scp->fid, 0, &volSync, NULL, NULL, code));
+    } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &volSync, NULL, NULL, code));
 
   fetchingcompleted:
     code = cm_MapRPCError(code, reqp);
@@ -2765,7 +2765,7 @@ cm_VerifyStoreData(cm_bulkIO_t *biod, cm_scache_t *savedScp)
             code = code1;
         osi_Log0(afsd_logp, "CALL FetchData DONE");
 
-    } while (cm_Analyze(connp, userp, reqp, &scp->fid, 0, &volSync, NULL, NULL, code));
+    } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &volSync, NULL, NULL, code));
 
   fetchingcompleted:
     code = cm_MapRPCError(code, reqp);
index 782bea847d052d3892649ebe537cf5c4c30dced5..6715552efdfd65848e469c9596e96bfaa10e1f71 100644 (file)
@@ -76,6 +76,7 @@
 #define CM_ERROR_BADFORMAT              (CM_ERROR_BASE+62)
 #define CM_ERROR_RPC_MOREDATA          (CM_ERROR_BASE+63)
 #define CM_ERROR_BUFFER_OVERFLOW        (CM_ERROR_BASE+64)
+#define CM_ERROR_EMPTY                  (CM_ERROR_BASE+65)
 
 #endif /* OPENAFS_WINNT_AFSD_CM_ERROR_H */
 
index a0b7c12f381d8fabe1c98f98a11683ab1f5b9f90..1fc3abf6e6ca05751710a6dfb98559609841ceff 100644 (file)
@@ -439,7 +439,7 @@ cm_IoctlGetACL(cm_ioctl_t *ioctlp, cm_user_t *userp, cm_scache_t *scp, cm_req_t
             code = RXAFS_FetchACL(rxconnp, &afid, &acl, &fileStatus, &volSync);
             rx_PutConnection(rxconnp);
 
-        } while (cm_Analyze(connp, userp, reqp, &scp->fid, 0, &volSync, NULL, NULL, code));
+        } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &volSync, NULL, NULL, code));
         code = cm_MapRPCError(code, reqp);
 
         if (code)
@@ -537,7 +537,7 @@ cm_IoctlSetACL(struct cm_ioctl *ioctlp, struct cm_user *userp, cm_scache_t *scp,
             code = RXAFS_StoreACL(rxconnp, &fid, &acl, &fileStatus, &volSync);
             rx_PutConnection(rxconnp);
 
-        } while (cm_Analyze(connp, userp, reqp, &scp->fid, 1, &volSync, NULL, NULL, code));
+        } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 1, &volSync, NULL, NULL, code));
         code = cm_MapRPCError(code, reqp);
 
         /* invalidate cache info, since we just trashed the ACL cache */
@@ -710,7 +710,7 @@ cm_IoctlSetVolumeStatus(struct cm_ioctl *ioctlp, struct cm_user *userp, cm_scach
                                          &storeStat, volName, offLineMsg, motd);
             rx_PutConnection(rxconnp);
 
-        } while (cm_Analyze(tcp, userp, reqp, &scp->fid, 1, NULL, NULL, NULL, code));
+        } while (cm_Analyze(tcp, userp, reqp, &scp->fid, NULL, 1, NULL, NULL, NULL, code));
         code = cm_MapRPCError(code, reqp);
     }
 
@@ -786,7 +786,7 @@ cm_IoctlGetVolumeStatus(struct cm_ioctl *ioctlp, struct cm_user *userp, cm_scach
                                         &volStat, &Name, &OfflineMsg, &MOTD);
            rx_PutConnection(rxconnp);
 
-       } while (cm_Analyze(connp, userp, reqp, &scp->fid, 0, NULL, NULL, NULL, code));
+       } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, NULL, NULL, NULL, code));
        code = cm_MapRPCError(code, reqp);
     }
 
@@ -3324,17 +3324,18 @@ cm_CheckServersStatus(cm_serverRef_t *serversp)
     afs_int32 code = 0;
     cm_serverRef_t *tsrp;
     cm_server_t *tsp;
-    int someBusy = 0, someOffline = 0, allOffline = 1, allBusy = 1, allDown = 1;
+    int someBusy = 0, someOffline = 0, allOffline = 1, allBusy = 1, allDown = 1, allDeleted = 1;
 
     if (serversp == NULL) {
-       osi_Log1(afsd_logp, "cm_CheckServersStatus returning 0x%x", CM_ERROR_ALLDOWN);
-       return CM_ERROR_ALLDOWN;
+       osi_Log1(afsd_logp, "cm_CheckServersStatus returning 0x%x", CM_ERROR_EMPTY);
+       return CM_ERROR_EMPTY;
     }
 
     lock_ObtainRead(&cm_serverLock);
     for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
         if (tsrp->status == srv_deleted)
             continue;
+        allDeleted = 0;
         if (tsp = tsrp->server) {
             cm_GetServerNoLock(tsp);
             if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
@@ -3357,7 +3358,9 @@ cm_CheckServersStatus(cm_serverRef_t *serversp)
     }
     lock_ReleaseRead(&cm_serverLock);
 
-    if (allDown)
+    if (allDeleted)
+        code = CM_ERROR_EMPTY;
+    else if (allDown)
         code = CM_ERROR_ALLDOWN;
     else if (allBusy)
         code = CM_ERROR_ALLBUSY;
index 8aaf01262d4b7322983a29744e8bedacaba24f1d..614ba723ad20455057b926dcdb83c8de8b70f508 100644 (file)
@@ -1345,6 +1345,26 @@ void cm_RemoveVolumeFromServer(cm_server_t * serverp, afs_uint32 volID)
     }
 }
 
+int cm_IsServerListEmpty(cm_serverRef_t *serversp)
+{
+    cm_serverRef_t *tsrp;
+    int allDeleted = 1;
+
+    if (serversp == NULL)
+        return CM_ERROR_EMPTY;
+
+    lock_ObtainRead(&cm_serverLock);
+    for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
+        if (tsrp->status == srv_deleted)
+            continue;
+        allDeleted = 0;
+        break;
+    }
+    lock_ReleaseRead(&cm_serverLock);
+
+    return ( allDeleted ? CM_ERROR_EMPTY : 0 );
+}
+
 void cm_FreeServerList(cm_serverRef_t** list, afs_uint32 flags)
 {
     cm_serverRef_t  **current;
index 8e39721f835895f031c8809e5187e3dd8f4d0077..2202ff8248b1d16db84868df5aecf5e2333120ba 100644 (file)
@@ -147,6 +147,8 @@ extern int cm_DumpServers(FILE *outputFile, char *cookie, int lock);
 
 extern int cm_ServerEqual(cm_server_t *srv1, cm_server_t *srv2);
 
+extern int cm_IsServerListEmpty(cm_serverRef_t *serversp);
+
 /* Protected by cm_syscfgLock (rw) */
 extern int cm_noIPAddr;         /* number of client network interfaces */
 extern int cm_IPAddr[CM_MAXINTERFACE_ADDR];    /* client's IP address in host order */
index 36cefd47ce1b3f631fa79906ada544eccd9b2b59..f7e4be1d7a3d013c96159fd3e1b7135a8b7ef4f4 100644 (file)
@@ -1680,7 +1680,7 @@ long cm_Unlink(cm_scache_t *dscp, fschar_t *fnamep, clientchar_t * cnamep,
                                 &newDirStatus, &volSync);
         rx_PutConnection(rxconnp);
 
-    } while (cm_Analyze(connp, userp, reqp, &dscp->fid, 1, &volSync, NULL, NULL, code));
+    } while (cm_Analyze(connp, userp, reqp, &dscp->fid, NULL, 1, &volSync, NULL, NULL, code));
     code = cm_MapRPCError(code, reqp);
 
     if (code)
@@ -2484,7 +2484,7 @@ cm_TryBulkStatRPC(cm_scache_t *dscp, cm_bulkStat_t *bbp, cm_user_t *userp, cm_re
                         code = (&bbp->stats[0])->errorCode;
                 }
             }
-        } while (cm_Analyze(connp, userp, reqp, &tfid, 0, &volSync, NULL, &cbReq, code));
+        } while (cm_Analyze(connp, userp, reqp, &tfid, NULL, 0, &volSync, NULL, &cbReq, code));
         code = cm_MapRPCError(code, reqp);
 
         /*
@@ -2515,7 +2515,7 @@ cm_TryBulkStatRPC(cm_scache_t *dscp, cm_bulkStat_t *bbp, cm_user_t *userp, cm_re
 
             if (inlinebulk && (&bbp->stats[j])->errorCode) {
                 cm_req_t treq = *reqp;
-                cm_Analyze(NULL, userp, &treq, &tfid, 0, &volSync, NULL, &cbReq, (&bbp->stats[j])->errorCode);
+                cm_Analyze(NULL, userp, &treq, &tfid, NULL, 0, &volSync, NULL, &cbReq, (&bbp->stats[j])->errorCode);
                 switch ((&bbp->stats[j])->errorCode) {
                 case EACCES:
                 case UAEACCES:
@@ -2705,7 +2705,7 @@ cm_IsSpaceAvailable(cm_fid_t * fidp, osi_hyper_t *sizep, cm_user_t *userp, cm_re
                                      &volStat, &Name, &OfflineMsg, &MOTD);
         rx_PutConnection(rxconnp);
 
-    } while (cm_Analyze(connp, userp, reqp, fidp, 0, NULL, NULL, NULL, code));
+    } while (cm_Analyze(connp, userp, reqp, fidp, NULL, 0, NULL, NULL, NULL, code));
     code = cm_MapRPCError(code, reqp);
     if (code == 0) {
         if (volStat.MaxQuota) {
@@ -2887,7 +2887,7 @@ long cm_SetAttr(cm_scache_t *scp, cm_attr_t *attrp, cm_user_t *userp,
         rx_PutConnection(rxconnp);
 
     } while (cm_Analyze(connp, userp, reqp,
-                         &scp->fid, 1, &volSync, NULL, NULL, code));
+                         &scp->fid, NULL, 1, &volSync, NULL, NULL, code));
     code = cm_MapRPCError(code, reqp);
 
     if (code)
@@ -2999,7 +2999,7 @@ long cm_Create(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t *a
         rx_PutConnection(rxconnp);
 
     } while (cm_Analyze(connp, userp, reqp,
-                         &dscp->fid, 1, &volSync, NULL, &cbReq, code));
+                         &dscp->fid, NULL, 1, &volSync, NULL, &cbReq, code));
     code = cm_MapRPCError(code, reqp);
 
     if (code)
@@ -3191,7 +3191,7 @@ long cm_MakeDir(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t *
         rx_PutConnection(rxconnp);
 
     } while (cm_Analyze(connp, userp, reqp,
-                        &dscp->fid, 1, &volSync, NULL, &cbReq, code));
+                        &dscp->fid, NULL, 1, &volSync, NULL, &cbReq, code));
     code = cm_MapRPCError(code, reqp);
 
     if (code)
@@ -3322,7 +3322,7 @@ long cm_Link(cm_scache_t *dscp, clientchar_t *cnamep, cm_scache_t *sscp, long fl
         rx_PutConnection(rxconnp);
         osi_Log1(afsd_logp,"  RXAFS_Link returns 0x%x", code);
 
-    } while (cm_Analyze(connp, userp, reqp, &dscp->fid, 1, &volSync, NULL, NULL, code));
+    } while (cm_Analyze(connp, userp, reqp, &dscp->fid, NULL, 1, &volSync, NULL, NULL, code));
 
     code = cm_MapRPCError(code, reqp);
 
@@ -3438,7 +3438,7 @@ long cm_SymLink(cm_scache_t *dscp, clientchar_t *cnamep, fschar_t *contentsp, lo
         rx_PutConnection(rxconnp);
 
     } while (cm_Analyze(connp, userp, reqp,
-                         &dscp->fid, 1, &volSync, NULL, NULL, code));
+                         &dscp->fid, NULL, 1, &volSync, NULL, NULL, code));
     code = cm_MapRPCError(code, reqp);
 
     if (code)
@@ -3595,7 +3595,7 @@ long cm_RemoveDir(cm_scache_t *dscp, fschar_t *fnamep, clientchar_t *cnamep, cm_
         rx_PutConnection(rxconnp);
 
     } while (cm_Analyze(connp, userp, reqp,
-                        &dscp->fid, 1, &volSync, NULL, NULL, code));
+                        &dscp->fid, NULL, 1, &volSync, NULL, NULL, code));
     code = cm_MapRPCErrorRmdir(code, reqp);
 
     if (code)
@@ -3941,7 +3941,7 @@ long cm_Rename(cm_scache_t *oldDscp, fschar_t *oldNamep, clientchar_t *cOldNamep
                             &volSync);
         rx_PutConnection(rxconnp);
 
-    } while (cm_Analyze(connp, userp, reqp, &oldDscp->fid, 1,
+    } while (cm_Analyze(connp, userp, reqp, &oldDscp->fid, NULL, 1,
                          &volSync, NULL, NULL, code));
     code = cm_MapRPCError(code, reqp);
 
@@ -4643,7 +4643,7 @@ long cm_IntSetLock(cm_scache_t * scp, cm_user_t * userp, int lockType,
                              &volSync);
         rx_PutConnection(rxconnp);
 
-    } while (cm_Analyze(connp, userp, reqp, &cfid, 1, &volSync,
+    } while (cm_Analyze(connp, userp, reqp, &cfid, NULL, 1, &volSync,
                         NULL, NULL, code));
 
     code = cm_MapRPCError(code, reqp);
@@ -4705,7 +4705,7 @@ long cm_IntReleaseLock(cm_scache_t * scp, cm_user_t * userp,
         code = RXAFS_ReleaseLock(rxconnp, &tfid, &volSync);
         rx_PutConnection(rxconnp);
 
-    } while (cm_Analyze(connp, userp, reqp, &cfid, 1, &volSync,
+    } while (cm_Analyze(connp, userp, reqp, &cfid, NULL, 1, &volSync,
                         NULL, NULL, code));
     code = cm_MapRPCError(code, reqp);
     if (code)
@@ -5699,7 +5699,7 @@ void cm_CheckLocks()
                         osi_Log1(afsd_logp, "   ExtendLock returns %d", code);
 
                     } while (cm_Analyze(connp, userp, &req,
-                                        &cfid, 1, &volSync, NULL, NULL,
+                                        &cfid, NULL, 1, &volSync, NULL, NULL,
                                         code));
 
                     code = cm_MapRPCError(code, &req);
index e99d0240d89c3d298bc615a47ccae28954412d9f..c5e4bda15e51674022223db3d17e4ac7dd141b48 100644 (file)
@@ -203,7 +203,7 @@ cm_GetEntryByName( struct cm_cell *cellp, const char *name,
             *methodp = 0;
         }
         rx_PutConnection(rxconnp);
-    } while (cm_Analyze(connp, userp, reqp, NULL, 0, NULL, cellp->vlServersp, NULL, code));
+    } while (cm_Analyze(connp, userp, reqp, NULL, cellp, 0, NULL, cellp->vlServersp, NULL, code));
     code = cm_MapVLRPCError(code, reqp);
     if ( code )
         osi_Log3(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s FAILURE, code 0x%x",
@@ -449,7 +449,7 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *
                         rxconnp = cm_GetRxConn(connp);
                         code = VL_GetAddrsU(rxconnp, &attrs, &uuid, &unique, &nentries, &addrs);
                         rx_PutConnection(rxconnp);
-                    } while (cm_Analyze(connp, userp, reqp, NULL, 0, NULL, cellp->vlServersp, NULL, code));
+                    } while (cm_Analyze(connp, userp, reqp, NULL, cellp, 0, NULL, cellp->vlServersp, NULL, code));
 
                     if ( code ) {
                         code = cm_MapVLRPCError(code, reqp);
@@ -1323,7 +1323,7 @@ cm_CheckOfflineVolumeState(cm_volume_t *volp, cm_vol_state_t *statep, afs_uint32
                     code = RXAFS_GetVolumeStatus(rxconnp, statep->ID,
                                                  &volStat, &Name, &OfflineMsg, &MOTD);
                     rx_PutConnection(rxconnp);
-                } while (cm_Analyze(connp, cm_rootUserp, &req, &fid, 0, NULL, NULL, NULL, code));
+                } while (cm_Analyze(connp, cm_rootUserp, &req, &fid, NULL, 0, NULL, NULL, NULL, code));
                 code = cm_MapRPCError(code, &req);
 
                 lock_ObtainWrite(&volp->rw);
index e17dd2a9e0d2537e06c149cbf2bc1e1cfa09b56e..3addb4e19d831c40d279c5129fb8b161f4a28a93 100644 (file)
@@ -163,5 +163,8 @@ extern cm_vol_state_t * cm_VolumeStateByName(cm_volume_t *volp, char *volname);
 
 extern afs_int32 cm_VolumeType(cm_volume_t *volp, afs_uint32 id);
 
+extern long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp,
+                                    cm_volume_t *volp);
+
 extern osi_rwlock_t cm_volumeLock;
 #endif /*  OPENAFS_WINNT_AFSD_CM_VOLUME_H */
index 7610a88ea7f246f690319b0c71e140fedaa54504..8d699a450b81215f7953efc72d8f6498a92f90bf 100644 (file)
@@ -3260,7 +3260,9 @@ void smb_MapNTError(long code, unsigned long *NTStatusp, afs_uint32 redir)
         NTStatus = 0xC0020018L; /* RPC_NT_SERVER_TOO_BUSY */
 #endif
     }
-    else if (code == CM_ERROR_ALLOFFLINE || code == CM_ERROR_ALLDOWN) {
+    else if (code == CM_ERROR_ALLOFFLINE ||
+             code == CM_ERROR_ALLDOWN ||
+             code == CM_ERROR_EMPTY) {
 #ifdef COMMENT
         NTStatus = 0xC000003AL; /* Path not found */
 #else
index a53dcf6f9f53367cd8b4cfb708ae9c2b61b6e9f3..849bd1465e36ea22ee059fea4476bc057108fedf 100644 (file)
@@ -5078,7 +5078,7 @@ RDR_GetVolumeInfo( IN cm_user_t     *userp,
                                         &volStat, &Name, &OfflineMsg, &MOTD);
            rx_PutConnection(rxconnp);
 
-       } while (cm_Analyze(connp, userp, &req, &scp->fid, 0, NULL, NULL, NULL, code));
+       } while (cm_Analyze(connp, userp, &req, &scp->fid, NULL, 0, NULL, NULL, NULL, code));
        code = cm_MapRPCError(code, &req);
         if (code == 0) {
             if (volStat.MaxQuota)
@@ -5245,7 +5245,7 @@ RDR_GetVolumeSizeInfo( IN cm_user_t     *userp,
                                         &volStat, &Name, &OfflineMsg, &MOTD);
            rx_PutConnection(rxconnp);
 
-       } while (cm_Analyze(connp, userp, &req, &scp->fid, 0, NULL, NULL, NULL, code));
+       } while (cm_Analyze(connp, userp, &req, &scp->fid, NULL, 0, NULL, NULL, NULL, code));
        code = cm_MapRPCError(code, &req);
         if (code == 0) {
             if (volStat.MaxQuota)