diff options
author | Matthew Dillon <dillon@FreeBSD.org> | 1999-12-13 17:07:03 +0000 |
---|---|---|
committer | Matthew Dillon <dillon@FreeBSD.org> | 1999-12-13 17:07:03 +0000 |
commit | c9940d3b84adc3953690da23a830b96bebd9cf55 (patch) | |
tree | a673fb644f87cd4593c778d44bcc7c06429b615b /sys/nfsserver | |
parent | 8ca720cfae3758dc1bbc256652f27807d64eee62 (diff) | |
download | src-c9940d3b84adc3953690da23a830b96bebd9cf55.tar.gz src-c9940d3b84adc3953690da23a830b96bebd9cf55.zip |
PR: kern/15222
Submitted by: Ian Dowse <iedowse@maths.tcd.ie>
Notes
Notes:
svn path=/head/; revision=54564
Diffstat (limited to 'sys/nfsserver')
-rw-r--r-- | sys/nfsserver/nfs_srvcache.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/nfsserver/nfs_srvcache.c b/sys/nfsserver/nfs_srvcache.c index b866cbe67813..6f9d42f422af 100644 --- a/sys/nfsserver/nfs_srvcache.c +++ b/sys/nfsserver/nfs_srvcache.c @@ -293,6 +293,18 @@ loop: goto loop; } rp->rc_flag |= RC_LOCKED; + if (rp->rc_state == RC_DONE) { + /* + * This can occur if the cache is too small. + * Retransmits of the same request aren't + * dropped so we may see the operation + * complete more then once. + */ + if (rp->rc_flag & RC_REPMBUF) { + m_freem(rp->rc_reply); + rp->rc_flag &= ~RC_REPMBUF; + } + } rp->rc_state = RC_DONE; /* * If we have a valid reply update status and save @@ -332,6 +344,10 @@ nfsrv_cleancache() nextrp = rp->rc_lru.tqe_next; LIST_REMOVE(rp, rc_hash); TAILQ_REMOVE(&nfsrvlruhead, rp, rc_lru); + if (rp->rc_flag & RC_REPMBUF) + m_freem(rp->rc_reply); + if (rp->rc_flag & RC_NAM) + free(rp->rc_nam, M_SONAME); free(rp, M_NFSD); } numnfsrvcache = 0; |