- rp = nfsrvcachehead.rc_prev;
- while ((rp->rc_flag & RC_LOCKED) != 0) {
- rp->rc_flag |= RC_WANTED;
- (void) tsleep((caddr_t)rp, PZERO-1, "nfsrc", 0);
- rp = nfsrvcachehead.rc_prev;
- }
- rp->rc_flag |= RC_LOCKED;
- remque(rp);
- if (rp->rc_prev != &nfsrvcachehead) {
+ if (numnfsrvcache < desirednfsrvcache) {
+ rp = (struct nfsrvcache *)malloc((u_long)sizeof *rp,
+ M_NFSD, M_WAITOK);
+ bzero((char *)rp, sizeof *rp);
+ numnfsrvcache++;
+ rp->rc_flag = RC_LOCKED;
+ } else {
+ rp = nfsrvlruhead;
+ while ((rp->rc_flag & RC_LOCKED) != 0) {
+ rp->rc_flag |= RC_WANTED;
+ (void) tsleep((caddr_t)rp, PZERO-1, "nfsrc", 0);
+ rp = nfsrvlruhead;
+ }
+ rp->rc_flag |= RC_LOCKED;
+ /* remove from hash chain */
+ if (rq = rp->rc_forw)
+ rq->rc_back = rp->rc_back;
+ *rp->rc_back = rq;
+ /* remove from LRU chain */
+ *rp->rc_prev = rp->rc_next;