Lines Matching full:rp

277 #define	NETFAMILY(rp) \  argument
278 (((rp)->rc_flag & RC_INETIPV6) ? AF_INET6 : AF_INET)
283 static void nfsrc_lock(struct nfsrvcache *rp);
284 static void nfsrc_unlock(struct nfsrvcache *rp);
285 static void nfsrc_wanted(struct nfsrvcache *rp);
286 static void nfsrc_freecache(struct nfsrvcache *rp);
294 nfsrc_cachemutex(struct nfsrvcache *rp) in nfsrc_cachemutex() argument
297 if ((rp->rc_flag & RC_UDP) != 0) in nfsrc_cachemutex()
299 return (&NFSD_VNET(nfsrchash_table)[nfsrc_hash(rp->rc_xid)].mtx); in nfsrc_cachemutex()
377 struct nfsrvcache *rp; in nfsrc_getudp() local
388 LIST_FOREACH(rp, hp, rc_hash) { in nfsrc_getudp()
389 if (newrp->rc_xid == rp->rc_xid && in nfsrc_getudp()
390 newrp->rc_proc == rp->rc_proc && in nfsrc_getudp()
391 (newrp->rc_flag & rp->rc_flag & RC_NFSVERS) && in nfsrc_getudp()
392 nfsaddr_match(NETFAMILY(rp), &rp->rc_haddr, nd->nd_nam)) { in nfsrc_getudp()
393 if ((rp->rc_flag & RC_LOCKED) != 0) { in nfsrc_getudp()
394 rp->rc_flag |= RC_WANTED; in nfsrc_getudp()
395 (void)mtx_sleep(rp, mutex, (PZERO - 1) | PDROP, in nfsrc_getudp()
399 if (rp->rc_flag == 0) in nfsrc_getudp()
401 rp->rc_flag |= RC_LOCKED; in nfsrc_getudp()
402 TAILQ_REMOVE(&NFSD_VNET(nfsrvudplru), rp, rc_lru); in nfsrc_getudp()
403 TAILQ_INSERT_TAIL(&NFSD_VNET(nfsrvudplru), rp, rc_lru); in nfsrc_getudp()
404 if (rp->rc_flag & RC_INPROG) { in nfsrc_getudp()
408 } else if (rp->rc_flag & RC_REPSTATUS) { in nfsrc_getudp()
415 *(nd->nd_errp) = rp->rc_status; in nfsrc_getudp()
417 rp->rc_timestamp = NFSD_MONOSEC + in nfsrc_getudp()
419 } else if (rp->rc_flag & RC_REPMBUF) { in nfsrc_getudp()
422 nd->nd_mreq = m_copym(rp->rc_reply, 0, in nfsrc_getudp()
425 rp->rc_timestamp = NFSD_MONOSEC + in nfsrc_getudp()
430 nfsrc_unlock(rp); in nfsrc_getudp()
466 struct nfsrvcache *rp; in nfsrvd_updatecache() local
471 rp = nd->nd_rp; in nfsrvd_updatecache()
472 if (!rp) in nfsrvd_updatecache()
473 panic("nfsrvd_updatecache null rp"); in nfsrvd_updatecache()
475 mutex = nfsrc_cachemutex(rp); in nfsrvd_updatecache()
477 nfsrc_lock(rp); in nfsrvd_updatecache()
478 if (!(rp->rc_flag & RC_INPROG)) in nfsrvd_updatecache()
480 rp->rc_flag &= ~RC_INPROG; in nfsrvd_updatecache()
481 if (rp->rc_flag & RC_UDP) { in nfsrvd_updatecache()
482 TAILQ_REMOVE(&NFSD_VNET(nfsrvudplru), rp, rc_lru); in nfsrvd_updatecache()
483 TAILQ_INSERT_TAIL(&NFSD_VNET(nfsrvudplru), rp, rc_lru); in nfsrvd_updatecache()
495 if (!(rp->rc_flag & RC_REPMBUF)) in nfsrvd_updatecache()
497 nd->nd_mreq = m_copym(rp->rc_reply, 0, in nfsrvd_updatecache()
499 rp->rc_timestamp = NFSD_MONOSEC + nfsrc_tcptimeout; in nfsrvd_updatecache()
500 nfsrc_unlock(rp); in nfsrvd_updatecache()
510 (rp->rc_refcnt > 0 || in nfsrvd_updatecache()
511 ((nd->nd_flag & ND_SAVEREPLY) && (rp->rc_flag & RC_UDP)) || in nfsrvd_updatecache()
512 ((nd->nd_flag & ND_SAVEREPLY) && !(rp->rc_flag & RC_UDP) && in nfsrvd_updatecache()
515 if (rp->rc_refcnt > 0) { in nfsrvd_updatecache()
516 if (!(rp->rc_flag & RC_NFSV4)) in nfsrvd_updatecache()
518 rp->rc_flag |= RC_REFCNT; in nfsrvd_updatecache()
522 rp->rc_status = nd->nd_repstat; in nfsrvd_updatecache()
523 rp->rc_flag |= RC_REPSTATUS; in nfsrvd_updatecache()
526 if (!(rp->rc_flag & RC_UDP)) { in nfsrvd_updatecache()
537 rp->rc_reply = m; in nfsrvd_updatecache()
538 rp->rc_flag |= RC_REPMBUF; in nfsrvd_updatecache()
541 if (rp->rc_flag & RC_UDP) { in nfsrvd_updatecache()
542 rp->rc_timestamp = NFSD_MONOSEC + in nfsrvd_updatecache()
544 nfsrc_unlock(rp); in nfsrvd_updatecache()
546 rp->rc_timestamp = NFSD_MONOSEC + nfsrc_tcptimeout; in nfsrvd_updatecache()
547 if (rp->rc_refcnt > 0) in nfsrvd_updatecache()
548 nfsrc_unlock(rp); in nfsrvd_updatecache()
550 retrp = rp; in nfsrvd_updatecache()
553 nfsrc_freecache(rp); in nfsrvd_updatecache()
567 nfsrvd_delcache(struct nfsrvcache *rp) in nfsrvd_delcache() argument
571 mutex = nfsrc_cachemutex(rp); in nfsrvd_delcache()
572 if (!(rp->rc_flag & RC_INPROG)) in nfsrvd_delcache()
575 rp->rc_flag &= ~RC_INPROG; in nfsrvd_delcache()
576 if (rp->rc_refcnt == 0 && !(rp->rc_flag & RC_LOCKED)) in nfsrvd_delcache()
577 nfsrc_freecache(rp); in nfsrvd_delcache()
587 nfsrvd_sentcache(struct nfsrvcache *rp, int have_seq, uint32_t seq) in nfsrvd_sentcache() argument
591 KASSERT(rp->rc_flag & RC_LOCKED, ("nfsrvd_sentcache not locked")); in nfsrvd_sentcache()
593 hbp = NFSRCAHASH(rp->rc_sockref); in nfsrvd_sentcache()
595 rp->rc_tcpseq = seq; in nfsrvd_sentcache()
596 if (rp->rc_acked != RC_NO_ACK) in nfsrvd_sentcache()
597 LIST_INSERT_HEAD(&hbp->tbl, rp, rc_ahash); in nfsrvd_sentcache()
598 rp->rc_acked = RC_NO_ACK; in nfsrvd_sentcache()
601 nfsrc_unlock(rp); in nfsrvd_sentcache()
612 struct nfsrvcache *rp, *nextrp; in nfsrc_gettcp() local
629 rp = LIST_FIRST(hp); in nfsrc_gettcp()
630 while (rp != LIST_END(hp)) { in nfsrc_gettcp()
631 nextrp = LIST_NEXT(rp, rc_hash); in nfsrc_gettcp()
632 if (newrp->rc_xid == rp->rc_xid && in nfsrc_gettcp()
633 (!(rp->rc_flag & RC_INPROG) || in nfsrc_gettcp()
635 newrp->rc_sockref == rp->rc_sockref)) && in nfsrc_gettcp()
636 (newrp->rc_flag & rp->rc_flag & RC_NFSVERS) && in nfsrc_gettcp()
637 newrp->rc_proc == rp->rc_proc && in nfsrc_gettcp()
639 newrp->rc_sockref != rp->rc_sockref && in nfsrc_gettcp()
640 newrp->rc_cachetime >= rp->rc_cachetime) in nfsrc_gettcp()
641 && newrp->rc_reqlen == rp->rc_reqlen && in nfsrc_gettcp()
642 newrp->rc_cksum == rp->rc_cksum) { in nfsrc_gettcp()
643 LIST_REMOVE(rp, rc_hash); in nfsrc_gettcp()
644 LIST_INSERT_HEAD(&nfsrc_templist, rp, rc_hash); in nfsrc_gettcp()
646 rp = nextrp; in nfsrc_gettcp()
653 LIST_FOREACH(rp, &nfsrc_templist, rc_hash) { in nfsrc_gettcp()
655 if (rp->rc_refcnt > 0) { in nfsrc_gettcp()
667 hitrp = rp = LIST_FIRST(&nfsrc_templist); in nfsrc_gettcp()
668 while (rp != LIST_END(&nfsrc_templist)) { in nfsrc_gettcp()
669 nextrp = LIST_NEXT(rp, rc_hash); in nfsrc_gettcp()
670 LIST_REMOVE(rp, rc_hash); in nfsrc_gettcp()
671 LIST_INSERT_HEAD(hp, rp, rc_hash); in nfsrc_gettcp()
672 rp = nextrp; in nfsrc_gettcp()
678 rp = hitrp; in nfsrc_gettcp()
679 if ((rp->rc_flag & RC_LOCKED) != 0) { in nfsrc_gettcp()
680 rp->rc_flag |= RC_WANTED; in nfsrc_gettcp()
681 (void)mtx_sleep(rp, mutex, (PZERO - 1) | PDROP, in nfsrc_gettcp()
685 if (rp->rc_flag == 0) in nfsrc_gettcp()
687 rp->rc_flag |= RC_LOCKED; in nfsrc_gettcp()
688 if (rp->rc_flag & RC_INPROG) { in nfsrc_gettcp()
691 if (newrp->rc_sockref == rp->rc_sockref) in nfsrc_gettcp()
692 nfsrc_marksametcpconn(rp->rc_sockref); in nfsrc_gettcp()
694 } else if (rp->rc_flag & RC_REPSTATUS) { in nfsrc_gettcp()
700 if (newrp->rc_sockref == rp->rc_sockref) in nfsrc_gettcp()
701 nfsrc_marksametcpconn(rp->rc_sockref); in nfsrc_gettcp()
704 *(nd->nd_errp) = rp->rc_status; in nfsrc_gettcp()
705 rp->rc_timestamp = NFSD_MONOSEC + nfsrc_tcptimeout; in nfsrc_gettcp()
706 } else if (rp->rc_flag & RC_REPMBUF) { in nfsrc_gettcp()
709 if (newrp->rc_sockref == rp->rc_sockref) in nfsrc_gettcp()
710 nfsrc_marksametcpconn(rp->rc_sockref); in nfsrc_gettcp()
712 nd->nd_mreq = m_copym(rp->rc_reply, 0, in nfsrc_gettcp()
714 rp->rc_timestamp = NFSD_MONOSEC + nfsrc_tcptimeout; in nfsrc_gettcp()
718 nfsrc_unlock(rp); in nfsrc_gettcp()
745 nfsrc_lock(struct nfsrvcache *rp) in nfsrc_lock() argument
749 mutex = nfsrc_cachemutex(rp); in nfsrc_lock()
751 while ((rp->rc_flag & RC_LOCKED) != 0) { in nfsrc_lock()
752 rp->rc_flag |= RC_WANTED; in nfsrc_lock()
753 (void)mtx_sleep(rp, mutex, PZERO - 1, "nfsrc", 0); in nfsrc_lock()
755 rp->rc_flag |= RC_LOCKED; in nfsrc_lock()
762 nfsrc_unlock(struct nfsrvcache *rp) in nfsrc_unlock() argument
766 mutex = nfsrc_cachemutex(rp); in nfsrc_unlock()
768 rp->rc_flag &= ~RC_LOCKED; in nfsrc_unlock()
769 nfsrc_wanted(rp); in nfsrc_unlock()
777 nfsrc_wanted(struct nfsrvcache *rp) in nfsrc_wanted() argument
779 if (rp->rc_flag & RC_WANTED) { in nfsrc_wanted()
780 rp->rc_flag &= ~RC_WANTED; in nfsrc_wanted()
781 wakeup((caddr_t)rp); in nfsrc_wanted()
790 nfsrc_freecache(struct nfsrvcache *rp) in nfsrc_freecache() argument
794 LIST_REMOVE(rp, rc_hash); in nfsrc_freecache()
795 if (rp->rc_flag & RC_UDP) { in nfsrc_freecache()
796 TAILQ_REMOVE(&NFSD_VNET(nfsrvudplru), rp, rc_lru); in nfsrc_freecache()
798 } else if (rp->rc_acked != RC_NO_SEQ) { in nfsrc_freecache()
799 hbp = NFSRCAHASH(rp->rc_sockref); in nfsrc_freecache()
801 if (rp->rc_acked == RC_NO_ACK) in nfsrc_freecache()
802 LIST_REMOVE(rp, rc_ahash); in nfsrc_freecache()
805 nfsrc_wanted(rp); in nfsrc_freecache()
806 if (rp->rc_flag & RC_REPMBUF) { in nfsrc_freecache()
807 m_freem(rp->rc_reply); in nfsrc_freecache()
808 if (!(rp->rc_flag & RC_UDP)) in nfsrc_freecache()
811 free(rp, M_NFSRVCACHE); in nfsrc_freecache()
821 struct nfsrvcache *rp, *nextrp; in nfsrvd_cleancache() local
825 LIST_FOREACH_SAFE(rp, &NFSD_VNET(nfsrchash_table)[i].tbl, in nfsrvd_cleancache()
827 nfsrc_freecache(rp); in nfsrvd_cleancache()
830 LIST_FOREACH_SAFE(rp, &NFSD_VNET(nfsrvudphashtbl)[i], rc_hash, in nfsrvd_cleancache()
832 nfsrc_freecache(rp); in nfsrvd_cleancache()
847 struct nfsrvcache *rp, *nextrp; in nfsrc_trimcache() local
856 LIST_FOREACH_SAFE(rp, &hbp->tbl, rc_ahash, nextrp) { in nfsrc_trimcache()
857 if (sockref == rp->rc_sockref) { in nfsrc_trimcache()
858 if (SEQ_GEQ(snd_una, rp->rc_tcpseq)) { in nfsrc_trimcache()
859 rp->rc_acked = RC_ACK; in nfsrc_trimcache()
860 LIST_REMOVE(rp, rc_ahash); in nfsrc_trimcache()
862 rp->rc_acked = RC_NACK; in nfsrc_trimcache()
863 LIST_REMOVE(rp, rc_ahash); in nfsrc_trimcache()
877 TAILQ_FOREACH_SAFE(rp, &NFSD_VNET(nfsrvudplru), rc_lru, in nfsrc_trimcache()
879 if (!(rp->rc_flag & (RC_INPROG|RC_LOCKED|RC_WANTED)) in nfsrc_trimcache()
880 && rp->rc_refcnt == 0 in nfsrc_trimcache()
881 && ((rp->rc_flag & RC_REFCNT) || in nfsrc_trimcache()
882 udp_lasttrim > rp->rc_timestamp || in nfsrc_trimcache()
885 nfsrc_freecache(rp); in nfsrc_trimcache()
914 LIST_FOREACH_SAFE(rp, in nfsrc_trimcache()
917 if (!(rp->rc_flag & in nfsrc_trimcache()
919 && rp->rc_refcnt == 0) { in nfsrc_trimcache()
920 if ((rp->rc_flag & RC_REFCNT) || in nfsrc_trimcache()
921 tcp_lasttrim > rp->rc_timestamp || in nfsrc_trimcache()
922 rp->rc_acked == RC_ACK) { in nfsrc_trimcache()
923 nfsrc_freecache(rp); in nfsrc_trimcache()
935 j = rp->rc_timestamp - tcp_lasttrim; in nfsrc_trimcache()
965 LIST_FOREACH_SAFE(rp, in nfsrc_trimcache()
968 if (!(rp->rc_flag & in nfsrc_trimcache()
970 && rp->rc_refcnt == 0 in nfsrc_trimcache()
971 && ((rp->rc_flag & RC_REFCNT) || in nfsrc_trimcache()
972 thisstamp > rp->rc_timestamp || in nfsrc_trimcache()
973 rp->rc_acked == RC_ACK)) in nfsrc_trimcache()
974 nfsrc_freecache(rp); in nfsrc_trimcache()
987 nfsrvd_refcache(struct nfsrvcache *rp) in nfsrvd_refcache() argument
991 if (rp == NULL) in nfsrvd_refcache()
994 mutex = nfsrc_cachemutex(rp); in nfsrvd_refcache()
996 if (rp->rc_refcnt < 0) in nfsrvd_refcache()
998 rp->rc_refcnt++; in nfsrvd_refcache()
1006 nfsrvd_derefcache(struct nfsrvcache *rp) in nfsrvd_derefcache() argument
1010 mutex = nfsrc_cachemutex(rp); in nfsrvd_derefcache()
1012 if (rp->rc_refcnt <= 0) in nfsrvd_derefcache()
1014 rp->rc_refcnt--; in nfsrvd_derefcache()
1015 if (rp->rc_refcnt == 0 && !(rp->rc_flag & (RC_LOCKED | RC_INPROG))) in nfsrvd_derefcache()
1016 nfsrc_freecache(rp); in nfsrvd_derefcache()