aboutsummaryrefslogtreecommitdiff
path: root/sys/nfsserver
diff options
context:
space:
mode:
authorMatthew Dillon <dillon@FreeBSD.org>1999-12-13 17:07:03 +0000
committerMatthew Dillon <dillon@FreeBSD.org>1999-12-13 17:07:03 +0000
commitc9940d3b84adc3953690da23a830b96bebd9cf55 (patch)
treea673fb644f87cd4593c778d44bcc7c06429b615b /sys/nfsserver
parent8ca720cfae3758dc1bbc256652f27807d64eee62 (diff)
downloadsrc-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.c16
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;