Lines Matching refs:nmp

459 	__unused struct nfsmount *nmp,
539 vfs_statfs(nmp->nm_mountp)->f_mntfromname, error, nso, naddr, sotype,
544 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, naddr,
581 nfs_socket_options(struct nfsmount *nmp, struct nfs_socket *nso)
594 timeo.tv_sec = (NMFLAG(nmp, SOFT) || nfs_can_squish(nmp)) ? 5 : 60;
615 if (!NMFLAG(nmp, INTR))
695 nfs_connect_search_new_socket(struct nfsmount *nmp, struct nfs_socket_search *nss, struct timeval *now)
706 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nss->nss_addrcnt);
717 if (nmp->nm_sockflags & NMSOCK_UNMOUNT)
720 fsl = nmp->nm_locations.nl_locations[nss->nss_nextloc.nli_loc];
724 nfs_location_next(&nmp->nm_locations, &nss->nss_nextloc);
730 if (nmp->nm_sofamily && (ss.ss_family != nmp->nm_sofamily)) {
731 nfs_location_next(&nmp->nm_locations, &nss->nss_nextloc);
738 error = nfs_socket_create(nmp, (struct sockaddr*)&ss, nss->nss_sotype,
740 ((nss->nss_protocol == NFS_PROG) && NMFLAG(nmp, RESVPORT)), &nso);
756 nfs_location_next(&nmp->nm_locations, &nss->nss_nextloc);
769 * nfs_connect_search_socket_connect: Connect an nfs socket nso for nfsmount nmp.
775 nfs_connect_search_socket_connect(struct nfsmount *nmp, struct nfs_socket *nso, int verbose)
779 if ((nso->nso_sotype != SOCK_STREAM) && NMFLAG(nmp, NOCONNECT)) {
782 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso);
784 nfs_socket_options(nmp, nso);
791 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso);
804 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso);
807 nfs_socket_options(nmp, nso);
815 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error);
818 error, vfs_statfs(nmp->nm_mountp)->f_mntfromname);
833 nfs_connect_search_ping(struct nfsmount *nmp, struct nfs_socket *nso, struct timeval *now)
850 error = nfsm_rpchead2(nmp, nso->nso_sotype, nso->nso_protocol, vers, 0, RPCAUTH_SYS,
867 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error);
886 nfs_connect_search_socket_found(struct nfsmount *nmp __unused, struct nfs_socket_search *nss, struct nfs_socket *nso)
889 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso);
907 nfs_connect_search_socket_reap(struct nfsmount *nmp __unused, struct nfs_socket_search *nss, struct timeval *now)
916 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso);
926 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, nso->nso_error);
941 nfs_connect_search_check(struct nfsmount *nmp, struct nfs_socket_search *nss, struct timeval *now)
947 printf("nfs_connect: socket connect taking a while for %s\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname);
950 if (nmp->nm_sockflags & NMSOCK_UNMOUNT)
952 if ((error = nfs_sigintr(nmp, NULL, current_thread(), 0)))
967 nfs_connect_search_loop(struct nfsmount *nmp, struct nfs_socket_search *nss)
976 NFS_SOCK_DBG("nfs connect %s search %ld\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname, now.tv_sec);
979 error = nfs_connect_search_new_socket(nmp, nss, &now);
991 if (!nfs_connect_search_socket_connect(nmp, nso, verbose)) {
1000 if (!nfs_connect_search_ping(nmp, nso, &now)) {
1009 nfs_connect_search_socket_found(nmp, nss, nso);
1017 nfs_connect_search_socket_reap(nmp, nss, &now);
1025 error = nfs_connect_search_check(nmp, nss, &now);
1030 NFS_SOCK_DBG("nfs connect %s returning %d\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname, error);
1050 nfs_connect(struct nfsmount *nmp, int verbose, int timeo)
1059 uint8_t sotype = nmp->nm_sotype ? nmp->nm_sotype : SOCK_STREAM;
1067 for (loc=0; loc < nmp->nm_locations.nl_numlocs; loc++) {
1068 for (serv=0; serv < nmp->nm_locations.nl_locations[loc]->nl_servcount; serv++) {
1069 addrtotal += nmp->nm_locations.nl_locations[loc]->nl_servers[serv]->ns_addrcount;
1070 if (nmp->nm_locations.nl_locations[loc]->nl_servers[serv]->ns_addrcount == 0)
1072 vfs_statfs(nmp->nm_mountp)->f_mntfromname,
1073 nmp->nm_locations.nl_locations[loc]->nl_servers[serv]->ns_name);
1079 vfs_statfs(nmp->nm_mountp)->f_mntfromname);
1083 vfs_statfs(nmp->nm_mountp)->f_mntfromname, addrtotal);
1085 lck_mtx_lock(&nmp->nm_lock);
1086 nmp->nm_sockflags |= NMSOCK_CONNECTING;
1087 nmp->nm_nss = &nss;
1088 lck_mtx_unlock(&nmp->nm_lock);
1099 nss.nss_startloc = nmp->nm_locations.nl_current;
1106 if (!(nmp->nm_sockflags & NMSOCK_HASCONNECTED)) {
1107 if (!nmp->nm_vers) {
1109 if (!nmp->nm_nfsport || (!NM_OMATTR_GIVEN(nmp, FH) && !nmp->nm_mountport)) {
1116 nss.nss_port = nmp->nm_nfsport;
1120 } else if (nmp->nm_vers >= NFS_VER4) {
1122 nss.nss_port = nmp->nm_nfsport ? nmp->nm_nfsport : NFS_PORT;
1127 if (!nmp->nm_nfsport || (!NM_OMATTR_GIVEN(nmp, FH) && !nmp->nm_mountport)) {
1134 nss.nss_port = nmp->nm_nfsport;
1136 nss.nss_version = nmp->nm_vers;
1140 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nss.nss_sotype, nss.nss_port,
1144 if (!nmp->nm_nfsport) {
1150 nss.nss_port = nmp->nm_nfsport;
1152 nss.nss_version = nmp->nm_vers;
1155 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nss.nss_sotype, nss.nss_port,
1162 if ((nss.nss_nextloc.nli_serv >= nmp->nm_locations.nl_locations[nss.nss_nextloc.nli_loc]->nl_servcount) ||
1163 (nss.nss_nextloc.nli_addr >= nmp->nm_locations.nl_locations[nss.nss_nextloc.nli_loc]->nl_servers[nss.nss_nextloc.nli_serv]->ns_addrcount)) {
1164 nfs_location_next(&nmp->nm_locations, &nss.nss_nextloc);
1167 vfs_statfs(nmp->nm_mountp)->f_mntfromname);
1175 error = nfs_connect_search_loop(nmp, &nss);
1179 if (!error && (nss.nss_sotype == SOCK_STREAM) && !nmp->nm_sotype && (nmp->nm_vers < NFS_VER4)) {
1184 vfs_statfs(nmp->nm_mountp)->f_mntfromname, error, nss.nss_error);
1189 lck_mtx_lock(&nmp->nm_lock);
1190 nmp->nm_sockflags &= ~NMSOCK_CONNECTING;
1191 nmp->nm_nss = NULL;
1192 lck_mtx_unlock(&nmp->nm_lock);
1195 vfs_statfs(nmp->nm_mountp)->f_mntfromname);
1201 vfs_statfs(nmp->nm_mountp)->f_mntfromname, error);
1217 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso);
1226 nfsvers = nmp->nm_vers ? nmp->nm_vers : NFS_VER3;
1228 if (!(port = nmp->nm_nfsport)) {
1233 error = nfs_portmap_lookup(nmp, vfs_context_current(), (struct sockaddr*)&ss,
1244 if (error && !nmp->nm_vers) {
1246 error = nfs_portmap_lookup(nmp, vfs_context_current(), (struct sockaddr*)&ss,
1265 error = nfs_socket_create(nmp, (struct sockaddr*)&ss, nso->nso_sotype, port,
1266 NFS_PROG, nfsvers, NMFLAG(nmp, RESVPORT), &nsonfs);
1283 if ((nfsvers < NFS_VER4) && !(nmp->nm_sockflags & NMSOCK_HASCONNECTED) && !NM_OMATTR_GIVEN(nmp, FH)) {
1287 port = nmp->nm_mountport;
1296 int mntproto = (NM_OMFLAG(nmp, MNTUDP) || (nso->nso_sotype == SOCK_DGRAM)) ? IPPROTO_UDP : IPPROTO_TCP;
1297 error = nfs_portmap_lookup(nmp, vfs_context_current(), (struct sockaddr*)&ss,
1327 NFS_SOCK_DBG("nfs connect %s got NFS socket %p\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso);
1330 nfsvers = nmp->nm_vers ? nmp->nm_vers : (int)nso->nso_version;
1333 if ((nfsvers < NFS_VER4) && !(nmp->nm_sockflags & NMSOCK_HASCONNECTED) && !NM_OMATTR_GIVEN(nmp, FH)) {
1339 port = nmp->nm_mountport;
1347 int mntproto = (NM_OMFLAG(nmp, MNTUDP) || (nso->nso_sotype == SOCK_DGRAM)) ? IPPROTO_UDP : IPPROTO_TCP;
1348 error = nfs_portmap_lookup(nmp, vfs_context_current(), (struct sockaddr*)&ss,
1379 nfs_location_mntfromname(&nmp->nm_locations, nso->nso_location, path, MAXPATHLEN, 1);
1380 error = nfs3_mount_rpc(nmp, saddr, nso->nso_sotype, nfsvers,
1381 path, vfs_context_current(), timeo, fh, &nmp->nm_servsec);
1383 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error);
1389 if ((nfsvers == NFS_VER3) && !nmp->nm_servsec.count) {
1391 nmp->nm_servsec.count = 1;
1392 nmp->nm_servsec.flavors[0] = RPCAUTH_SYS;
1394 if (nmp->nm_sec.count) {
1396 if (!nmp->nm_servsec.count) {
1398 nmp->nm_auth = nmp->nm_sec.flavors[0];
1401 for (o=0; !found && (o < nmp->nm_sec.count); o++)
1402 for (s=0; !found && (s < nmp->nm_servsec.count); s++)
1403 if (nmp->nm_sec.flavors[o] == nmp->nm_servsec.flavors[s]) {
1404 nmp->nm_auth = nmp->nm_sec.flavors[o];
1409 if (!nmp->nm_servsec.count) {
1410 nmp->nm_auth = RPCAUTH_SYS;
1413 for (s=0; s < nmp->nm_servsec.count; s++)
1414 switch (nmp->nm_servsec.flavors[s]) {
1417 if (found && (nmp->nm_auth == RPCAUTH_NONE))
1424 nmp->nm_auth = nmp->nm_servsec.flavors[s];
1441 if (nmp->nm_fh)
1442 FREE(nmp->nm_fh, M_TEMP);
1443 nmp->nm_fh = fh;
1445 NFS_BITMAP_SET(nmp->nm_flags, NFS_MFLAG_CALLUMNT);
1450 error = sock_setupcall(nso->nso_so, upcall, nmp);
1457 if (!(nmp->nm_sockflags & NMSOCK_HASCONNECTED)) {
1459 if (!NM_OMATTR_GIVEN(nmp, MNTFROM))
1460 nfs_location_mntfromname(&nmp->nm_locations, nso->nso_location,
1461 vfs_statfs(nmp->nm_mountp)->f_mntfromname,
1462 sizeof(vfs_statfs(nmp->nm_mountp)->f_mntfromname), 0);
1464 if (!nmp->nm_sotype)
1465 nmp->nm_sotype = nso->nso_sotype;
1466 if (!nmp->nm_vers) {
1467 nmp->nm_vers = nfsvers;
1469 if ((nfsvers >= NFS_VER4) && !NFS_BITMAP_ISSET(nmp->nm_mattrs, NFS_MATTR_NFS_PORT)) {
1477 nmp->nm_nfsport = NFS_PORT;
1481 if (nmp->nm_vers >= NFS_VER4) {
1483 nmp->nm_mounttime = ((uint64_t)now.tv_sec << 32) | now.tv_usec;
1484 if (!NMFLAG(nmp, NOCALLBACK))
1485 nfs4_mount_callback_setup(nmp);
1490 lck_mtx_lock(&nmp->nm_lock);
1491 nmp->nm_srtt[0] = nmp->nm_srtt[1] = nmp->nm_srtt[2] =
1492 nmp->nm_srtt[3] = (NFS_TIMEO << 3);
1493 nmp->nm_sdrtt[0] = nmp->nm_sdrtt[1] = nmp->nm_sdrtt[2] =
1494 nmp->nm_sdrtt[3] = 0;
1496 nmp->nm_cwnd = NFS_MAXCWND / 2; /* Initial send window */
1497 nmp->nm_sent = 0;
1499 nmp->nm_timeouts = 0;
1501 nmp->nm_sockflags &= ~NMSOCK_CONNECTING;
1502 nmp->nm_sockflags |= NMSOCK_SETUP;
1504 nmp->nm_nso = nso;
1505 oldsaddr = nmp->nm_saddr;
1506 nmp->nm_saddr = nso->nso_saddr;
1507 lck_mtx_unlock(&nmp->nm_lock);
1508 error = nfs_connect_setup(nmp);
1509 lck_mtx_lock(&nmp->nm_lock);
1510 nmp->nm_sockflags &= ~NMSOCK_SETUP;
1512 nmp->nm_sockflags |= NMSOCK_READY;
1513 wakeup(&nmp->nm_sockflags);
1517 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error);
1519 nmp->nm_saddr = oldsaddr;
1520 if (!(nmp->nm_sockflags & NMSOCK_HASCONNECTED)) {
1522 if (!NFS_BITMAP_ISSET(nmp->nm_mattrs, NFS_MATTR_SOCKET_TYPE))
1523 nmp->nm_sotype = 0;
1524 if (!NFS_BITMAP_ISSET(nmp->nm_mattrs, NFS_MATTR_NFS_VERSION)) {
1525 if (nmp->nm_vers >= NFS_VER4) {
1526 if (!NFS_BITMAP_ISSET(nmp->nm_mattrs, NFS_MATTR_NFS_PORT))
1527 nmp->nm_nfsport = 0;
1528 if (nmp->nm_cbid)
1529 nfs4_mount_callback_shutdown(nmp);
1530 if (IS_VALID_CRED(nmp->nm_mcred))
1531 kauth_cred_unref(&nmp->nm_mcred);
1532 bzero(&nmp->nm_un, sizeof(nmp->nm_un));
1534 nmp->nm_vers = 0;
1537 lck_mtx_unlock(&nmp->nm_lock);
1538 nmp->nm_nso = NULL;
1544 if ((nmp->nm_locations.nl_current.nli_flags & NLI_VALID) &&
1545 (nmp->nm_locations.nl_current.nli_serv != nso->nso_location.nli_serv)) {
1549 nmp->nm_locations.nl_current = nso->nso_location;
1550 nmp->nm_locations.nl_current.nli_flags |= NLI_VALID;
1552 if (!(nmp->nm_sockflags & NMSOCK_HASCONNECTED)) {
1554 nmp->nm_sockflags |= NMSOCK_HASCONNECTED;
1557 lck_mtx_unlock(&nmp->nm_lock);
1563 vfs_statfs(nmp->nm_mountp)->f_mntfromname);
1565 nmp->nm_nss = NULL;
1571 NFS_SOCK_DBG("nfs connect %s success\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname);
1578 nfs_connect_setup(struct nfsmount *nmp)
1582 if (nmp->nm_vers >= NFS_VER4) {
1583 if (nmp->nm_state & NFSSTA_CLIENTID) {
1585 error = nfs4_renew(nmp, R_SETUP);
1591 lck_mtx_lock(&nmp->nm_lock);
1592 nfs_need_recover(nmp, error);
1593 lck_mtx_unlock(&nmp->nm_lock);
1596 error = nfs4_setclientid(nmp);
1610 nfs_reconnect(struct nfsmount *nmp)
1620 lastmsg = now.tv_sec - (nmp->nm_tprintf_delay - nmp->nm_tprintf_initial_delay);
1622 nfs_disconnect(nmp);
1625 lck_mtx_lock(&nmp->nm_lock);
1626 timeo = nfs_is_squishy(nmp) ? 8 : 30;
1627 lck_mtx_unlock(&nmp->nm_lock);
1629 while ((error = nfs_connect(nmp, verbose, timeo))) {
1631 nfs_disconnect(nmp);
1637 if ((lastmsg + nmp->nm_tprintf_delay) < now.tv_sec) {
1639 nfs_down(nmp, thd, error, NFSSTA_TIMEO, "can not connect");
1642 lck_mtx_lock(&nmp->nm_lock);
1643 if (!(nmp->nm_state & NFSSTA_MOUNTED)) {
1646 lck_mtx_unlock(&nmp->nm_lock);
1650 nfs_mount_check_dead_timeout(nmp);
1651 if ((error = nfs_sigintr(nmp, NULL, thd, 1))) {
1652 lck_mtx_unlock(&nmp->nm_lock);
1655 lck_mtx_unlock(&nmp->nm_lock);
1657 if ((error = nfs_sigintr(nmp, NULL, thd, 0)))
1662 nfs_up(nmp, thd, NFSSTA_TIMEO, "connected");
1671 if (rq->r_nmp == nmp) {
1691 nfs_disconnect(struct nfsmount *nmp)
1695 lck_mtx_lock(&nmp->nm_lock);
1697 if (nmp->nm_nso) {
1699 if (nmp->nm_state & NFSSTA_SENDING) { /* wait for sending to complete */
1700 nmp->nm_state |= NFSSTA_WANTSND;
1701 msleep(&nmp->nm_state, &nmp->nm_lock, PZERO-1, "nfswaitsending", &ts);
1704 if (nmp->nm_sockflags & NMSOCK_POKE) { /* wait for poking to complete */
1705 msleep(&nmp->nm_sockflags, &nmp->nm_lock, PZERO-1, "nfswaitpoke", &ts);
1708 nmp->nm_sockflags |= NMSOCK_DISCONNECTING;
1709 nmp->nm_sockflags &= ~NMSOCK_READY;
1710 nso = nmp->nm_nso;
1711 nmp->nm_nso = NULL;
1712 if (nso->nso_saddr == nmp->nm_saddr)
1714 lck_mtx_unlock(&nmp->nm_lock);
1716 lck_mtx_lock(&nmp->nm_lock);
1717 nmp->nm_sockflags &= ~NMSOCK_DISCONNECTING;
1718 lck_mtx_unlock(&nmp->nm_lock);
1720 lck_mtx_unlock(&nmp->nm_lock);
1728 nfs_need_reconnect(struct nfsmount *nmp)
1732 lck_mtx_lock(&nmp->nm_lock);
1733 nmp->nm_sockflags &= ~(NMSOCK_READY|NMSOCK_SETUP);
1734 lck_mtx_unlock(&nmp->nm_lock);
1742 if (rq->r_nmp == nmp) {
1764 struct nfsmount *nmp = arg;
1773 lck_mtx_lock(&nmp->nm_lock);
1775 while (!(nmp->nm_sockflags & NMSOCK_READY) ||
1776 !TAILQ_EMPTY(&nmp->nm_resendq) ||
1777 !LIST_EMPTY(&nmp->nm_monlist) ||
1778 nmp->nm_deadto_start ||
1779 (nmp->nm_state & NFSSTA_RECOVER) ||
1780 ((nmp->nm_vers >= NFS_VER4) && !TAILQ_EMPTY(&nmp->nm_dreturnq)))
1782 if (nmp->nm_sockflags & NMSOCK_UNMOUNT)
1785 if (!(nmp->nm_sockflags & NMSOCK_READY) && !(nmp->nm_state & NFSSTA_FORCE)) {
1786 if (nmp->nm_reconnect_start <= 0) {
1788 nmp->nm_reconnect_start = now.tv_sec;
1790 lck_mtx_unlock(&nmp->nm_lock);
1791 NFS_SOCK_DBG("nfs reconnect %s\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname);
1799 error = nfs_reconnect(nmp);
1806 vfs_statfs(nmp->nm_mountp)->f_mntfromname, error);
1808 nmp->nm_reconnect_start = 0;
1811 lck_mtx_lock(&nmp->nm_lock);
1813 if ((nmp->nm_sockflags & NMSOCK_READY) &&
1814 (nmp->nm_state & NFSSTA_RECOVER) &&
1815 !(nmp->nm_sockflags & NMSOCK_UNMOUNT) &&
1816 !(nmp->nm_state & NFSSTA_FORCE)) {
1818 lck_mtx_unlock(&nmp->nm_lock);
1819 nfs_recover(nmp);
1820 lck_mtx_lock(&nmp->nm_lock);
1823 while ((nmp->nm_vers >= NFS_VER4) && !(nmp->nm_state & NFSSTA_FORCE) &&
1824 (nmp->nm_sockflags & NMSOCK_READY) && !(nmp->nm_state & NFSSTA_RECOVER) &&
1825 ((np = TAILQ_FIRST(&nmp->nm_dreturnq)))) {
1826 lck_mtx_unlock(&nmp->nm_lock);
1827 nfs4_delegation_return(np, R_RECOVER, thd, nmp->nm_mcred);
1828 lck_mtx_lock(&nmp->nm_lock);
1831 while ((((nmp->nm_sockflags & NMSOCK_READY) && !(nmp->nm_state & NFSSTA_RECOVER)) || (nmp->nm_state & NFSSTA_FORCE)) &&
1832 ((req = TAILQ_FIRST(&nmp->nm_resendq)))) {
1835 while (req && !(nmp->nm_state & NFSSTA_FORCE) && req->r_resendtime && (now.tv_sec < req->r_resendtime))
1839 TAILQ_REMOVE(&nmp->nm_resendq, req, r_rchain);
1841 lck_mtx_unlock(&nmp->nm_lock);
1850 lck_mtx_lock(&nmp->nm_lock);
1870 error = nfs_sigintr(nmp, req, req->r_thread, 0);
1885 lck_mtx_lock(&nmp->nm_lock);
1893 error = nfs_sigintr(nmp, req, req->r_thread, 0);
1904 lck_mtx_lock(&nmp->nm_lock);
1916 lck_mtx_lock(&nmp->nm_lock);
1918 if (nmp->nm_deadto_start)
1919 nfs_mount_check_dead_timeout(nmp);
1920 if (nmp->nm_state & (NFSSTA_FORCE|NFSSTA_DEAD))
1923 if (!LIST_EMPTY(&nmp->nm_monlist)) {
1924 nmp->nm_state |= NFSSTA_MONITOR_SCAN;
1925 LIST_FOREACH(np, &nmp->nm_monlist, n_monlink) {
1926 if (!(nmp->nm_sockflags & NMSOCK_READY) || (nmp->nm_state & (NFSSTA_RECOVER|NFSSTA_UNMOUNTING|NFSSTA_FORCE)))
1929 lck_mtx_unlock(&nmp->nm_lock);
1933 lck_mtx_lock(&nmp->nm_lock);
1939 if (error || !(nmp->nm_sockflags & NMSOCK_READY) || (nmp->nm_state & (NFSSTA_RECOVER|NFSSTA_UNMOUNTING|NFSSTA_FORCE)))
1942 nmp->nm_state &= ~NFSSTA_MONITOR_SCAN;
1943 if (nmp->nm_state & NFSSTA_UNMOUNTING)
1944 wakeup(&nmp->nm_state); /* let unmounting thread know scan is done */
1946 if ((nmp->nm_sockflags & NMSOCK_READY) || (nmp->nm_state & (NFSSTA_RECOVER|NFSSTA_UNMOUNTING))) {
1947 if (nmp->nm_deadto_start || !TAILQ_EMPTY(&nmp->nm_resendq) ||
1948 (nmp->nm_state & NFSSTA_RECOVER))
1952 msleep(&nmp->nm_sockthd, &nmp->nm_lock, PSOCK, "nfssockthread", &ts);
1957 if ((nmp->nm_sockflags & NMSOCK_UNMOUNT) &&
1958 (nmp->nm_state & NFSSTA_MOUNTED) && NMFLAG(nmp, CALLUMNT) &&
1959 (nmp->nm_vers < NFS_VER4) && !(nmp->nm_state & (NFSSTA_FORCE|NFSSTA_DEAD))) {
1960 lck_mtx_unlock(&nmp->nm_lock);
1961 nfs3_umount_rpc(nmp, vfs_context_kernel(),
1962 (nmp->nm_sockflags & NMSOCK_READY) ? 6 : 2);
1963 lck_mtx_lock(&nmp->nm_lock);
1966 if (nmp->nm_sockthd == thd)
1967 nmp->nm_sockthd = NULL;
1968 lck_mtx_unlock(&nmp->nm_lock);
1969 wakeup(&nmp->nm_sockthd);
1975 nfs_mount_sock_thread_wake(struct nfsmount *nmp)
1977 if (nmp->nm_sockthd)
1978 wakeup(&nmp->nm_sockthd);
1979 else if (kernel_thread_start(nfs_mount_sock_thread, nmp, &nmp->nm_sockthd) == KERN_SUCCESS)
1980 thread_deallocate(nmp->nm_sockthd);
1986 * (must be called with nmp locked)
1989 nfs_mount_check_dead_timeout(struct nfsmount *nmp)
1993 if (nmp->nm_deadto_start == 0)
1995 if (nmp->nm_state & NFSSTA_DEAD)
1997 nfs_is_squishy(nmp);
1998 if (nmp->nm_curdeadtimeout <= 0)
2001 if ((now.tv_sec - nmp->nm_deadto_start) < nmp->nm_curdeadtimeout)
2003 printf("nfs server %s: %sdead\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname,
2004 (nmp->nm_curdeadtimeout != nmp->nm_deadtimeout) ? "squished " : "");
2005 nmp->nm_state |= NFSSTA_DEAD;
2006 vfs_event_signal(&vfs_statfs(nmp->nm_mountp)->f_fsid, VQ_DEAD, 0);
2052 nfs4_mount_callback_setup(struct nfsmount *nmp)
2068 nmp->nm_cbid = nfs4_cb_id++;
2069 if (nmp->nm_cbid == 0)
2070 nmp->nm_cbid = nfs4_cb_id++;
2072 TAILQ_INSERT_HEAD(&nfs4_cb_mounts, nmp, nm_cblink);
2203 nfs4_mount_callback_shutdown(struct nfsmount *nmp)
2211 TAILQ_REMOVE(&nfs4_cb_mounts, nmp, nm_cblink);
2213 while (nmp->nm_cbrefs)
2214 msleep(&nmp->nm_cbrefs, nfs_global_mutex, PSOCK, "cbshutwait", &ts);
2215 nmp->nm_cbid = 0;
2288 struct nfsmount *nmp;
2344 TAILQ_FOREACH(nmp, &nfs4_cb_mounts, nm_cblink) {
2346 if (!nmp->nm_saddr)
2348 if (nfs_sockaddr_cmp((struct sockaddr*)&ncbsp->ncbs_saddr, nmp->nm_saddr) == 0)
2351 if (!nmp) /* we don't want this socket, mark it dead */
2359 !nmp ? 500 : (NFS4_CB_TIMER_PERIOD * 1000));
2360 } else if (!nmp && (nfs4_callback_timer_on < 2)) {
2428 struct nfsmount *nmp;
2514 TAILQ_FOREACH(nmp, &nfs4_cb_mounts, nm_cblink) {
2515 if (nmp->nm_cbid != cbid)
2518 if (!nmp->nm_saddr)
2520 if (nfs_sockaddr_cmp((struct sockaddr*)&ncbsp->ncbs_saddr, nmp->nm_saddr) == 0)
2524 if (nmp)
2525 nmp->nm_cbrefs++;
2527 if (!nmp) {
2553 error = nfs_nget(nmp->nm_mountp, NULL, NULL, fh.fh_data, fh.fh_len, NULL, NULL, RPCAUTH_UNKNOWN, NG_NOCREATE, &np);
2614 error = nfs_nget(nmp->nm_mountp, NULL, NULL, fh.fh_data, fh.fh_len, NULL, NULL, RPCAUTH_UNKNOWN, NG_NOCREATE, &np);
2666 nmp->nm_cbrefs--;
2667 if (!nmp->nm_cbid)
2668 wakeup(&nmp->nm_cbrefs);
2904 struct nfsmount *nmp;
2932 nmp = req->r_nmp;
2933 sotype = nmp->nm_sotype;
2939 if (((req->r_flags & R_SETUP) && !(nmp->nm_sockflags & NMSOCK_SETUP)) ||
2940 ((req->r_flags & R_RECOVER) && !(nmp->nm_sockflags & NMSOCK_READY))) {
2952 lck_mtx_lock(&nmp->nm_lock);
2953 if (!(nmp->nm_sockflags & NMSOCK_READY) &&
2954 !((nmp->nm_sockflags & NMSOCK_SETUP) && (req->r_flags & R_SETUP))) {
2955 if (NMFLAG(nmp, INTR) && !(req->r_flags & R_NOINTR))
2957 lck_mtx_unlock(&nmp->nm_lock);
2972 lck_mtx_lock(&nmp->nm_lock);
2973 while (!(nmp->nm_sockflags & NMSOCK_READY)) {
2975 if (nmp->nm_state & NFSSTA_FORCE) {
2979 if (NMFLAG(nmp, SOFT) && (nmp->nm_reconnect_start > 0)) {
2982 if ((now.tv_sec - nmp->nm_reconnect_start) >= 8) {
2991 nfs_mount_sock_thread_wake(nmp);
2994 msleep(req, &nmp->nm_lock, slpflag|PSOCK, "nfsconnectwait", &ts);
2997 lck_mtx_unlock(&nmp->nm_lock);
3007 nso = nmp->nm_nso;
3009 nmp->nm_state |= NFSSTA_SENDING; /* will be cleared by nfs_sndunlock() */
3010 lck_mtx_unlock(&nmp->nm_lock);
3025 lck_mtx_lock(&nmp->nm_lock);
3026 if (!(req->r_flags & R_CWND) && (nmp->nm_sent >= nmp->nm_cwnd)) {
3028 slpflag = (NMFLAG(nmp, INTR) && req->r_thread) ? PCATCH : 0;
3029 lck_mtx_unlock(&nmp->nm_lock);
3038 lck_mtx_lock(&nmp->nm_lock);
3039 while (nmp->nm_sent >= nmp->nm_cwnd) {
3042 TAILQ_INSERT_TAIL(&nmp->nm_cwndq, req, r_cchain);
3043 msleep(req, &nmp->nm_lock, slpflag | (PZERO - 1), "nfswaitcwnd", &ts);
3046 TAILQ_REMOVE(&nmp->nm_cwndq, req, r_cchain);
3050 lck_mtx_unlock(&nmp->nm_lock);
3060 nmp->nm_sent += NFS_CWNDSCALE;
3067 nmp->nm_cwnd >>= 1;
3068 if (nmp->nm_cwnd < NFS_CWNDSCALE)
3069 nmp->nm_cwnd = NFS_CWNDSCALE;
3071 lck_mtx_unlock(&nmp->nm_lock);
3092 if ((sotype != SOCK_STREAM) && !sock_isconnected(nso->nso_so) && ((sendnam = nmp->nm_saddr))) {
3146 (error != EWOULDBLOCK) && (error != EIO) && (nso == nmp->nm_nso)) {
3178 if (needrecon && (nso == nmp->nm_nso)) { /* mark socket as needing reconnect */
3180 nfs_need_reconnect(nmp);
3198 if (nfs_is_dead(error, nmp))
3230 struct nfsmount *nmp = arg;
3231 struct nfs_socket *nso = nmp->nm_nso;
3236 if (nmp->nm_sockflags & NMSOCK_CONNECTING)
3248 nfs_request_match_reply(nmp, m);
3254 nfs_need_reconnect(nmp);
3262 struct nfsmount *nmp = arg;
3263 struct nfs_socket *nso = nmp->nm_nso;
3269 if (nmp->nm_sockflags & NMSOCK_CONNECTING)
3273 lck_mtx_lock(&nmp->nm_lock);
3274 nso = nmp->nm_nso;
3275 if (!nso || (nso->nso_so != so) || (nmp->nm_sockflags & (NMSOCK_DISCONNECTING))) {
3276 lck_mtx_unlock(&nmp->nm_lock);
3279 lck_mtx_unlock(&nmp->nm_lock);
3295 nfs_request_match_reply(nmp, m);
3298 lck_mtx_lock(&nmp->nm_lock);
3299 if (nmp->nm_nso == nso) {
3301 lck_mtx_unlock(&nmp->nm_lock);
3306 if (nmp->nm_sockflags & NMSOCK_DISCONNECTING)
3307 wakeup(&nmp->nm_sockflags);
3309 lck_mtx_unlock(&nmp->nm_lock);
3319 nfs_need_reconnect(nmp);
3327 nfs_sock_poke(struct nfsmount *nmp)
3335 lck_mtx_lock(&nmp->nm_lock);
3336 if ((nmp->nm_sockflags & NMSOCK_UNMOUNT) ||
3337 !(nmp->nm_sockflags & NMSOCK_READY) || !nmp->nm_nso || !nmp->nm_nso->nso_so) {
3338 lck_mtx_unlock(&nmp->nm_lock);
3341 lck_mtx_unlock(&nmp->nm_lock);
3348 error = sock_send(nmp->nm_nso->nso_so, &msg, MSG_DONTWAIT, &len);
3350 nfs_is_dead(error, nmp);
3357 nfs_request_match_reply(struct nfsmount *nmp, mbuf_t mrep)
3390 lck_mtx_lock(&nmp->nm_lock);
3391 if (nmp->nm_sotype == SOCK_DGRAM) {
3396 FSDBG(530, R_XID32(req->r_xid), req, nmp->nm_sent, nmp->nm_cwnd);
3397 if (nmp->nm_cwnd <= nmp->nm_sent) {
3398 nmp->nm_cwnd +=
3400 (nmp->nm_cwnd >> 1)) / nmp->nm_cwnd;
3401 if (nmp->nm_cwnd > NFS_MAXCWND)
3402 nmp->nm_cwnd = NFS_MAXCWND;
3405 nmp->nm_sent -= NFS_CWNDSCALE;
3408 if ((nmp->nm_sent < nmp->nm_cwnd) && !TAILQ_EMPTY(&nmp->nm_cwndq)) {
3410 struct nfsreq *req2 = TAILQ_FIRST(&nmp->nm_cwndq);
3411 TAILQ_REMOVE(&nmp->nm_cwndq, req2, r_cchain);
3439 nmp->nm_timeouts = 0;
3440 lck_mtx_unlock(&nmp->nm_lock);
3557 struct nfsmount *nmp;
3575 nmp = VFSTONFS(np ? NFSTOMP(np) : mp);
3576 if (!nmp) {
3581 lck_mtx_lock(&nmp->nm_lock);
3582 if ((nmp->nm_state & (NFSSTA_FORCE|NFSSTA_TIMEO)) ==
3584 lck_mtx_unlock(&nmp->nm_lock);
3592 if ((nmp->nm_vers != NFS_VER4) && (procnum >= 0) && (procnum < NFS_NPROCS))
3594 if ((nmp->nm_vers == NFS_VER4) && (procnum != NFSPROC4_COMPOUND) && (procnum != NFSPROC4_NULL))
3598 req->r_nmp = nmp;
3622 req->r_auth = nmp->nm_auth;
3624 lck_mtx_unlock(&nmp->nm_lock);
3643 struct nfsmount *nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
3656 if (nmp && (req->r_achain.tqe_next != NFSREQNOLIST)) {
3657 TAILQ_REMOVE(&nmp->nm_iodq, req, r_achain);
3663 if (nmp) {
3664 lck_mtx_lock(&nmp->nm_lock);
3668 nmp->nm_sent -= NFS_CWNDSCALE;
3669 if ((nmp->nm_sent < nmp->nm_cwnd) && !TAILQ_EMPTY(&nmp->nm_cwndq)) {
3671 struct nfsreq *req2 = TAILQ_FIRST(&nmp->nm_cwndq);
3672 TAILQ_REMOVE(&nmp->nm_cwndq, req2, r_cchain);
3678 TAILQ_REMOVE(&nmp->nm_resendq, req, r_rchain);
3684 TAILQ_REMOVE(&nmp->nm_cwndq, req, r_cchain);
3689 nmp->nm_jbreqs--;
3690 clearjbtimeo = (nmp->nm_jbreqs == 0) ? NFSSTA_JUKEBOXTIMEO : 0;
3692 lck_mtx_unlock(&nmp->nm_lock);
3698 nfs_up(nmp, req->r_thread, clearjbtimeo, NULL);
3755 struct nfsmount *nmp;
3766 nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
3767 if (!nmp)
3775 nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
3776 if (!nmp)
3778 lck_mtx_lock(&nmp->nm_lock);
3779 if (NMFLAG(nmp, SOFT))
3780 req->r_retry = nmp->nm_retry;
3783 lck_mtx_unlock(&nmp->nm_lock);
3795 struct nfsmount *nmp;
3804 nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
3805 if (!nmp) {
3814 ((nmp->nm_tprintf_delay) - (nmp->nm_tprintf_initial_delay));
3857 struct nfsmount *nmp;
3878 nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
3880 if ((req->r_flags & R_CWND) && nmp) {
3885 lck_mtx_lock(&nmp->nm_lock);
3886 FSDBG(273, R_XID32(req->r_xid), req, nmp->nm_sent, nmp->nm_cwnd);
3887 nmp->nm_sent -= NFS_CWNDSCALE;
3888 if ((nmp->nm_sent < nmp->nm_cwnd) && !TAILQ_EMPTY(&nmp->nm_cwndq)) {
3890 struct nfsreq *req2 = TAILQ_FIRST(&nmp->nm_cwndq);
3891 TAILQ_REMOVE(&nmp->nm_cwndq, req2, r_cchain);
3895 lck_mtx_unlock(&nmp->nm_lock);
3933 (nmp && NMFLAG(nmp, SOFT) &&
3934 ((nmp->nm_state & (NFSSTA_TIMEO|NFSSTA_FORCE)) == NFSSTA_TIMEO)))
3935 nfs_up(nmp, req->r_thread, NFSSTA_TIMEO, "is alive again");
3937 nfs_up(nmp, req->r_thread, NFSSTA_TIMEO, NULL);
3939 if (!error && !nmp)
4023 if ((nmp->nm_vers != NFS_VER2) && (*status == NFSERR_TRYLATER)) {
4027 int delay, slpflag = (NMFLAG(nmp, INTR) && !(req->r_flags & R_NOINTR)) ? PCATCH : 0;
4031 if ((req->r_delay >= 30) && !(nmp->nm_state & NFSSTA_MOUNTED)) {
4042 if (nmp->nm_tprintf_initial_delay && (req->r_delay >= nmp->nm_tprintf_initial_delay)) {
4045 lck_mtx_lock(&nmp->nm_lock);
4046 nmp->nm_jbreqs++;
4047 lck_mtx_unlock(&nmp->nm_lock);
4052 if (NMFLAG(nmp, SOFT) && (req->r_delay == 30) && !(req->r_flags & R_NOINTR)) {
4075 FSDBG(273, R_XID32(req->r_xid), nmp, req, NFSERR_TRYLATER);
4081 lck_mtx_lock(&nmp->nm_lock);
4082 nmp->nm_jbreqs--;
4083 clearjbtimeo = (nmp->nm_jbreqs == 0) ? NFSSTA_JUKEBOXTIMEO : 0;
4084 lck_mtx_unlock(&nmp->nm_lock);
4085 nfs_up(nmp, req->r_thread, clearjbtimeo, "resource available again");
4088 if ((nmp->nm_vers >= NFS_VER4) && (*status == NFSERR_WRONGSEC)) {
4101 nfs4_secinfo_rpc(nmp, &req->r_secinfo, req->r_cred, srvflavors, &srvcount);
4111 if (nmp->nm_sec.count) { /* use the mount's preferred list of flavors */
4112 for(; i < nmp->nm_sec.count; i++)
4113 req->r_wrongsec[i] = nmp->nm_sec.flavors[i];
4166 FSDBG(273, R_XID32(req->r_xid), nmp, req, NFSERR_WRONGSEC);
4169 if ((nmp->nm_vers >= NFS_VER4) && req->r_wrongsec) {
4198 if (nmp->nm_vers == NFS_VER2)
4225 lck_mtx_lock(&nmp->nm_lock);
4226 nmp->nm_jbreqs--;
4227 clearjbtimeo = (nmp->nm_jbreqs == 0) ? NFSSTA_JUKEBOXTIMEO : 0;
4228 lck_mtx_unlock(&nmp->nm_lock);
4230 nfs_up(nmp, req->r_thread, clearjbtimeo, NULL);
4232 FSDBG(273, R_XID32(req->r_xid), nmp, req,
4386 struct nfsmount *nmp;
4412 if ((req->r_flags & R_RESENDQ) && ((nmp = req->r_nmp))) {
4413 lck_mtx_lock(&nmp->nm_lock);
4414 if ((nmp->nm_state & NFSSTA_RECOVER) && (req->r_rchain.tqe_next != NFSREQNOLIST)) {
4420 TAILQ_REMOVE(&nmp->nm_resendq, req, r_rchain);
4424 lck_mtx_unlock(&nmp->nm_lock);
4433 lck_mtx_unlock(&nmp->nm_lock);
4463 struct nfsmount *nmp;
4470 if ((nmp = req->r_nmp)) {
4471 lck_mtx_lock(&nmp->nm_lock);
4472 if ((nmp->nm_state & NFSSTA_RECOVER) && (req->r_rchain.tqe_next != NFSREQNOLIST)) {
4478 TAILQ_REMOVE(&nmp->nm_resendq, req, r_rchain);
4482 lck_mtx_unlock(&nmp->nm_lock);
4485 lck_mtx_unlock(&nmp->nm_lock);
4542 struct nfsmount *nmp = req->r_nmp;
4545 if (!(req->r_flags & R_CWND) || !nmp)
4549 lck_mtx_lock(&nmp->nm_lock);
4550 FSDBG(532, R_XID32(req->r_xid), req, nmp->nm_sent, nmp->nm_cwnd);
4551 nmp->nm_sent -= NFS_CWNDSCALE;
4552 if ((nmp->nm_sent < nmp->nm_cwnd) && !TAILQ_EMPTY(&nmp->nm_cwndq)) {
4554 struct nfsreq *req2 = TAILQ_FIRST(&nmp->nm_cwndq);
4555 TAILQ_REMOVE(&nmp->nm_cwndq, req2, r_cchain);
4559 lck_mtx_unlock(&nmp->nm_lock);
4632 struct nfsmount *nmp;
4650 nmp = req->r_nmp;
4651 if (!nmp) /* unmounted */
4655 if ((error = nfs_sigintr(nmp, req, req->r_thread, 0))) {
4671 if (nmp->nm_tprintf_initial_delay &&
4673 ((req->r_lastmsg + nmp->nm_tprintf_delay) < now.tv_sec)) {
4678 lck_mtx_lock(&nmp->nm_lock);
4679 if (!(nmp->nm_state & NFSSTA_MOUNTED)) {
4680 lck_mtx_unlock(&nmp->nm_lock);
4692 lck_mtx_unlock(&nmp->nm_lock);
4699 if (!NMFLAG(nmp, SOFT) && !nfs_can_squish(nmp))
4702 ((nmp->nm_reconnect_start <= 0) || ((now.tv_sec - nmp->nm_reconnect_start) < 8)))
4703 maxtime = (NFS_MAXTIMEO / (nmp->nm_timeouts+1))/2;
4712 lck_mtx_lock(&nmp->nm_lock);
4719 else if (NMFLAG(nmp, DUMBTIMER))
4720 timeo = nmp->nm_timeo;
4722 timeo = NFS_RTO(nmp, proct[req->r_procnum]);
4727 if (nmp->nm_timeouts > 0)
4728 timeo *= nfs_backoff[nmp->nm_timeouts - 1];
4734 lck_mtx_unlock(&nmp->nm_lock);
4741 req->r_xid, req->r_rtt, timeo, nmp->nm_timeouts,
4743 if (nmp->nm_timeouts < 8)
4744 nmp->nm_timeouts++;
4745 nfs_mount_check_dead_timeout(nmp);
4747 if ((nmp->nm_sotype == SOCK_STREAM) &&
4749 !(nmp->nm_sockflags & (NMSOCK_POKE|NMSOCK_UNMOUNT)) &&
4750 (nmp->nm_sockflags & NMSOCK_READY)) {
4751 nmp->nm_sockflags |= NMSOCK_POKE;
4752 TAILQ_INSERT_TAIL(&nfs_mount_poke_queue, nmp, nm_pokeq);
4754 lck_mtx_unlock(&nmp->nm_lock);
4758 if ((NMFLAG(nmp, SOFT) || (req->r_flags & (R_SETUP|R_RECOVER))) &&
4762 lck_mtx_lock(&nmp->nm_lock);
4763 if (!(nmp->nm_state & NFSSTA_TIMEO)) {
4764 lck_mtx_unlock(&nmp->nm_lock);
4772 lck_mtx_unlock(&nmp->nm_lock);
4792 if ((nmp->nm_sotype == SOCK_STREAM) && !(req->r_flags & R_MUSTRESEND)) {
4821 while ((nmp = TAILQ_FIRST(&nfs_mount_poke_queue))) {
4822 TAILQ_REMOVE(&nfs_mount_poke_queue, nmp, nm_pokeq);
4823 nfs_sock_poke(nmp);
4824 lck_mtx_lock(&nmp->nm_lock);
4825 nmp->nm_sockflags &= ~NMSOCK_POKE;
4826 wakeup(&nmp->nm_sockflags);
4827 lck_mtx_unlock(&nmp->nm_lock);
4853 nfs_sigintr(struct nfsmount *nmp, struct nfsreq *req, thread_t thd, int nmplocked)
4858 if (nmp == NULL)
4867 lck_mtx_lock(&nmp->nm_lock);
4868 if (nmp->nm_state & NFSSTA_FORCE) {
4871 } else if (nmp->nm_mountp->mnt_kern_flag & MNTK_FRCUNMOUNT) {
4873 NFS_BITMAP_SET(nmp->nm_flags, NFS_MFLAG_SOFT);
4874 nmp->nm_state |= NFSSTA_FORCE;
4878 if (!error && (nmp->nm_state & NFSSTA_DEAD))
4886 !error && (nmp->nm_state & NFSSTA_TIMEO) && nfs_noremotehang(thd))
4890 lck_mtx_unlock(&nmp->nm_lock);
4911 if (NMFLAG(nmp, INTR) && ((p = get_bsdthreadtask_info(thd))) &&
4926 struct nfsmount *nmp = req->r_nmp;
4931 if (nmp == NULL)
4934 lck_mtx_lock(&nmp->nm_lock);
4935 statep = &nmp->nm_state;
4937 if (NMFLAG(nmp, INTR) && req->r_thread && !(req->r_flags & R_NOINTR))
4940 if ((error = nfs_sigintr(nmp, req, req->r_thread, 1)))
4945 msleep(statep, &nmp->nm_lock, slpflag | (PZERO - 1), "nfsndlck", &ts);
4953 lck_mtx_unlock(&nmp->nm_lock);
4963 struct nfsmount *nmp = req->r_nmp;
4966 if (nmp == NULL)
4968 lck_mtx_lock(&nmp->nm_lock);
4969 statep = &nmp->nm_state;
4977 lck_mtx_unlock(&nmp->nm_lock);
4984 struct nfsmount *nmp,
5066 if ((error = nfs_sigintr(nmp, NULL, !try ? NULL : thd, 0)))
5156 struct nfsmount *nmp,
5215 error = nfsm_rpchead2(nmp, (ipproto == IPPROTO_UDP) ? SOCK_DGRAM : SOCK_STREAM,
5220 error = nfs_aux_request(nmp, thd, saddr, so, (ipproto == IPPROTO_UDP) ? SOCK_DGRAM : SOCK_STREAM,
5307 nfs_can_squish(struct nfsmount *nmp)
5309 uint64_t flags = vfs_flags(nmp->nm_mountp);
5310 int softsquish = ((nfs_squishy_flags & NFS_SQUISH_SOFT) & NMFLAG(nmp, SOFT));
5353 nfs_is_squishy(struct nfsmount *nmp)
5355 mount_t mp = nmp->nm_mountp;
5360 vfs_statfs(mp)->f_mntfromname, nmp->nm_curdeadtimeout, nfs_is_mobile);
5362 if (!nfs_can_squish(nmp))
5365 timeo = (nmp->nm_deadtimeout > timeo) ? max(nmp->nm_deadtimeout/8, timeo) : timeo;
5366 NFS_SOCK_DBG("nm_writers = %d nm_mappers = %d timeo = %d\n", nmp->nm_writers, nmp->nm_mappers, timeo);
5368 if (nmp->nm_writers == 0 && nmp->nm_mappers == 0) {
5377 if (!(flags & MNT_RDONLY) && !(nmp->nm_state & NFSSTA_SQUISHY))
5383 nmp->nm_state |= NFSSTA_SQUISHY;
5385 nmp->nm_state &= ~NFSSTA_SQUISHY;
5387 nmp->nm_curdeadtimeout = squishy ? timeo : nmp->nm_deadtimeout;
5389 NFS_SOCK_DBG("nm_curdeadtimeout = %d\n", nmp->nm_curdeadtimeout);
5400 nfs_is_dead_lock(int error, struct nfsmount *nmp)
5402 if (nmp->nm_state & NFSSTA_DEAD)
5406 !(nmp->nm_locations.nl_numlocs == 1 && nmp->nm_locations.nl_locations[0]->nl_servcount == 1))
5409 if ((nfs_squishy_flags & NFS_SQUISH_QUICK) && nfs_is_squishy(nmp)) {
5410 printf("nfs_is_dead: nfs server %s: unreachable. Squished dead\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname);
5411 nmp->nm_state |= NFSSTA_DEAD;
5412 vfs_event_signal(&vfs_statfs(nmp->nm_mountp)->f_fsid, VQ_DEAD, 0);
5419 nfs_is_dead(int error, struct nfsmount *nmp)
5423 lck_mtx_lock(&nmp->nm_lock);
5424 is_dead = nfs_is_dead_lock(error, nmp);
5425 lck_mtx_unlock(&nmp->nm_lock);
5431 nfs_down(struct nfsmount *nmp, thread_t thd, int error, int flags, const char *msg)
5437 if (nmp == NULL)
5440 lck_mtx_lock(&nmp->nm_lock);
5443 if (NMFLAG(nmp, MUTEJUKEBOX)) /* jukebox timeouts don't count as unresponsive if muted */
5445 wasunresponsive = (nmp->nm_state & timeoutmask);
5448 softnobrowse = (NMFLAG(nmp, SOFT) && (vfs_flags(nmp->nm_mountp) & MNT_DONTBROWSE));
5450 if ((flags & NFSSTA_TIMEO) && !(nmp->nm_state & NFSSTA_TIMEO))
5451 nmp->nm_state |= NFSSTA_TIMEO;
5452 if ((flags & NFSSTA_LOCKTIMEO) && !(nmp->nm_state & NFSSTA_LOCKTIMEO))
5453 nmp->nm_state |= NFSSTA_LOCKTIMEO;
5454 if ((flags & NFSSTA_JUKEBOXTIMEO) && !(nmp->nm_state & NFSSTA_JUKEBOXTIMEO))
5455 nmp->nm_state |= NFSSTA_JUKEBOXTIMEO;
5457 unresponsive = (nmp->nm_state & timeoutmask);
5459 nfs_is_squishy(nmp);
5461 if (unresponsive && (nmp->nm_curdeadtimeout > 0)) {
5464 nmp->nm_deadto_start = now.tv_sec;
5465 nfs_mount_sock_thread_wake(nmp);
5466 } else if ((now.tv_sec - nmp->nm_deadto_start) > nmp->nm_curdeadtimeout) {
5467 if (!(nmp->nm_state & NFSSTA_DEAD))
5468 printf("nfs server %s: %sdead\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname,
5469 (nmp->nm_curdeadtimeout != nmp->nm_deadtimeout) ? "squished " : "");
5470 nmp->nm_state |= NFSSTA_DEAD;
5473 lck_mtx_unlock(&nmp->nm_lock);
5475 if (nmp->nm_state & NFSSTA_DEAD)
5482 vfs_event_signal(&vfs_statfs(nmp->nm_mountp)->f_fsid, do_vfs_signal, 0);
5484 nfs_msg(thd, vfs_statfs(nmp->nm_mountp)->f_mntfromname, msg, error);
5488 nfs_up(struct nfsmount *nmp, thread_t thd, int flags, const char *msg)
5493 if (nmp == NULL)
5497 nfs_msg(thd, vfs_statfs(nmp->nm_mountp)->f_mntfromname, msg, 0);
5499 lck_mtx_lock(&nmp->nm_lock);
5502 if (NMFLAG(nmp, MUTEJUKEBOX)) /* jukebox timeouts don't count as unresponsive if muted */
5504 wasunresponsive = (nmp->nm_state & timeoutmask);
5507 softnobrowse = (NMFLAG(nmp, SOFT) && (vfs_flags(nmp->nm_mountp) & MNT_DONTBROWSE));
5509 if ((flags & NFSSTA_TIMEO) && (nmp->nm_state & NFSSTA_TIMEO))
5510 nmp->nm_state &= ~NFSSTA_TIMEO;
5511 if ((flags & NFSSTA_LOCKTIMEO) && (nmp->nm_state & NFSSTA_LOCKTIMEO))
5512 nmp->nm_state &= ~NFSSTA_LOCKTIMEO;
5513 if ((flags & NFSSTA_JUKEBOXTIMEO) && (nmp->nm_state & NFSSTA_JUKEBOXTIMEO))
5514 nmp->nm_state &= ~NFSSTA_JUKEBOXTIMEO;
5516 unresponsive = (nmp->nm_state & timeoutmask);
5518 nmp->nm_deadto_start = 0;
5519 nmp->nm_curdeadtimeout = nmp->nm_deadtimeout;
5520 nmp->nm_state &= ~NFSSTA_SQUISHY;
5521 lck_mtx_unlock(&nmp->nm_lock);
5528 vfs_event_signal(&vfs_statfs(nmp->nm_mountp)->f_fsid, VQ_NOTRESP, 1);