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.
This commit is contained in:
parent
72be22cd3a
commit
e823ddb3b0
|
@ -774,7 +774,7 @@ mountio(Mnt *m, Mntrpc *r)
|
||||||
while(waserror()) {
|
while(waserror()) {
|
||||||
if(m->rip == up)
|
if(m->rip == up)
|
||||||
mntgate(m);
|
mntgate(m);
|
||||||
if(strcmp(up->errstr, Eintr) != 0){
|
if(strcmp(up->errstr, Eintr) != 0 || waserror()){
|
||||||
r = mntflushfree(m, r);
|
r = mntflushfree(m, r);
|
||||||
switch(r->request.type){
|
switch(r->request.type){
|
||||||
case Tremove:
|
case Tremove:
|
||||||
|
@ -786,6 +786,7 @@ mountio(Mnt *m, Mntrpc *r)
|
||||||
nexterror();
|
nexterror();
|
||||||
}
|
}
|
||||||
r = mntflushalloc(r, m->msize);
|
r = mntflushalloc(r, m->msize);
|
||||||
|
poperror();
|
||||||
}
|
}
|
||||||
|
|
||||||
lock(m);
|
lock(m);
|
||||||
|
|
Loading…
Reference in a new issue