diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-04-28 05:59:10 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-04-28 05:59:10 +0200 |
commit | 2c2a71cd515dbd28a87b4ae85080775675a3e135 (patch) | |
tree | ffa2daee9fbc48e273c70303c4c039a100553dba | |
parent | 219c3121638214be8f1d4750510729a058fe2c8e (diff) |
devmnt: abandon fid on botched Tclunk or Tremove
if theres an error transmitting a Tclunk or Tremove request,
we cannot assume the fid to be clunked. in case this was
a transient error, reusing the fid on further requests
will fail.
as a work arround, we zero the channels fid and allocate
a new fid before the chan is reused.
this is not correct as we essentially leak the fid
on the fileserver, but we will still be able to use
the mount.
-rw-r--r-- | sys/src/9/port/chan.c | 15 | ||||
-rw-r--r-- | sys/src/9/port/devmnt.c | 7 |
2 files changed, 14 insertions, 8 deletions
diff --git a/sys/src/9/port/chan.c b/sys/src/9/port/chan.c index 7f91578e6..d49301201 100644 --- a/sys/src/9/port/chan.c +++ b/sys/src/9/port/chan.c @@ -225,20 +225,19 @@ newchan(void) lock(&chanalloc); c = chanalloc.free; - if(c != 0){ + if(c != nil){ chanalloc.free = c->next; - c->next = 0; - } - unlock(&chanalloc); - - if(c == nil){ + c->next = nil; + } else { + unlock(&chanalloc); c = smalloc(sizeof(Chan)); lock(&chanalloc); - c->fid = ++chanalloc.fid; c->link = chanalloc.list; chanalloc.list = c; - unlock(&chanalloc); } + if(c->fid == 0) + c->fid = ++chanalloc.fid; + unlock(&chanalloc); /* if you get an error before associating with a dev, close calls rootclose, a nop */ diff --git a/sys/src/9/port/devmnt.c b/sys/src/9/port/devmnt.c index 926b6ee61..d073b7064 100644 --- a/sys/src/9/port/devmnt.c +++ b/sys/src/9/port/devmnt.c @@ -777,6 +777,13 @@ mountio(Mnt *m, Mntrpc *r) if(m->rip == up) mntgate(m); if(strcmp(up->errstr, Eintr) != 0){ + switch(r->request.type){ + case Tremove: + case Tclunk: + /* botch, abandon fid */ + if(strcmp(up->errstr, Ehungup) != 0) + r->c->fid = 0; + } mntflushfree(m, r); nexterror(); } |