Index: arlad/arla.c
===================================================================
RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/arlad/arla.c,v
retrieving revision 1.159
diff -u -r1.159 arla.c
--- arlad/arla.c	2002/10/01 23:21:19	1.159
+++ arlad/arla.c	2002/12/17 16:40:41
@@ -465,3 +465,82 @@
 
     return 0;
 }
+
+/*
+ * Return true iff we should retry the operation depending on `ret'.
+ * Also replace `ce' with anonymous creds pulled from `cred' in case 
+ * it has expired. Drag along `fid' to be able to debug.
+ */
+
+int
+try_again (int *ret, CredCacheEntry **ce, 
+	   nnpfs_cred *cred, const VenusFid *fid)
+{
+    assert (ret != NULL);
+    assert (ce != NULL && *ce != NULL);
+    assert (cred != NULL);
+    assert (fid != NULL);
+    
+    switch (*ret) {
+#ifdef KERBEROS
+    case RXKADEXPIRED : 
+    case RXKADUNKNOWNKEY: {
+	int32_t cell = (*ce)->cell;
+
+	conn_clearcred (CONN_CS_CRED|CONN_CS_SECIDX, 0, cred->pag, 2);
+	cred_expire (*ce);
+	cred_free (*ce);
+	*ce = cred_get (cell, cred->pag, CRED_ANY);
+	return TRUE;
+    }
+    case RXKADSEALEDINCON :
+	arla_warnx_with_fid (ADEBWARN, fid,
+				 "seal error");
+	*ret = EINVAL;
+	return FALSE;
+#endif	 
+    case ARLA_VSALVAGE :
+	*ret = EIO;
+	return FALSE;
+    case ARLA_VNOVNODE :
+	*ret = ENOENT;
+	return FALSE;
+    case ARLA_VMOVED :
+    case ARLA_VNOVOL :  
+	/* XXX why test for fid != NULL here? */
+	if (fid && !volcache_reliablep (fid->fid.Volume, fid->Cell)) {
+	    return TRUE;
+	} else {
+	    *ret = ENOENT;
+	    return FALSE;
+	}
+    case ARLA_VOFFLINE :
+	*ret = ENETDOWN;
+	return FALSE;
+    case ARLA_VDISKFULL :
+	*ret = ENOSPC;
+	return FALSE;
+    case ARLA_VOVERQUOTA:
+#ifdef EDQUOT
+	*ret = EDQUOT;
+#else
+	*ret = ENOSPC;
+#endif
+	return FALSE;
+    case ARLA_VBUSY :
+	arla_warnx_with_fid (ADEBWARN, fid,
+				 "Waiting for busy volume...");
+	IOMGR_Sleep (afs_BusyWaitPeriod);
+	return TRUE;
+    case ARLA_VRESTARTING:
+	arla_warnx_with_fid (ADEBWARN, fid,
+				 "Waiting for fileserver to restart...");
+	IOMGR_Sleep (afs_BusyWaitPeriod);
+	return TRUE;
+    case ARLA_VIO :
+	*ret = EIO;
+	return FALSE;
+    default :
+	return FALSE;
+    }
+}
Index: arlad/arla_local.h
===================================================================
RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/arlad/arla_local.h,v
retrieving revision 1.83
diff -u -r1.83 arla_local.h
--- arlad/arla_local.h	2002/09/07 10:42:49	1.83
+++ arlad/arla_local.h	2002/12/17 16:40:57
@@ -203,6 +203,10 @@
 char *
 get_default_cache_dir (void);
 
+int
+try_again (int *ret, CredCacheEntry **ce, 
+	   nnpfs_cred *cred, const VenusFid *fid);
+
 #ifndef O_BINARY
 #define O_BINARY 0
 #endif
Index: arlad/fcache.c
===================================================================
RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/arlad/fcache.c,v
retrieving revision 1.404
diff -u -r1.404 fcache.c
--- arlad/fcache.c	2002/11/30 17:03:18	1.404
+++ arlad/fcache.c	2002/12/17 17:17:33
@@ -1455,8 +1455,14 @@
 	    return NULL;
 	ve = e->volume;
     }
-
-    ret = volume_make_uptodate (ve, ce);
+    
+    {
+	nnpfs_cred tmpcred;
+	do { 
+	    ret = volume_make_uptodate (ve, ce);
+	    tmpcred.pag = ce->cred;
+	} while (try_again (&ret, &ce, &tmpcred, &(e->fid)));
+    }
     if (ret)
 	return NULL;
 
Index: arlad/messages.c
===================================================================
RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/arlad/messages.c,v
retrieving revision 1.304
diff -u -r1.304 messages.c
--- arlad/messages.c	2002/12/15 11:42:16	1.304
+++ arlad/messages.c	2002/12/17 16:41:25
@@ -293,80 +293,6 @@
 }
 
 /*
- * Return true iff we should retry the operation.
- * Also replace `ce' with anonymous creds in case it has expired.
- *
- * There must not be passed in any NULL pointers.
- */
-
-static int
-try_again (int *ret, CredCacheEntry **ce, nnpfs_cred *cred, const VenusFid *fid)
-{
-    switch (*ret) {
-#ifdef KERBEROS
-    case RXKADEXPIRED : 
-    case RXKADUNKNOWNKEY: {
-	int32_t cell = (*ce)->cell;
-
-	conn_clearcred (CONN_CS_CRED|CONN_CS_SECIDX, 0, cred->pag, 2);
-	cred_expire (*ce);
-	cred_free (*ce);
-	*ce = cred_get (cell, cred->pag, CRED_ANY);
-	assert (*ce != NULL);
-	return TRUE;
-    }
-    case RXKADSEALEDINCON :
-	arla_warnx_with_fid (ADEBWARN, fid,
-			     "seal error");
-	*ret = EINVAL;
-	return FALSE;
-#endif	 
-    case ARLA_VSALVAGE :
-	*ret = EIO;
-	return FALSE;
-    case ARLA_VNOVNODE :
-	*ret = ENOENT;
-	return FALSE;
-    case ARLA_VMOVED :
-    case ARLA_VNOVOL :
-	if (fid && !volcache_reliablep (fid->fid.Volume, fid->Cell)) {
-	    return TRUE;
-	} else {
-	    *ret = ENOENT;
-	    return FALSE;
-	}
-    case ARLA_VOFFLINE :
-	*ret = ENETDOWN;
-	return FALSE;
-    case ARLA_VDISKFULL :
-	*ret = ENOSPC;
-	return FALSE;
-    case ARLA_VOVERQUOTA:
-#ifdef EDQUOT
-	*ret = EDQUOT;
-#else
-	*ret = ENOSPC;
-#endif
-	return FALSE;
-    case ARLA_VBUSY :
-	arla_warnx_with_fid (ADEBWARN, fid,
-			     "Waiting for busy volume...");
-	IOMGR_Sleep (afs_BusyWaitPeriod);
-	return TRUE;
-    case ARLA_VRESTARTING:
-	arla_warnx_with_fid (ADEBWARN, fid,
-			     "Waiting for fileserver to restart...");
-	IOMGR_Sleep (afs_BusyWaitPeriod);
-	return TRUE;
-    case ARLA_VIO :
-	*ret = EIO;
-	return FALSE;
-    default :
-	return FALSE;
-    }
-}
-
-/*
  * Fetch data and retry if failing
  */
 
