linux-disconnected-avoid-ls-hang-20090119

LICENSE IPL10
FIXES 124152

avoid allowing a non-CStatd vcache to make its way into a readdir which causes an infinite loop
This commit is contained in:
Simon Wilkinson 2009-01-19 17:29:08 +00:00 committed by Derrick Brashear
parent df71f42b63
commit 9fa51694c6

View File

@ -2020,16 +2020,9 @@ afs_GetVCache(register struct VenusFid *afid, struct vrequest *areq,
} else { } else {
if (AFS_IS_DISCONNECTED) { if (AFS_IS_DISCONNECTED) {
if (AFS_IS_DISCON_RW) { /* Nothing to do otherwise...*/
if (vType(tvc) == VDIR) code = ENETDOWN;
OutStatus.FileType = Directory; printf("Network is down in afs_GetCache");
code = tvc?0:ENOENT;
} else {
/* Nothing to do otherwise...*/
code = ENETDOWN;
printf("Network is down in afs_GetCache");
}
} else } else
code = afs_FetchStatus(tvc, afid, areq, &OutStatus); code = afs_FetchStatus(tvc, afid, areq, &OutStatus);
@ -3288,10 +3281,8 @@ void afs_DisconGiveUpCallbacks() {
for (i = 0; i < VCSIZE; i++) { for (i = 0; i < VCSIZE; i++) {
for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) { for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) {
if ((tvc->states & CRO) == 0 && tvc->callback) { if ((tvc->states & CRO) == 0 && tvc->callback) {
/* XXX - should we check if the callback has expired here? */
afs_QueueVCB(tvc); afs_QueueVCB(tvc);
tvc->callback = NULL; tvc->callback = NULL;
tvc->states &- ~(CStatd | CUnique);
nq++; nq++;
} }
} }