disconnected-pioctl-error-recovery-20090121
authorSimon Wilkinson <sxw@inf.ed.ac.uk>
Wed, 21 Jan 2009 21:27:42 +0000 (21:27 +0000)
committerDerrick Brashear <shadow@dementia.org>
Wed, 21 Jan 2009 21:27:42 +0000 (21:27 +0000)
LICENSE IPL10
FIXES 124174

make reconnection possible by doing error recovery

src/afs/afs_pioctl.c
src/afs/afs_prototypes.h
src/afs/afs_server.c

index 2e469d3..4453dd2 100644 (file)
@@ -4685,12 +4685,14 @@ DECL_PIOCTL(PDiscon)
            ObtainWriteLock(&afs_discon_lock, 998);
 
            afs_in_sync = 1;
+           afs_MarkAllServersUp();
            code = afs_ResyncDisconFiles(areq, *acred);
            afs_in_sync = 0;
 
            if (code && !force) {
                printf("Files not synchronized properly, still in discon state. \n"
                       "Please retry or use \"force\".\n");
+               mode = 0;
            } else {
                if (force) {
                    afs_DisconDiscardAll(*acred);
@@ -4711,7 +4713,7 @@ DECL_PIOCTL(PDiscon)
 
     memcpy(aout, &mode, sizeof(afs_int32));
     *aoutSize = sizeof(afs_int32);
-    return 0;
+    return code;
 #else
     return EINVAL;
 #endif
index 2b5d1d4..0758771 100644 (file)
@@ -830,7 +830,7 @@ void afsi_SetServerIPRank(struct srvAddr *sa, struct in_ifaddr *ifa);
 extern int afs_HaveCallBacksFrom(struct server *aserver);
 extern void shutdown_server(void);
 extern void afs_RemoveAllConns(void);
-
+extern void afs_MarkAllServersUp(void);
 
 /* afs_osidnlc.c */
 extern int osi_dnlc_enter(struct vcache *adp, char *aname, struct vcache *avc,
index b2ed3ef..4638129 100644 (file)
@@ -1852,8 +1852,6 @@ void afs_ActivateServer(struct srvAddr *sap) {
     }
 }
 
-#ifdef AFS_DISCON_ENV
-
 void afs_RemoveAllConns()
 {
     int i;
@@ -1891,7 +1889,24 @@ void afs_RemoveAllConns()
     
 }
 
-#endif /* AFS_DISCON_ENV */
+void afs_MarkAllServersUp()
+{
+    int i;
+    struct server *ts;
+    struct srvAddr *sa;
+
+    ObtainWriteLock(&afs_xserver, 721);
+    ObtainWriteLock(&afs_xsrvAddr, 722);
+    for (i = 0; i< NSERVERS; i++) {
+       for (ts = afs_servers[i]; ts; ts = ts->next) {
+           for (sa = ts->addr; sa; sa = sa->next_sa) {
+               afs_MarkServerUpOrDown(sa, 0);
+           }
+       }
+    }
+    ReleaseWriteLock(&afs_xsrvAddr);
+    ReleaseWriteLock(&afs_xserver);
+}
 
 void shutdown_server()
 {