Lines Matching refs:rp
278 #define NETFAMILY(rp) \
279 (((rp)->rc_flag & RC_INETIPV6) ? AF_INET6 : AF_INET)
284 static void nfsrc_lock(struct nfsrvcache *rp);
285 static void nfsrc_unlock(struct nfsrvcache *rp);
286 static void nfsrc_wanted(struct nfsrvcache *rp);
287 static void nfsrc_freecache(struct nfsrvcache *rp);
295 nfsrc_cachemutex(struct nfsrvcache *rp)
298 if ((rp->rc_flag & RC_UDP) != 0)
300 return (&nfsrchash_table[nfsrc_hash(rp->rc_xid)].mtx);
372 struct nfsrvcache *rp;
383 LIST_FOREACH(rp, hp, rc_hash) {
384 if (newrp->rc_xid == rp->rc_xid &&
385 newrp->rc_proc == rp->rc_proc &&
386 (newrp->rc_flag & rp->rc_flag & RC_NFSVERS) &&
387 nfsaddr_match(NETFAMILY(rp), &rp->rc_haddr, nd->nd_nam)) {
388 if ((rp->rc_flag & RC_LOCKED) != 0) {
389 rp->rc_flag |= RC_WANTED;
390 (void)mtx_sleep(rp, mutex, (PZERO - 1) | PDROP,
394 if (rp->rc_flag == 0)
396 rp->rc_flag |= RC_LOCKED;
397 TAILQ_REMOVE(&nfsrvudplru, rp, rc_lru);
398 TAILQ_INSERT_TAIL(&nfsrvudplru, rp, rc_lru);
399 if (rp->rc_flag & RC_INPROG) {
403 } else if (rp->rc_flag & RC_REPSTATUS) {
410 *(nd->nd_errp) = rp->rc_status;
412 rp->rc_timestamp = NFSD_MONOSEC +
414 } else if (rp->rc_flag & RC_REPMBUF) {
417 nd->nd_mreq = m_copym(rp->rc_reply, 0,
420 rp->rc_timestamp = NFSD_MONOSEC +
425 nfsrc_unlock(rp);
461 struct nfsrvcache *rp;
466 rp = nd->nd_rp;
467 if (!rp)
468 panic("nfsrvd_updatecache null rp");
470 mutex = nfsrc_cachemutex(rp);
472 nfsrc_lock(rp);
473 if (!(rp->rc_flag & RC_INPROG))
475 rp->rc_flag &= ~RC_INPROG;
476 if (rp->rc_flag & RC_UDP) {
477 TAILQ_REMOVE(&nfsrvudplru, rp, rc_lru);
478 TAILQ_INSERT_TAIL(&nfsrvudplru, rp, rc_lru);
489 if (!(rp->rc_flag & RC_REPMBUF))
491 nd->nd_mreq = m_copym(rp->rc_reply, 0,
493 rp->rc_timestamp = NFSD_MONOSEC + nfsrc_tcptimeout;
494 nfsrc_unlock(rp);
504 (rp->rc_refcnt > 0 ||
505 ((nd->nd_flag & ND_SAVEREPLY) && (rp->rc_flag & RC_UDP)) ||
506 ((nd->nd_flag & ND_SAVEREPLY) && !(rp->rc_flag & RC_UDP) &&
509 if (rp->rc_refcnt > 0) {
510 if (!(rp->rc_flag & RC_NFSV4))
512 rp->rc_flag |= RC_REFCNT;
516 rp->rc_status = nd->nd_repstat;
517 rp->rc_flag |= RC_REPSTATUS;
520 if (!(rp->rc_flag & RC_UDP)) {
530 rp->rc_reply = m;
531 rp->rc_flag |= RC_REPMBUF;
534 if (rp->rc_flag & RC_UDP) {
535 rp->rc_timestamp = NFSD_MONOSEC +
537 nfsrc_unlock(rp);
539 rp->rc_timestamp = NFSD_MONOSEC + nfsrc_tcptimeout;
540 if (rp->rc_refcnt > 0)
541 nfsrc_unlock(rp);
543 retrp = rp;
546 nfsrc_freecache(rp);
560 nfsrvd_delcache(struct nfsrvcache *rp)
564 mutex = nfsrc_cachemutex(rp);
565 if (!(rp->rc_flag & RC_INPROG))
568 rp->rc_flag &= ~RC_INPROG;
569 if (rp->rc_refcnt == 0 && !(rp->rc_flag & RC_LOCKED))
570 nfsrc_freecache(rp);
580 nfsrvd_sentcache(struct nfsrvcache *rp, int have_seq, uint32_t seq)
584 KASSERT(rp->rc_flag & RC_LOCKED, ("nfsrvd_sentcache not locked"));
586 hbp = NFSRCAHASH(rp->rc_sockref);
588 rp->rc_tcpseq = seq;
589 if (rp->rc_acked != RC_NO_ACK)
590 LIST_INSERT_HEAD(&hbp->tbl, rp, rc_ahash);
591 rp->rc_acked = RC_NO_ACK;
594 nfsrc_unlock(rp);
605 struct nfsrvcache *rp, *nextrp;
622 rp = LIST_FIRST(hp);
623 while (rp != NULL) {
624 nextrp = LIST_NEXT(rp, rc_hash);
625 if (newrp->rc_xid == rp->rc_xid &&
626 (!(rp->rc_flag & RC_INPROG) ||
628 newrp->rc_sockref == rp->rc_sockref)) &&
629 (newrp->rc_flag & rp->rc_flag & RC_NFSVERS) &&
630 newrp->rc_proc == rp->rc_proc &&
632 newrp->rc_sockref != rp->rc_sockref &&
633 newrp->rc_cachetime >= rp->rc_cachetime)
634 && newrp->rc_reqlen == rp->rc_reqlen &&
635 newrp->rc_cksum == rp->rc_cksum) {
636 LIST_REMOVE(rp, rc_hash);
637 LIST_INSERT_HEAD(&nfsrc_templist, rp, rc_hash);
639 rp = nextrp;
646 LIST_FOREACH(rp, &nfsrc_templist, rc_hash) {
648 if (rp->rc_refcnt > 0) {
660 hitrp = rp = LIST_FIRST(&nfsrc_templist);
661 while (rp != NULL) {
662 nextrp = LIST_NEXT(rp, rc_hash);
663 LIST_REMOVE(rp, rc_hash);
664 LIST_INSERT_HEAD(hp, rp, rc_hash);
665 rp = nextrp;
671 rp = hitrp;
672 if ((rp->rc_flag & RC_LOCKED) != 0) {
673 rp->rc_flag |= RC_WANTED;
674 (void)mtx_sleep(rp, mutex, (PZERO - 1) | PDROP,
678 if (rp->rc_flag == 0)
680 rp->rc_flag |= RC_LOCKED;
681 if (rp->rc_flag & RC_INPROG) {
684 if (newrp->rc_sockref == rp->rc_sockref)
685 nfsrc_marksametcpconn(rp->rc_sockref);
687 } else if (rp->rc_flag & RC_REPSTATUS) {
693 if (newrp->rc_sockref == rp->rc_sockref)
694 nfsrc_marksametcpconn(rp->rc_sockref);
697 *(nd->nd_errp) = rp->rc_status;
698 rp->rc_timestamp = NFSD_MONOSEC + nfsrc_tcptimeout;
699 } else if (rp->rc_flag & RC_REPMBUF) {
702 if (newrp->rc_sockref == rp->rc_sockref)
703 nfsrc_marksametcpconn(rp->rc_sockref);
705 nd->nd_mreq = m_copym(rp->rc_reply, 0,
707 rp->rc_timestamp = NFSD_MONOSEC + nfsrc_tcptimeout;
711 nfsrc_unlock(rp);
738 nfsrc_lock(struct nfsrvcache *rp)
742 mutex = nfsrc_cachemutex(rp);
744 while ((rp->rc_flag & RC_LOCKED) != 0) {
745 rp->rc_flag |= RC_WANTED;
746 (void)mtx_sleep(rp, mutex, PZERO - 1, "nfsrc", 0);
748 rp->rc_flag |= RC_LOCKED;
755 nfsrc_unlock(struct nfsrvcache *rp)
759 mutex = nfsrc_cachemutex(rp);
761 rp->rc_flag &= ~RC_LOCKED;
762 nfsrc_wanted(rp);
770 nfsrc_wanted(struct nfsrvcache *rp)
772 if (rp->rc_flag & RC_WANTED) {
773 rp->rc_flag &= ~RC_WANTED;
774 wakeup((caddr_t)rp);
783 nfsrc_freecache(struct nfsrvcache *rp)
787 LIST_REMOVE(rp, rc_hash);
788 if (rp->rc_flag & RC_UDP) {
789 TAILQ_REMOVE(&nfsrvudplru, rp, rc_lru);
791 } else if (rp->rc_acked != RC_NO_SEQ) {
792 hbp = NFSRCAHASH(rp->rc_sockref);
794 if (rp->rc_acked == RC_NO_ACK)
795 LIST_REMOVE(rp, rc_ahash);
798 nfsrc_wanted(rp);
799 if (rp->rc_flag & RC_REPMBUF) {
800 mbuf_freem(rp->rc_reply);
801 if (!(rp->rc_flag & RC_UDP))
804 FREE((caddr_t)rp, M_NFSRVCACHE);
814 struct nfsrvcache *rp, *nextrp;
819 LIST_FOREACH_SAFE(rp, &nfsrchash_table[i].tbl, rc_hash, nextrp)
820 nfsrc_freecache(rp);
825 LIST_FOREACH_SAFE(rp, &nfsrvudphashtbl[i], rc_hash, nextrp) {
826 nfsrc_freecache(rp);
842 struct nfsrvcache *rp, *nextrp;
851 LIST_FOREACH_SAFE(rp, &hbp->tbl, rc_ahash, nextrp) {
852 if (sockref == rp->rc_sockref) {
853 if (SEQ_GEQ(snd_una, rp->rc_tcpseq)) {
854 rp->rc_acked = RC_ACK;
855 LIST_REMOVE(rp, rc_ahash);
857 rp->rc_acked = RC_NACK;
858 LIST_REMOVE(rp, rc_ahash);
872 TAILQ_FOREACH_SAFE(rp, &nfsrvudplru, rc_lru, nextrp) {
873 if (!(rp->rc_flag & (RC_INPROG|RC_LOCKED|RC_WANTED))
874 && rp->rc_refcnt == 0
875 && ((rp->rc_flag & RC_REFCNT) ||
876 udp_lasttrim > rp->rc_timestamp ||
878 nfsrc_freecache(rp);
906 LIST_FOREACH_SAFE(rp, &nfsrchash_table[i].tbl, rc_hash,
908 if (!(rp->rc_flag &
910 && rp->rc_refcnt == 0) {
911 if ((rp->rc_flag & RC_REFCNT) ||
912 tcp_lasttrim > rp->rc_timestamp ||
913 rp->rc_acked == RC_ACK) {
914 nfsrc_freecache(rp);
926 j = rp->rc_timestamp - tcp_lasttrim;
956 LIST_FOREACH_SAFE(rp, &nfsrchash_table[i].tbl,
958 if (!(rp->rc_flag &
960 && rp->rc_refcnt == 0
961 && ((rp->rc_flag & RC_REFCNT) ||
962 thisstamp > rp->rc_timestamp ||
963 rp->rc_acked == RC_ACK))
964 nfsrc_freecache(rp);
977 nfsrvd_refcache(struct nfsrvcache *rp)
981 if (rp == NULL)
984 mutex = nfsrc_cachemutex(rp);
986 if (rp->rc_refcnt < 0)
988 rp->rc_refcnt++;
996 nfsrvd_derefcache(struct nfsrvcache *rp)
1000 mutex = nfsrc_cachemutex(rp);
1002 if (rp->rc_refcnt <= 0)
1004 rp->rc_refcnt--;
1005 if (rp->rc_refcnt == 0 && !(rp->rc_flag & (RC_LOCKED | RC_INPROG)))
1006 nfsrc_freecache(rp);