ron,
this works for me but my symptoms were a little different than yours.
before:
mnt: proc cat 290: mismatch from #D/ssl/1/data /n/coraid/lib/unicode
rep 0x7fcd8c04e190 tag 4 fid 1603 T120 R117 rp 4
after:
WOOT! caught stale reply 6; type 117
note: the poor organization of this patch is geared toward keeping the
diff small. tagallocd and freetag should be moved above mountmux.
i didn't use russ' ed scripts because i was too lazy.
- erik
9vx version
; ; diff -c devmnt.c devmnt.c~
devmnt.c:945,954 - devmnt.c~:945,951
void
mountmux(Mnt *m, Mntrpc *r)
{
- int bad;
Mntrpc **l, *q;
- int tagallocd(int);
- void freetag(int);
lock(&m->lk);
l = &m->queue;
devmnt.c:977,992 - devmnt.c~:974,981
}
l = &q->list;
}
- bad = 1;
- if(tagallocd(r->reply.tag)){
- freetag(r->reply.tag);
- bad = 0;
- }
unlock(&m->lk);
- if(bad)
- print("unexpected reply tag %ud; type %d\n", r->reply.tag,
r->reply.type);
- else
- print("WOOT! caught stale reply %ud; type %d\n", r->reply.tag,
r->reply.type);
+ print("unexpected reply tag %ud; type %d\n", r->reply.tag,
r->reply.type);
}
/*
devmnt.c:1054,1065 - devmnt.c~:1043,1048
return NOTAG;
}
- int
- tagallocd(int t)
- {
- return mntalloc.tagmask[t>>TAGSHIFT] & 1<<(t&TAGMASK);
- }
-
void
freetag(int t)
{
devmnt.c:1125,1136 - devmnt.c~:1108,1116
if(mntalloc.nrpcfree >= 10){
free(r->rpc);
free(r);
- if(r->done != 2)
- freetag(r->request.tag);
+ freetag(r->request.tag);
}
else{
- if(r->done == 2)
- r->request.tag = alloctag();
r->list = mntalloc.rpcfree;
mntalloc.rpcfree = r;
mntalloc.nrpcfree++;
devmnt.c:1145,1151 - devmnt.c~:1125,1131
Mntrpc **l, *f;
lock(&m->lk);
- r->done = 2;
+ r->done = 1;
l = &m->queue;
for(f = *l; f; f = f->list) {
plan 9 version
; diffy -c devmnt.c
/n/dump/2009/0922/sys/src/9/port/devmnt.c:932,938 - devmnt.c:932,941
void
mountmux(Mnt *m, Mntrpc *r)
{
+ int bad;
Mntrpc **l, *q;
+ int tagallocd(int);
+ void freetag(int);
lock(m);
l = &m->queue;
/n/dump/2009/0922/sys/src/9/port/devmnt.c:961,968 - devmnt.c:964,977
}
l = &q->list;
}
+ bad = 1;
+ if(tagallocd(r->reply.tag)){
+ freetag(r->reply.tag);
+ bad = 0;
+ }
unlock(m);
- print("unexpected reply tag %ud; type %d\n", r->reply.tag,
r->reply.type);
+ if(bad)
+ print("unexpected reply tag %ud; type %d\n", r->reply.tag,
r->reply.type);
}
/*
/n/dump/2009/0922/sys/src/9/port/devmnt.c:1030,1035 - devmnt.c:1039,1050
return NOTAG;
}
+ int
+ tagallocd(int t)
+ {
+ return mntalloc.tagmask[t>>TAGSHIFT] & 1<<(t&TAGMASK);
+ }
+
void
freetag(int t)
{
/n/dump/2009/0922/sys/src/9/port/devmnt.c:1095,1103 - devmnt.c:1110,1121
if(mntalloc.nrpcfree >= 10){
free(r->rpc);
free(r);
- freetag(r->request.tag);
+ if(r->done != 2)
+ freetag(r->request.tag);
}
else{
+ if(r->done == 2)
+ r->request.tag = alloctag();
r->list = mntalloc.rpcfree;
mntalloc.rpcfree = r;
mntalloc.nrpcfree++;
/n/dump/2009/0922/sys/src/9/port/devmnt.c:1112,1118 - devmnt.c:1130,1136
Mntrpc **l, *f;
lock(m);
- r->done = 1;
+ r->done = 2;
l = &m->queue;
for(f = *l; f; f = f->list) {
------------------------------------------------------------------
plan 9 version
; - diffy
diffy -c devmnt.c
/n/dump/2009/0922/sys/src/9/port/devmnt.c:932,938 - devmnt.c:932,941
void
mountmux(Mnt *m, Mntrpc *r)
{
+ int bad;
Mntrpc **l, *q;
+ int tagallocd(int);
+ void freetag(int);
lock(m);
l = &m->queue;
/n/dump/2009/0922/sys/src/9/port/devmnt.c:961,968 - devmnt.c:964,979
}
l = &q->list;
}
+ bad = 1;
+ if(tagallocd(r->reply.tag)){
+ freetag(r->reply.tag);
+ bad = 0;
+ }
unlock(m);
- print("unexpected reply tag %ud; type %d\n", r->reply.tag,
r->reply.type);
+ if(bad)
+ print("unexpected reply tag %ud; type %d\n", r->reply.tag,
r->reply.type);
+ else
+ print("WOOT! caught stale reply %ud; type %d\n", r->reply.tag,
r->reply.type);
}
/*
/n/dump/2009/0922/sys/src/9/port/devmnt.c:1030,1035 - devmnt.c:1041,1052
return NOTAG;
}
+ int
+ tagallocd(int t)
+ {
+ return mntalloc.tagmask[t>>TAGSHIFT] & 1<<(t&TAGMASK);
+ }
+
void
freetag(int t)
{
/n/dump/2009/0922/sys/src/9/port/devmnt.c:1095,1103 - devmnt.c:1112,1123
if(mntalloc.nrpcfree >= 10){
free(r->rpc);
free(r);
- freetag(r->request.tag);
+ if(r->done != 2)
+ freetag(r->request.tag);
}
else{
+ if(r->done == 2)
+ r->request.tag = alloctag();
r->list = mntalloc.rpcfree;
mntalloc.rpcfree = r;
mntalloc.nrpcfree++;
/n/dump/2009/0922/sys/src/9/port/devmnt.c:1112,1118 - devmnt.c:1132,1138
Mntrpc **l, *f;
lock(m);
- r->done = 1;
+ r->done = 2;
l = &m->queue;
for(f = *l; f; f = f->list) {