diff options
author | dillon <dillon@FreeBSD.org> | 1999-12-13 17:07:03 +0000 |
---|---|---|
committer | dillon <dillon@FreeBSD.org> | 1999-12-13 17:07:03 +0000 |
commit | b01e2d179672c9331310ea480de27b2986b88962 (patch) | |
tree | 21964a2647cbe55783b2a292a752f751470df3b0 /sys/nfs/nfs_srvcache.c | |
parent | b61f7b256bf51ff42fd715c4082c973085a551d0 (diff) | |
download | FreeBSD-src-b01e2d179672c9331310ea480de27b2986b88962.zip FreeBSD-src-b01e2d179672c9331310ea480de27b2986b88962.tar.gz |
PR: kern/15222
Submitted by: Ian Dowse <iedowse@maths.tcd.ie>
Diffstat (limited to 'sys/nfs/nfs_srvcache.c')
-rw-r--r-- | sys/nfs/nfs_srvcache.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/nfs/nfs_srvcache.c b/sys/nfs/nfs_srvcache.c index b866cbe..6f9d42f 100644 --- a/sys/nfs/nfs_srvcache.c +++ b/sys/nfs/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; |