Lines Matching refs:rp

197 r4flushpages(rnode4_t *rp, cred_t *cr)
208 mutex_enter(&rp->r_statelock);
209 while (rp->r_count > 0)
210 cv_wait(&rp->r_cv, &rp->r_statelock);
211 mutex_exit(&rp->r_statelock);
216 vp = RTOV4(rp);
219 if ((rp->r_flags & R4DIRTY) && !rp->r_error) {
222 mutex_enter(&rp->r_statelock);
223 if (!rp->r_error)
224 rp->r_error = error;
225 mutex_exit(&rp->r_statelock);
236 r4inactive(rnode4_t *rp, cred_t *cr)
244 r4flushpages(rp, cr);
246 vp = RTOV4(rp);
252 mutex_enter(&rp->r_statelock);
253 contents = rp->r_symlink.contents;
254 size = rp->r_symlink.size;
255 rp->r_symlink.contents = NULL;
256 vsp = rp->r_secattr;
257 rp->r_secattr = NULL;
258 xattr = rp->r_xattr_dir;
259 rp->r_xattr_dir = NULL;
260 mutex_exit(&rp->r_statelock);
265 (void) nfs4_access_purge_rp(rp);
372 rnode4_t *rp = VTOR4(vp);
405 servinfo4_t *svp = rp->r_server;
407 rp->r_srv_fsid = ga_fsid;
417 r4_stub_mirrormount(rp);
419 r4_stub_none(rp);
453 rnode4_t *rp;
469 rp = VTOR4(vp);
482 mutex_enter(&rp->r_svlock);
486 mutex_exit(&rp->r_svlock);
489 mutex_exit(&rp->r_svlock);
515 rnode4_t *rp;
530 rp = VTOR4(vp);
533 mutex_enter(&rp->r_statelock);
534 rp->r_flags |= R4ISXATTR;
535 mutex_exit(&rp->r_statelock);
576 rnode4_t *rp;
586 if ((rp = r4find(rhtp, fh, vfsp)) != NULL) {
587 vp = RTOV4(rp);
596 rp = rp4freelist;
597 rp4_rmfree(rp);
600 vp = RTOV4(rp);
602 if (rp->r_flags & R4HASHED) {
603 rw_enter(&rp->r_hashq->r_lock, RW_WRITER);
608 rw_exit(&rp->r_hashq->r_lock);
613 rp4_rmhash_locked(rp);
614 rw_exit(&rp->r_hashq->r_lock);
617 r4inactive(rp, cr);
633 uninit_rnode4(rp);
647 rp = kmem_cache_alloc(rnode4_cache, KM_SLEEP);
657 bzero(rp, sizeof (*rp));
658 rp->r_vnode = vp;
659 nfs_rw_init(&rp->r_rwlock, NULL, RW_DEFAULT, NULL);
660 nfs_rw_init(&rp->r_lkserlock, NULL, RW_DEFAULT, NULL);
661 mutex_init(&rp->r_svlock, NULL, MUTEX_DEFAULT, NULL);
662 mutex_init(&rp->r_statelock, NULL, MUTEX_DEFAULT, NULL);
663 mutex_init(&rp->r_statev4_lock, NULL, MUTEX_DEFAULT, NULL);
664 mutex_init(&rp->r_os_lock, NULL, MUTEX_DEFAULT, NULL);
665 rp->created_v4 = 0;
666 list_create(&rp->r_open_streams, sizeof (nfs4_open_stream_t),
668 rp->r_lo_head.lo_prev_rnode = &rp->r_lo_head;
669 rp->r_lo_head.lo_next_rnode = &rp->r_lo_head;
670 cv_init(&rp->r_cv, NULL, CV_DEFAULT, NULL);
671 cv_init(&rp->r_commit.c_cv, NULL, CV_DEFAULT, NULL);
672 rp->r_flags = R4READDIRWATTR;
673 rp->r_fh = fh;
674 rp->r_hashq = rhtp;
675 sfh4_hold(rp->r_fh);
676 rp->r_server = mi->mi_curr_serv;
677 rp->r_deleg_type = OPEN_DELEGATE_NONE;
678 rp->r_deleg_needs_recovery = OPEN_DELEGATE_NONE;
679 nfs_rw_init(&rp->r_deleg_recall_lock, NULL, RW_DEFAULT, NULL);
681 rddir4_cache_create(rp);
682 rp->r_putapage = putapage;
684 vp->v_data = (caddr_t)rp;
689 if (isrootfh(fh, rp))
703 rp4_addfree(rp, cr);
707 rp4_addhash(rp);
713 uninit_rnode4(rnode4_t *rp)
715 vnode_t *vp = RTOV4(rp);
717 ASSERT(rp != NULL);
720 ASSERT(rp->r_count == 0);
721 ASSERT(rp->r_mapcnt == 0);
722 if (rp->r_flags & R4LODANGLERS) {
723 nfs4_flush_lock_owners(rp);
725 ASSERT(rp->r_lo_head.lo_next_rnode == &rp->r_lo_head);
726 ASSERT(rp->r_lo_head.lo_prev_rnode == &rp->r_lo_head);
727 ASSERT(!(rp->r_flags & R4HASHED));
728 ASSERT(rp->r_freef == NULL && rp->r_freeb == NULL);
729 nfs4_clear_open_streams(rp);
730 list_destroy(&rp->r_open_streams);
735 mutex_enter(&rp->r_statelock);
736 rddir4_cache_destroy(rp);
737 mutex_exit(&rp->r_statelock);
738 sv_uninit(&rp->r_svnode);
739 sfh4_rele(&rp->r_fh);
740 nfs_rw_destroy(&rp->r_rwlock);
741 nfs_rw_destroy(&rp->r_lkserlock);
742 mutex_destroy(&rp->r_statelock);
743 mutex_destroy(&rp->r_statev4_lock);
744 mutex_destroy(&rp->r_os_lock);
745 cv_destroy(&rp->r_cv);
746 cv_destroy(&rp->r_commit.c_cv);
747 nfs_rw_destroy(&rp->r_deleg_recall_lock);
748 if (rp->r_flags & R4DELMAPLIST)
749 list_destroy(&rp->r_indelmap);
759 rp4_addfree(rnode4_t *rp, cred_t *cr)
765 vp = RTOV4(rp);
767 ASSERT(rp->r_freef == NULL && rp->r_freeb == NULL);
778 if (((rnode4_new > nrnode || !(rp->r_flags & R4HASHED) ||
782 rp->r_error || (rp->r_flags & R4RECOVERR) ||
783 (vfsp->vfs_flag & VFS_UNMOUNTED)) && rp->r_count == 0)) {
784 if (rp->r_flags & R4HASHED) {
785 rw_enter(&rp->r_hashq->r_lock, RW_WRITER);
790 rw_exit(&rp->r_hashq->r_lock);
794 rp4_rmhash_locked(rp);
795 rw_exit(&rp->r_hashq->r_lock);
802 if (rp->r_deleg_type != OPEN_DELEGATE_NONE) {
803 (void) nfs4delegreturn(rp,
807 r4inactive(rp, cr);
836 destroy_rnode4(rp);
849 rw_enter(&rp->r_hashq->r_lock, RW_WRITER);
855 rw_exit(&rp->r_hashq->r_lock);
864 if (rp->r_deleg_type != OPEN_DELEGATE_NONE) {
865 rw_exit(&rp->r_hashq->r_lock);
866 (void) nfs4delegreturn(rp,
878 mutex_enter(&rp->r_os_lock);
879 if (list_head(&rp->r_open_streams) != NULL) {
880 mutex_exit(&rp->r_os_lock);
881 rw_exit(&rp->r_hashq->r_lock);
883 nfs4_clear_open_streams(rp);
888 mutex_exit(&rp->r_os_lock);
896 rw_exit(&rp->r_hashq->r_lock);
897 r4flushpages(rp, cr);
908 xattr = rp->r_xattr_dir;
909 rp->r_xattr_dir = NULL;
919 rp->r_freef = rp;
920 rp->r_freeb = rp;
921 rp4freelist = rp;
923 rp->r_freef = rp4freelist;
924 rp->r_freeb = rp4freelist->r_freeb;
925 rp4freelist->r_freeb->r_freef = rp;
926 rp4freelist->r_freeb = rp;
927 if (!nfs4_has_pages(vp) && rp->r_dir == NULL &&
928 rp->r_symlink.contents == NULL && rp->r_secattr == NULL)
929 rp4freelist = rp;
933 rw_exit(&rp->r_hashq->r_lock);
946 rp4_rmfree(rnode4_t *rp)
950 ASSERT(rp->r_freef != NULL && rp->r_freeb != NULL);
952 if (rp == rp4freelist) {
953 rp4freelist = rp->r_freef;
954 if (rp == rp4freelist)
957 rp->r_freeb->r_freef = rp->r_freef;
958 rp->r_freef->r_freeb = rp->r_freeb;
960 rp->r_freef = rp->r_freeb = NULL;
969 rp4_addhash(rnode4_t *rp)
971 ASSERT(RW_WRITE_HELD(&rp->r_hashq->r_lock));
972 ASSERT(!(rp->r_flags & R4HASHED));
975 r4_dup_check(rp, RTOV4(rp)->v_vfsp);
978 rp->r_hashf = rp->r_hashq->r_hashf;
979 rp->r_hashq->r_hashf = rp;
980 rp->r_hashb = (rnode4_t *)rp->r_hashq;
981 rp->r_hashf->r_hashb = rp;
983 mutex_enter(&rp->r_statelock);
984 rp->r_flags |= R4HASHED;
985 mutex_exit(&rp->r_statelock);
994 rp4_rmhash_locked(rnode4_t *rp)
996 ASSERT(RW_WRITE_HELD(&rp->r_hashq->r_lock));
997 ASSERT(rp->r_flags & R4HASHED);
999 rp->r_hashb->r_hashf = rp->r_hashf;
1000 rp->r_hashf->r_hashb = rp->r_hashb;
1002 mutex_enter(&rp->r_statelock);
1003 rp->r_flags &= ~R4HASHED;
1004 mutex_exit(&rp->r_statelock);
1013 rp4_rmhash(rnode4_t *rp)
1015 rw_enter(&rp->r_hashq->r_lock, RW_WRITER);
1016 rp4_rmhash_locked(rp);
1017 rw_exit(&rp->r_hashq->r_lock);
1030 rnode4_t *rp;
1035 for (rp = rhtp->r_hashf; rp != (rnode4_t *)rhtp; rp = rp->r_hashf) {
1036 vp = RTOV4(rp);
1037 if (vp->v_vfsp == vfsp && SFH4_SAME(rp->r_fh, fh)) {
1039 mutex_enter(&rp->r_statelock);
1040 if (rp->r_flags & R4RECOVERR) {
1041 mutex_exit(&rp->r_statelock);
1044 mutex_exit(&rp->r_statelock);
1046 r4_dup_check(rp, vfsp);
1048 if (rp->r_freef != NULL) {
1056 if (rp->r_freef != NULL) {
1057 rp4_rmfree(rp);
1069 if (isrootfh(fh, rp)) {
1076 return (rp);
1090 rnode4_t *rp;
1095 rp = r4find(&rtable4[index], fh, vfsp);
1098 return (rp);
1113 rnode4_t *rp;
1121 for (rp = rtable4[index].r_hashf;
1122 rp != (rnode4_t *)(&rtable4[index]);
1123 rp = rp->r_hashf) {
1125 vp = RTOV4(rp);
1127 if (rp->r_freef == NULL) {
1130 (rp->r_flags & R4DIRTY)) {
1132 } else if (rp->r_count > 0) {
1140 path = fn_path(rp->r_svnode.sv_name);
1143 rnode4_t *, rp);
1168 rnode4_t *rp, *r_hashf, *rlist;
1174 for (rp = rtable4[index].r_hashf;
1175 rp != (rnode4_t *)(&rtable4[index]);
1176 rp = r_hashf) {
1178 r_hashf = rp->r_hashf;
1180 vp = RTOV4(rp);
1183 if (rp->r_freef != NULL) {
1184 rp4_rmfree(rp);
1186 rp4_rmhash_locked(rp);
1187 rp->r_hashf = rlist;
1188 rlist = rp;
1196 for (rp = rlist; rp != NULL; rp = r_hashf) {
1197 r_hashf = rp->r_hashf;
1203 rp4_addfree(rp, cr);
1212 destroy_rnode4(rnode4_t *rp)
1217 ASSERT(rp->r_deleg_type == OPEN_DELEGATE_NONE);
1219 vp = RTOV4(rp);
1222 uninit_rnode4(rp);
1227 kmem_cache_free(rnode4_cache, rp);
1242 rnode4_t *rp;
1250 for (rp = rtable4[index].r_hashf;
1251 rp != (rnode4_t *)(&rtable4[index]);
1252 rp = rp->r_hashf) {
1253 vp = RTOV4(rp);
1257 if (!mutex_tryenter(&rp->r_statelock))
1264 rp->r_change = 0;
1265 PURGE_ATTRCACHE4_LOCKED(rp);
1266 mutex_exit(&rp->r_statelock);
1280 rnode4_t *rp;
1305 for (rp = rtable4[index].r_hashf;
1306 rp != (rnode4_t *)(&rtable4[index]);
1307 rp = rp->r_hashf) {
1308 vp = RTOV4(rp);
1325 ((rp->r_flags & R4DIRTY) || rp->r_mapcnt > 0)) {
1354 nfs4_free_data_reclaim(rnode4_t *rp)
1367 mutex_enter(&rp->r_statelock);
1368 if (rp->r_dir != NULL)
1370 contents = rp->r_symlink.contents;
1371 size = rp->r_symlink.size;
1372 rp->r_symlink.contents = NULL;
1373 vsp = rp->r_secattr;
1374 rp->r_secattr = NULL;
1375 xattr = rp->r_xattr_dir;
1376 rp->r_xattr_dir = NULL;
1377 mutex_exit(&rp->r_statelock);
1382 freed = nfs4_access_purge_rp(rp);
1390 nfs4_purge_rddir_cache(RTOV4(rp));
1416 nfs4_active_data_reclaim(rnode4_t *rp)
1429 if (!mutex_tryenter(&rp->r_statelock))
1431 contents = rp->r_symlink.contents;
1432 size = rp->r_symlink.size;
1433 rp->r_symlink.contents = NULL;
1434 vsp = rp->r_secattr;
1435 rp->r_secattr = NULL;
1436 if (rp->r_dir != NULL)
1441 * VN_RELE(rp->r_xattr_dir) will be done sometime later - e.g. when the
1442 * rnode 'rp' is freed or put on the free list.
1449 if (rp->r_xattr_dir && rp->r_xattr_dir != NFS4_XATTR_DIR_NOTSUPP &&
1450 VTOR4(rp->r_xattr_dir)->r_hashq != rp->r_hashq) {
1451 xattr = rp->r_xattr_dir;
1452 rp->r_xattr_dir = NULL;
1454 mutex_exit(&rp->r_statelock);
1459 freed = nfs4_access_purge_rp(rp);
1478 nfs4_purge_rddir_cache(RTOV4(rp));
1493 rnode4_t *rp;
1500 rp = rp4freelist;
1501 if (rp != NULL) {
1503 if (nfs4_free_data_reclaim(rp))
1505 } while ((rp = rp->r_freef) != rp4freelist);
1516 rnode4_t *rp;
1524 for (rp = rtable4[index].r_hashf;
1525 rp != (rnode4_t *)(&rtable4[index]);
1526 rp = rp->r_hashf) {
1527 if (nfs4_active_data_reclaim(rp))
1539 rnode4_t *rp;
1547 while ((rp = rp4freelist) != NULL) {
1548 rp4_rmfree(rp);
1550 if (rp->r_flags & R4HASHED) {
1551 vp = RTOV4(rp);
1552 rw_enter(&rp->r_hashq->r_lock, RW_WRITER);
1557 rw_exit(&rp->r_hashq->r_lock);
1562 rp4_rmhash_locked(rp);
1563 rw_exit(&rp->r_hashq->r_lock);
1570 rp4_addfree(rp, CRED());
1621 r2lease_time(rnode4_t *rp)
1625 mntinfo4_t *mi = VTOMI4(RTOV4(rp));
1630 sp = find_nfs4_server(VTOMI4(RTOV4(rp)));
1632 if (VTOMI4(RTOV4(rp))->mi_vfsp->vfs_flag & VFS_UNMOUNTED) {
1676 rnode4_t *rp;
1689 for (rp = rtable4[index].r_hashf;
1690 rp != (rnode4_t *)(&rtable4[index]);
1691 rp = rp->r_hashf) {
1693 vp = RTOV4(rp);
1698 mutex_enter(&rp->r_os_lock);
1702 for (osp = list_head(&rp->r_open_streams); osp != NULL;
1703 osp = list_next(&rp->r_open_streams, osp)) {
1731 for (osp = list_head(&rp->r_open_streams);
1733 osp = list_next(&rp->r_open_streams, osp)) {
1751 mutex_exit(&rp->r_os_lock);
1755 mutex_enter(&rp->r_statev4_lock);
1756 if (rp->r_deleg_type != OPEN_DELEGATE_NONE) {
1764 rp->r_deleg_needs_recovery =
1765 rp->r_deleg_type;
1768 dtype = rp->r_deleg_type;
1769 mutex_exit(&rp->r_statev4_lock);
1773 * We've set rp->r_deleg_needs_recovery so we have
1777 (void) nfs4delegreturn(rp, NFS4_DR_DISCARD);
1795 rnode4_t *rp;
1803 for (rp = rtable4[index].r_hashf;
1804 rp != (rnode4_t *)(&rtable4[index]);
1805 rp = rp->r_hashf) {
1807 vp = RTOV4(rp);
1817 fsid = &rp->r_srv_fsid;
1916 isrootfh(nfs4_sharedfh_t *fh, rnode4_t *rp)
1921 if (SFH4_SAME(VTOMI4(RTOV4(rp))->mi_rootfh, fh))
1933 r4_stub_set(rnode4_t *rp, nfs4_stub_type_t type)
1935 vnode_t *vp = RTOV4(rp);
1936 krwlock_t *hash_lock = &rp->r_hashq->r_lock;
1938 ASSERT(RW_WRITE_HELD(hash_lock) || MUTEX_HELD(&rp->r_statelock));
1940 rp->r_stub_type = type;
1955 r4_stub_mirrormount(rnode4_t *rp)
1957 r4_stub_set(rp, NFS4_STUB_MIRRORMOUNT);
1961 r4_stub_referral(rnode4_t *rp)
1964 vnode_t *, RTOV4(rp));
1965 r4_stub_set(rp, NFS4_STUB_REFERRAL);
1969 r4_stub_none(rnode4_t *rp)
1971 r4_stub_set(rp, NFS4_STUB_NONE);
1984 rnode4_t *rp;
2001 for (rp = rtable4[index].r_hashf;
2002 rp != (rnode4_t *)(&rtable4[index]);
2003 rp = rp->r_hashf) {
2005 if (rp == checkrp)
2008 tvp = RTOV4(rp);
2012 sfh4_copyval(rp->r_fh, &fh2);
2015 "(%p, %p)", (void *)checkrp, (void *)rp);