summaryrefslogtreecommitdiffstats
path: root/sys/nfsserver/nfs_srvcache.c
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>1999-12-13 17:07:03 +0000
committerdillon <dillon@FreeBSD.org>1999-12-13 17:07:03 +0000
commitb01e2d179672c9331310ea480de27b2986b88962 (patch)
tree21964a2647cbe55783b2a292a752f751470df3b0 /sys/nfsserver/nfs_srvcache.c
parentb61f7b256bf51ff42fd715c4082c973085a551d0 (diff)
downloadFreeBSD-src-b01e2d179672c9331310ea480de27b2986b88962.zip
FreeBSD-src-b01e2d179672c9331310ea480de27b2986b88962.tar.gz
PR: kern/15222
Submitted by: Ian Dowse <iedowse@maths.tcd.ie>
Diffstat (limited to 'sys/nfsserver/nfs_srvcache.c')
-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 b866cbe..6f9d42f 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;
OpenPOWER on IntegriCloud