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 */