]> git.lizzy.rs Git - plan9front.git/commitdiff
devmnt: make abandoning fid on botched clunk handle flushes
authorcinap_lenrek <cinap_lenrek@felloff.net>
Mon, 28 Apr 2014 04:55:06 +0000 (06:55 +0200)
committercinap_lenrek <cinap_lenrek@felloff.net>
Mon, 28 Apr 2014 04:55:06 +0000 (06:55 +0200)
make mntflushfree() return the original rpc and do the
botched clunk check on the original instead of the
current rpc.

so if we get a botched flush of a clunk, we abandon the
fid of the channel as well.

sys/src/9/port/devmnt.c

index d073b70642a5361536aea727d39b222aec672874..cce379095e4835cea192b04b114107ba3c8e9a75 100644 (file)
@@ -58,7 +58,7 @@ struct Mntalloc
 Mnt*   mntchk(Chan*);
 void   mntdirfix(uchar*, Chan*);
 Mntrpc*        mntflushalloc(Mntrpc*, ulong);
-void   mntflushfree(Mnt*, Mntrpc*);
+Mntrpc*        mntflushfree(Mnt*, Mntrpc*);
 void   mntfree(Mntrpc*);
 void   mntgate(Mnt*);
 void   mntqrm(Mnt*, Mntrpc*);
@@ -777,6 +777,7 @@ mountio(Mnt *m, Mntrpc *r)
                if(m->rip == up)
                        mntgate(m);
                if(strcmp(up->errstr, Eintr) != 0){
+                       r = mntflushfree(m, r);
                        switch(r->request.type){
                        case Tremove:
                        case Tclunk:
@@ -784,7 +785,6 @@ mountio(Mnt *m, Mntrpc *r)
                                if(strcmp(up->errstr, Ehungup) != 0)
                                        r->c->fid = 0;
                        }
-                       mntflushfree(m, r);
                        nexterror();
                }
                r = mntflushalloc(r, m->msize);
@@ -1007,9 +1007,9 @@ mntflushalloc(Mntrpc *r, ulong iounit)
  *  flush and the original message from the unanswered
  *  request queue.  Mark the original message as done
  *  and if it hasn't been answered set the reply to to
- *  Rflush.
+ *  Rflush. Return the original rpc.
  */
-void
+Mntrpc*
 mntflushfree(Mnt *m, Mntrpc *r)
 {
        Mntrpc *fr;
@@ -1020,10 +1020,12 @@ mntflushfree(Mnt *m, Mntrpc *r)
                        r->reply.type = Rflush;
                        mntqrm(m, r);
                }
-               if(fr)
-                       mntfree(r);
+               if(fr == nil)
+                       break;
+               mntfree(r);
                r = fr;
        }
+       return r;
 }
 
 int