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) {

Reply via email to