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 /sys/src | |
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.
Diffstat (limited to 'sys/src')
-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(); } |