ref: 02b5531545bd9933ba8a520a12a922550e4aadc4
parent: 0879c4f7fb3412bac963e42cd821167630835350
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Jan 27 17:14:26 EST 2015
devmnt: handle rpc buffer exhaustion on mntflushalloc() this bug happens when the kernel runs out of mount rpc buffers when allocating a flush rpc. in this case, mntflushalloc() will errorjump out of mountio() leaving the currently in flight rpc in the mount. the caller of mountrpc()/mountio() frees the rpc thats still queued in the mount leaving to interesting results. for the fix, we add a waserror() arround mntflushalloc() and handle the error case like a mount rpc failure which will properly dequeue the rpc's in flight.
--- a/sys/src/9/port/devmnt.c
+++ b/sys/src/9/port/devmnt.c
@@ -774,7 +774,7 @@
while(waserror()) {if(m->rip == up)
mntgate(m);
- if(strcmp(up->errstr, Eintr) != 0){+ if(strcmp(up->errstr, Eintr) != 0 || waserror()){r = mntflushfree(m, r);
switch(r->request.type){case Tremove:
@@ -786,6 +786,7 @@
nexterror();
}
r = mntflushalloc(r, m->msize);
+ poperror();
}
lock(m);
--
⑨