Lines Matching defs:nmp

457 	__unused struct nfsmount *nmp,
535 vfs_statfs(nmp->nm_mountp)->f_mntfromname, error, nso, naddr, sotype,
540 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, naddr,
577 nfs_socket_options(struct nfsmount *nmp, struct nfs_socket *nso)
590 timeo.tv_sec = (NMFLAG(nmp, SOFT) || nfs_can_squish(nmp)) ? 5 : 60;
611 if (!NMFLAG(nmp, INTR))
687 nfs_connect_search_loop(struct nfsmount *nmp, struct nfs_socket_search *nss)
699 NFS_SOCK_DBG(("nfs connect %s search %ld\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname, now.tv_sec));
704 if (nmp->nm_sockflags & NMSOCK_UNMOUNT)
716 fsl = nmp->nm_locations.nl_locations[nss->nss_nextloc.nli_loc];
720 nfs_location_next(&nmp->nm_locations, &nss->nss_nextloc);
725 if (nmp->nm_sofamily && (ss.ss_family != nmp->nm_sofamily)) {
726 nfs_location_next(&nmp->nm_locations, &nss->nss_nextloc);
732 error = nfs_socket_create(nmp, (struct sockaddr*)&ss, nss->nss_sotype,
734 ((nss->nss_protocol == NFS_PROG) && NMFLAG(nmp, RESVPORT)), &nso);
750 nfs_location_next(&nmp->nm_locations, &nss->nss_nextloc);
759 if ((nso->nso_sotype != SOCK_STREAM) && NMFLAG(nmp, NOCONNECT)) {
763 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
769 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
783 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
792 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error));
795 error, vfs_statfs(nmp->nm_mountp)->f_mntfromname);
804 nfs_socket_options(nmp, nso);
826 error = nfsm_rpchead2(nmp, nso->nso_sotype, nso->nso_protocol, vers, 0, RPCAUTH_SYS,
843 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error));
858 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
880 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
890 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, nso->nso_error));
908 vfs_statfs(nmp->nm_mountp)->f_mntfromname);
911 if (nmp->nm_sockflags & NMSOCK_UNMOUNT)
913 if ((error = nfs_sigintr(nmp, NULL, current_thread(), 0)))
920 NFS_SOCK_DBG(("nfs connect %s returning %d\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname, error));
940 nfs_connect(struct nfsmount *nmp, int verbose, int timeo)
949 uint8_t sotype = nmp->nm_sotype ? nmp->nm_sotype : SOCK_STREAM;
956 for (loc=0; loc < nmp->nm_locations.nl_numlocs; loc++) {
957 for (serv=0; serv < nmp->nm_locations.nl_locations[loc]->nl_servcount; serv++) {
958 if (nmp->nm_locations.nl_locations[loc]->nl_servers[serv]->ns_addrcount)
961 vfs_statfs(nmp->nm_mountp)->f_mntfromname,
962 nmp->nm_locations.nl_locations[loc]->nl_servers[serv]->ns_name));
964 if (serv < nmp->nm_locations.nl_locations[loc]->nl_servcount)
967 if (loc >= nmp->nm_locations.nl_numlocs) {
969 vfs_statfs(nmp->nm_mountp)->f_mntfromname));
973 lck_mtx_lock(&nmp->nm_lock);
974 nmp->nm_sockflags |= NMSOCK_CONNECTING;
975 nmp->nm_nss = &nss;
976 lck_mtx_unlock(&nmp->nm_lock);
986 nss.nss_startloc = nmp->nm_locations.nl_current;
993 if (!(nmp->nm_sockflags & NMSOCK_HASCONNECTED)) {
994 if (!nmp->nm_vers) {
996 if (!nmp->nm_nfsport || (!NM_OMATTR_GIVEN(nmp, FH) && !nmp->nm_mountport)) {
1003 nss.nss_port = nmp->nm_nfsport;
1007 } else if (nmp->nm_vers >= NFS_VER4) {
1009 nss.nss_port = nmp->nm_nfsport ? nmp->nm_nfsport : NFS_PORT;
1014 if (!nmp->nm_nfsport || (!NM_OMATTR_GIVEN(nmp, FH) && !nmp->nm_mountport)) {
1021 nss.nss_port = nmp->nm_nfsport;
1023 nss.nss_version = nmp->nm_vers;
1027 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nss.nss_sotype, nss.nss_port,
1031 if (!nmp->nm_nfsport) {
1037 nss.nss_port = nmp->nm_nfsport;
1039 nss.nss_version = nmp->nm_vers;
1042 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nss.nss_sotype, nss.nss_port,
1049 if ((nss.nss_nextloc.nli_serv >= nmp->nm_locations.nl_locations[nss.nss_nextloc.nli_loc]->nl_servcount) ||
1050 (nss.nss_nextloc.nli_addr >= nmp->nm_locations.nl_locations[nss.nss_nextloc.nli_loc]->nl_servers[nss.nss_nextloc.nli_serv]->ns_addrcount)) {
1051 nfs_location_next(&nmp->nm_locations, &nss.nss_nextloc);
1054 vfs_statfs(nmp->nm_mountp)->f_mntfromname));
1062 error = nfs_connect_search_loop(nmp, &nss);
1066 if (!error && (nss.nss_sotype == SOCK_STREAM) && !nmp->nm_sotype && (nmp->nm_vers < NFS_VER4)) {
1071 vfs_statfs(nmp->nm_mountp)->f_mntfromname, error, nss.nss_error));
1076 lck_mtx_lock(&nmp->nm_lock);
1077 nmp->nm_sockflags &= ~NMSOCK_CONNECTING;
1078 nmp->nm_nss = NULL;
1079 lck_mtx_unlock(&nmp->nm_lock);
1082 vfs_statfs(nmp->nm_mountp)->f_mntfromname);
1088 vfs_statfs(nmp->nm_mountp)->f_mntfromname, error));
1104 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
1113 nfsvers = nmp->nm_vers ? nmp->nm_vers : NFS_VER3;
1115 if (!(port = nmp->nm_nfsport)) {
1120 error = nfs_portmap_lookup(nmp, vfs_context_current(), (struct sockaddr*)&ss,
1131 if (error && !nmp->nm_vers) {
1133 error = nfs_portmap_lookup(nmp, vfs_context_current(), (struct sockaddr*)&ss,
1152 error = nfs_socket_create(nmp, (struct sockaddr*)&ss, nso->nso_sotype, port,
1153 NFS_PROG, nfsvers, NMFLAG(nmp, RESVPORT), &nsonfs);
1170 if ((nfsvers < NFS_VER4) && !(nmp->nm_sockflags & NMSOCK_HASCONNECTED) && !NM_OMATTR_GIVEN(nmp, FH)) {
1174 port = nmp->nm_mountport;
1183 int mntproto = (NM_OMFLAG(nmp, MNTUDP) || (nso->nso_sotype == SOCK_DGRAM)) ? IPPROTO_UDP : IPPROTO_TCP;
1184 error = nfs_portmap_lookup(nmp, vfs_context_current(), (struct sockaddr*)&ss,
1214 NFS_SOCK_DBG(("nfs connect %s got NFS socket %p\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
1217 nfsvers = nmp->nm_vers ? nmp->nm_vers : (int)nso->nso_version;
1220 if ((nfsvers < NFS_VER4) && !(nmp->nm_sockflags & NMSOCK_HASCONNECTED) && !NM_OMATTR_GIVEN(nmp, FH)) {
1226 port = nmp->nm_mountport;
1234 int mntproto = (NM_OMFLAG(nmp, MNTUDP) || (nso->nso_sotype == SOCK_DGRAM)) ? IPPROTO_UDP : IPPROTO_TCP;
1235 error = nfs_portmap_lookup(nmp, vfs_context_current(), (struct sockaddr*)&ss,
1266 nfs_location_mntfromname(&nmp->nm_locations, nso->nso_location, path, MAXPATHLEN, 1);
1267 error = nfs3_mount_rpc(nmp, saddr, nso->nso_sotype, nfsvers,
1268 path, vfs_context_current(), timeo, fh, &nmp->nm_servsec);
1270 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error));
1276 if ((nfsvers == NFS_VER3) && !nmp->nm_servsec.count) {
1278 nmp->nm_servsec.count = 1;
1279 nmp->nm_servsec.flavors[0] = RPCAUTH_SYS;
1281 if (nmp->nm_sec.count) {
1283 if (!nmp->nm_servsec.count) {
1285 nmp->nm_auth = nmp->nm_sec.flavors[0];
1288 for (o=0; !found && (o < nmp->nm_sec.count); o++)
1289 for (s=0; !found && (s < nmp->nm_servsec.count); s++)
1290 if (nmp->nm_sec.flavors[o] == nmp->nm_servsec.flavors[s]) {
1291 nmp->nm_auth = nmp->nm_sec.flavors[o];
1296 if (!nmp->nm_servsec.count) {
1297 nmp->nm_auth = RPCAUTH_SYS;
1300 for (s=0; s < nmp->nm_servsec.count; s++)
1301 switch (nmp->nm_servsec.flavors[s]) {
1304 if (found && (nmp->nm_auth == RPCAUTH_NONE))
1311 nmp->nm_auth = nmp->nm_servsec.flavors[s];
1328 if (nmp->nm_fh)
1329 FREE(nmp->nm_fh, M_TEMP);
1330 nmp->nm_fh = fh;
1332 NFS_BITMAP_SET(nmp->nm_flags, NFS_MFLAG_CALLUMNT);
1337 error = sock_setupcall(nso->nso_so, upcall, nmp);
1344 if (!(nmp->nm_sockflags & NMSOCK_HASCONNECTED)) {
1346 if (!NM_OMATTR_GIVEN(nmp, MNTFROM))
1347 nfs_location_mntfromname(&nmp->nm_locations, nso->nso_location,
1348 vfs_statfs(nmp->nm_mountp)->f_mntfromname,
1349 sizeof(vfs_statfs(nmp->nm_mountp)->f_mntfromname), 0);
1351 if (!nmp->nm_sotype)
1352 nmp->nm_sotype = nso->nso_sotype;
1353 if (!nmp->nm_vers) {
1354 nmp->nm_vers = nfsvers;
1356 if ((nfsvers >= NFS_VER4) && !NFS_BITMAP_ISSET(nmp->nm_mattrs, NFS_MATTR_NFS_PORT)) {
1364 nmp->nm_nfsport = NFS_PORT;
1368 if (nmp->nm_vers >= NFS_VER4) {
1370 nmp->nm_mounttime = ((uint64_t)now.tv_sec << 32) | now.tv_usec;
1371 if (!NMFLAG(nmp, NOCALLBACK))
1372 nfs4_mount_callback_setup(nmp);
1377 lck_mtx_lock(&nmp->nm_lock);
1378 nmp->nm_srtt[0] = nmp->nm_srtt[1] = nmp->nm_srtt[2] =
1379 nmp->nm_srtt[3] = (NFS_TIMEO << 3);
1380 nmp->nm_sdrtt[0] = nmp->nm_sdrtt[1] = nmp->nm_sdrtt[2] =
1381 nmp->nm_sdrtt[3] = 0;
1383 nmp->nm_cwnd = NFS_MAXCWND / 2; /* Initial send window */
1384 nmp->nm_sent = 0;
1386 nmp->nm_timeouts = 0;
1388 nmp->nm_sockflags &= ~NMSOCK_CONNECTING;
1389 nmp->nm_sockflags |= NMSOCK_SETUP;
1391 nmp->nm_nso = nso;
1392 oldsaddr = nmp->nm_saddr;
1393 nmp->nm_saddr = nso->nso_saddr;
1394 lck_mtx_unlock(&nmp->nm_lock);
1395 error = nfs_connect_setup(nmp);
1396 lck_mtx_lock(&nmp->nm_lock);
1397 nmp->nm_sockflags &= ~NMSOCK_SETUP;
1399 nmp->nm_sockflags |= NMSOCK_READY;
1400 wakeup(&nmp->nm_sockflags);
1404 vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error));
1406 nmp->nm_saddr = oldsaddr;
1407 if (!(nmp->nm_sockflags & NMSOCK_HASCONNECTED)) {
1409 if (!NFS_BITMAP_ISSET(nmp->nm_mattrs, NFS_MATTR_SOCKET_TYPE))
1410 nmp->nm_sotype = 0;
1411 if (!NFS_BITMAP_ISSET(nmp->nm_mattrs, NFS_MATTR_NFS_VERSION)) {
1412 if (nmp->nm_vers >= NFS_VER4) {
1413 if (!NFS_BITMAP_ISSET(nmp->nm_mattrs, NFS_MATTR_NFS_PORT))
1414 nmp->nm_nfsport = 0;
1415 if (nmp->nm_cbid)
1416 nfs4_mount_callback_shutdown(nmp);
1417 if (IS_VALID_CRED(nmp->nm_mcred))
1418 kauth_cred_unref(&nmp->nm_mcred);
1419 bzero(&nmp->nm_un, sizeof(nmp->nm_un));
1421 nmp->nm_vers = 0;
1424 lck_mtx_unlock(&nmp->nm_lock);
1425 nmp->nm_nso = NULL;
1431 if ((nmp->nm_locations.nl_current.nli_flags & NLI_VALID) &&
1432 (nmp->nm_locations.nl_current.nli_serv != nso->nso_location.nli_serv)) {
1436 nmp->nm_locations.nl_current = nso->nso_location;
1437 nmp->nm_locations.nl_current.nli_flags |= NLI_VALID;
1439 if (!(nmp->nm_sockflags & NMSOCK_HASCONNECTED)) {
1441 nmp->nm_sockflags |= NMSOCK_HASCONNECTED;
1444 lck_mtx_unlock(&nmp->nm_lock);
1450 vfs_statfs(nmp->nm_mountp)->f_mntfromname);
1452 nmp->nm_nss = NULL;
1458 NFS_SOCK_DBG(("nfs connect %s success\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname));
1465 nfs_connect_setup(struct nfsmount *nmp)
1469 if (nmp->nm_vers >= NFS_VER4) {
1470 if (nmp->nm_state & NFSSTA_CLIENTID) {
1472 error = nfs4_renew(nmp, R_SETUP);
1478 lck_mtx_lock(&nmp->nm_lock);
1479 nfs_need_recover(nmp, error);
1480 lck_mtx_unlock(&nmp->nm_lock);
1483 error = nfs4_setclientid(nmp);
1497 nfs_reconnect(struct nfsmount *nmp)
1507 lastmsg = now.tv_sec - (nmp->nm_tprintf_delay - nmp->nm_tprintf_initial_delay);
1509 nfs_disconnect(nmp);
1512 lck_mtx_lock(&nmp->nm_lock);
1513 timeo = nfs_is_squishy(nmp) ? 8 : 30;
1514 lck_mtx_unlock(&nmp->nm_lock);
1516 while ((error = nfs_connect(nmp, verbose, timeo))) {
1518 nfs_disconnect(nmp);
1524 if ((lastmsg + nmp->nm_tprintf_delay) < now.tv_sec) {
1526 nfs_down(nmp, thd, error, NFSSTA_TIMEO, "can not connect");
1529 lck_mtx_lock(&nmp->nm_lock);
1530 if (!(nmp->nm_state & NFSSTA_MOUNTED)) {
1533 lck_mtx_unlock(&nmp->nm_lock);
1536 nfs_mount_check_dead_timeout(nmp);
1537 if ((error = nfs_sigintr(nmp, NULL, thd, 1))) {
1538 lck_mtx_unlock(&nmp->nm_lock);
1541 lck_mtx_unlock(&nmp->nm_lock);
1543 if ((error = nfs_sigintr(nmp, NULL, thd, 0)))
1548 nfs_up(nmp, thd, NFSSTA_TIMEO, "connected");
1557 if (rq->r_nmp == nmp) {
1577 nfs_disconnect(struct nfsmount *nmp)
1581 lck_mtx_lock(&nmp->nm_lock);
1583 if (nmp->nm_nso) {
1585 if (nmp->nm_state & NFSSTA_SENDING) { /* wait for sending to complete */
1586 nmp->nm_state |= NFSSTA_WANTSND;
1587 msleep(&nmp->nm_state, &nmp->nm_lock, PZERO-1, "nfswaitsending", &ts);
1590 if (nmp->nm_sockflags & NMSOCK_POKE) { /* wait for poking to complete */
1591 msleep(&nmp->nm_sockflags, &nmp->nm_lock, PZERO-1, "nfswaitpoke", &ts);
1594 nmp->nm_sockflags |= NMSOCK_DISCONNECTING;
1595 nmp->nm_sockflags &= ~NMSOCK_READY;
1596 nso = nmp->nm_nso;
1597 nmp->nm_nso = NULL;
1598 if (nso->nso_saddr == nmp->nm_saddr)
1600 lck_mtx_unlock(&nmp->nm_lock);
1602 lck_mtx_lock(&nmp->nm_lock);
1603 nmp->nm_sockflags &= ~NMSOCK_DISCONNECTING;
1604 lck_mtx_unlock(&nmp->nm_lock);
1606 lck_mtx_unlock(&nmp->nm_lock);
1614 nfs_need_reconnect(struct nfsmount *nmp)
1618 lck_mtx_lock(&nmp->nm_lock);
1619 nmp->nm_sockflags &= ~(NMSOCK_READY|NMSOCK_SETUP);
1620 lck_mtx_unlock(&nmp->nm_lock);
1628 if (rq->r_nmp == nmp) {
1650 struct nfsmount *nmp = arg;
1658 lck_mtx_lock(&nmp->nm_lock);
1660 while (!(nmp->nm_sockflags & NMSOCK_READY) ||
1661 !TAILQ_EMPTY(&nmp->nm_resendq) ||
1662 !LIST_EMPTY(&nmp->nm_monlist) ||
1663 nmp->nm_deadto_start ||
1664 (nmp->nm_state & NFSSTA_RECOVER) ||
1665 ((nmp->nm_vers >= NFS_VER4) && !TAILQ_EMPTY(&nmp->nm_dreturnq)))
1667 if (nmp->nm_sockflags & NMSOCK_UNMOUNT)
1670 if (!(nmp->nm_sockflags & NMSOCK_READY) && !(nmp->nm_state & NFSSTA_FORCE)) {
1671 if (nmp->nm_reconnect_start <= 0) {
1673 nmp->nm_reconnect_start = now.tv_sec;
1675 lck_mtx_unlock(&nmp->nm_lock);
1676 NFS_SOCK_DBG(("nfs reconnect %s\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname));
1677 if (nfs_reconnect(nmp) == 0)
1678 nmp->nm_reconnect_start = 0;
1679 lck_mtx_lock(&nmp->nm_lock);
1681 if ((nmp->nm_sockflags & NMSOCK_READY) &&
1682 (nmp->nm_state & NFSSTA_RECOVER) &&
1683 !(nmp->nm_sockflags & NMSOCK_UNMOUNT) &&
1684 !(nmp->nm_state & NFSSTA_FORCE)) {
1686 lck_mtx_unlock(&nmp->nm_lock);
1687 nfs_recover(nmp);
1688 lck_mtx_lock(&nmp->nm_lock);
1691 while ((nmp->nm_vers >= NFS_VER4) && !(nmp->nm_state & NFSSTA_FORCE) &&
1692 (nmp->nm_sockflags & NMSOCK_READY) && !(nmp->nm_state & NFSSTA_RECOVER) &&
1693 ((np = TAILQ_FIRST(&nmp->nm_dreturnq)))) {
1694 lck_mtx_unlock(&nmp->nm_lock);
1695 nfs4_delegation_return(np, R_RECOVER, thd, nmp->nm_mcred);
1696 lck_mtx_lock(&nmp->nm_lock);
1699 while ((((nmp->nm_sockflags & NMSOCK_READY) && !(nmp->nm_state & NFSSTA_RECOVER)) || (nmp->nm_state & NFSSTA_FORCE)) &&
1700 ((req = TAILQ_FIRST(&nmp->nm_resendq)))) {
1703 while (req && !(nmp->nm_state & NFSSTA_FORCE) && req->r_resendtime && (now.tv_sec < req->r_resendtime))
1707 TAILQ_REMOVE(&nmp->nm_resendq, req, r_rchain);
1709 lck_mtx_unlock(&nmp->nm_lock);
1718 lck_mtx_lock(&nmp->nm_lock);
1738 error = nfs_sigintr(nmp, req, req->r_thread, 0);
1753 lck_mtx_lock(&nmp->nm_lock);
1761 error = nfs_sigintr(nmp, req, req->r_thread, 0);
1772 lck_mtx_lock(&nmp->nm_lock);
1784 lck_mtx_lock(&nmp->nm_lock);
1786 if (nmp->nm_deadto_start)
1787 nfs_mount_check_dead_timeout(nmp);
1788 if (nmp->nm_state & (NFSSTA_FORCE|NFSSTA_DEAD))
1791 if (!LIST_EMPTY(&nmp->nm_monlist)) {
1792 nmp->nm_state |= NFSSTA_MONITOR_SCAN;
1793 LIST_FOREACH(np, &nmp->nm_monlist, n_monlink) {
1794 if (!(nmp->nm_sockflags & NMSOCK_READY) || (nmp->nm_state & (NFSSTA_RECOVER|NFSSTA_UNMOUNTING|NFSSTA_FORCE)))
1797 lck_mtx_unlock(&nmp->nm_lock);
1801 lck_mtx_lock(&nmp->nm_lock);
1807 if (error || !(nmp->nm_sockflags & NMSOCK_READY) || (nmp->nm_state & (NFSSTA_RECOVER|NFSSTA_UNMOUNTING|NFSSTA_FORCE)))
1810 nmp->nm_state &= ~NFSSTA_MONITOR_SCAN;
1811 if (nmp->nm_state & NFSSTA_UNMOUNTING)
1812 wakeup(&nmp->nm_state); /* let unmounting thread know scan is done */
1814 if ((nmp->nm_sockflags & NMSOCK_READY) || (nmp->nm_state & (NFSSTA_RECOVER|NFSSTA_UNMOUNTING))) {
1815 if (nmp->nm_deadto_start || !TAILQ_EMPTY(&nmp->nm_resendq) ||
1816 (nmp->nm_state & NFSSTA_RECOVER))
1820 msleep(&nmp->nm_sockthd, &nmp->nm_lock, PSOCK, "nfssockthread", &ts);
1825 if ((nmp->nm_sockflags & NMSOCK_UNMOUNT) &&
1826 (nmp->nm_state & NFSSTA_MOUNTED) && NMFLAG(nmp, CALLUMNT) &&
1827 (nmp->nm_vers < NFS_VER4) && !(nmp->nm_state & (NFSSTA_FORCE|NFSSTA_DEAD))) {
1828 lck_mtx_unlock(&nmp->nm_lock);
1829 nfs3_umount_rpc(nmp, vfs_context_kernel(),
1830 (nmp->nm_sockflags & NMSOCK_READY) ? 6 : 2);
1831 lck_mtx_lock(&nmp->nm_lock);
1834 if (nmp->nm_sockthd == thd)
1835 nmp->nm_sockthd = NULL;
1836 lck_mtx_unlock(&nmp->nm_lock);
1837 wakeup(&nmp->nm_sockthd);
1843 nfs_mount_sock_thread_wake(struct nfsmount *nmp)
1845 if (nmp->nm_sockthd)
1846 wakeup(&nmp->nm_sockthd);
1847 else if (kernel_thread_start(nfs_mount_sock_thread, nmp, &nmp->nm_sockthd) == KERN_SUCCESS)
1848 thread_deallocate(nmp->nm_sockthd);
1854 * (must be called with nmp locked)
1857 nfs_mount_check_dead_timeout(struct nfsmount *nmp)
1861 if (nmp->nm_deadto_start == 0)
1863 if (nmp->nm_state & NFSSTA_DEAD)
1865 nfs_is_squishy(nmp);
1866 if (nmp->nm_curdeadtimeout <= 0)
1869 if ((now.tv_sec - nmp->nm_deadto_start) < nmp->nm_curdeadtimeout)
1871 printf("nfs server %s: %sdead\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname,
1872 (nmp->nm_curdeadtimeout != nmp->nm_deadtimeout) ? "squished " : "");
1873 nmp->nm_state |= NFSSTA_DEAD;
1874 vfs_event_signal(&vfs_statfs(nmp->nm_mountp)->f_fsid, VQ_DEAD, 0);
1920 nfs4_mount_callback_setup(struct nfsmount *nmp)
1936 nmp->nm_cbid = nfs4_cb_id++;
1937 if (nmp->nm_cbid == 0)
1938 nmp->nm_cbid = nfs4_cb_id++;
1940 TAILQ_INSERT_HEAD(&nfs4_cb_mounts, nmp, nm_cblink);
2071 nfs4_mount_callback_shutdown(struct nfsmount *nmp)
2079 TAILQ_REMOVE(&nfs4_cb_mounts, nmp, nm_cblink);
2081 while (nmp->nm_cbrefs)
2082 msleep(&nmp->nm_cbrefs, nfs_global_mutex, PSOCK, "cbshutwait", &ts);
2083 nmp->nm_cbid = 0;
2156 struct nfsmount *nmp;
2212 TAILQ_FOREACH(nmp, &nfs4_cb_mounts, nm_cblink) {
2214 if (!nmp->nm_saddr)
2216 if (nfs_sockaddr_cmp((struct sockaddr*)&ncbsp->ncbs_saddr, nmp->nm_saddr) == 0)
2219 if (!nmp) /* we don't want this socket, mark it dead */
2227 !nmp ? 500 : (NFS4_CB_TIMER_PERIOD * 1000));
2228 } else if (!nmp && (nfs4_callback_timer_on < 2)) {
2296 struct nfsmount *nmp;
2382 TAILQ_FOREACH(nmp, &nfs4_cb_mounts, nm_cblink) {
2383 if (nmp->nm_cbid != cbid)
2386 if (!nmp->nm_saddr)
2388 if (nfs_sockaddr_cmp((struct sockaddr*)&ncbsp->ncbs_saddr, nmp->nm_saddr) == 0)
2392 if (nmp)
2393 nmp->nm_cbrefs++;
2395 if (!nmp) {
2421 error = nfs_nget(nmp->nm_mountp, NULL, NULL, fh.fh_data, fh.fh_len, NULL, NULL, RPCAUTH_UNKNOWN, NG_NOCREATE, &np);
2482 error = nfs_nget(nmp->nm_mountp, NULL, NULL, fh.fh_data, fh.fh_len, NULL, NULL, RPCAUTH_UNKNOWN, NG_NOCREATE, &np);
2534 nmp->nm_cbrefs--;
2535 if (!nmp->nm_cbid)
2536 wakeup(&nmp->nm_cbrefs);
2772 struct nfsmount *nmp;
2800 nmp = req->r_nmp;
2801 sotype = nmp->nm_sotype;
2807 if (((req->r_flags & R_SETUP) && !(nmp->nm_sockflags & NMSOCK_SETUP)) ||
2808 ((req->r_flags & R_RECOVER) && !(nmp->nm_sockflags & NMSOCK_READY))) {
2820 lck_mtx_lock(&nmp->nm_lock);
2821 if (!(nmp->nm_sockflags & NMSOCK_READY) &&
2822 !((nmp->nm_sockflags & NMSOCK_SETUP) && (req->r_flags & R_SETUP))) {
2823 if (NMFLAG(nmp, INTR) && !(req->r_flags & R_NOINTR))
2825 lck_mtx_unlock(&nmp->nm_lock);
2840 lck_mtx_lock(&nmp->nm_lock);
2841 while (!(nmp->nm_sockflags & NMSOCK_READY)) {
2843 if (nmp->nm_state & NFSSTA_FORCE) {
2847 if (NMFLAG(nmp, SOFT) && (nmp->nm_reconnect_start > 0)) {
2850 if ((now.tv_sec - nmp->nm_reconnect_start) >= 8) {
2859 nfs_mount_sock_thread_wake(nmp);
2862 msleep(req, &nmp->nm_lock, slpflag|PSOCK, "nfsconnectwait", &ts);
2865 lck_mtx_unlock(&nmp->nm_lock);
2875 nso = nmp->nm_nso;
2877 nmp->nm_state |= NFSSTA_SENDING; /* will be cleared by nfs_sndunlock() */
2878 lck_mtx_unlock(&nmp->nm_lock);
2893 lck_mtx_lock(&nmp->nm_lock);
2894 if (!(req->r_flags & R_CWND) && (nmp->nm_sent >= nmp->nm_cwnd)) {
2896 slpflag = (NMFLAG(nmp, INTR) && req->r_thread) ? PCATCH : 0;
2897 lck_mtx_unlock(&nmp->nm_lock);
2906 lck_mtx_lock(&nmp->nm_lock);
2907 while (nmp->nm_sent >= nmp->nm_cwnd) {
2910 TAILQ_INSERT_TAIL(&nmp->nm_cwndq, req, r_cchain);
2911 msleep(req, &nmp->nm_lock, slpflag | (PZERO - 1), "nfswaitcwnd", &ts);
2914 TAILQ_REMOVE(&nmp->nm_cwndq, req, r_cchain);
2918 lck_mtx_unlock(&nmp->nm_lock);
2928 nmp->nm_sent += NFS_CWNDSCALE;
2935 nmp->nm_cwnd >>= 1;
2936 if (nmp->nm_cwnd < NFS_CWNDSCALE)
2937 nmp->nm_cwnd = NFS_CWNDSCALE;
2939 lck_mtx_unlock(&nmp->nm_lock);
2960 if ((sotype != SOCK_STREAM) && !sock_isconnected(nso->nso_so) && ((sendnam = nmp->nm_saddr))) {
3014 (error != EWOULDBLOCK) && (error != EIO) && (nso == nmp->nm_nso)) {
3046 if (needrecon && (nso == nmp->nm_nso)) { /* mark socket as needing reconnect */
3048 nfs_need_reconnect(nmp);
3066 if (nfs_is_dead(error, nmp))
3098 struct nfsmount *nmp = arg;
3099 struct nfs_socket *nso = nmp->nm_nso;
3104 if (nmp->nm_sockflags & NMSOCK_CONNECTING)
3116 nfs_request_match_reply(nmp, m);
3122 nfs_need_reconnect(nmp);
3130 struct nfsmount *nmp = arg;
3131 struct nfs_socket *nso = nmp->nm_nso;
3137 if (nmp->nm_sockflags & NMSOCK_CONNECTING)
3141 lck_mtx_lock(&nmp->nm_lock);
3142 nso = nmp->nm_nso;
3143 if (!nso || (nso->nso_so != so) || (nmp->nm_sockflags & (NMSOCK_DISCONNECTING))) {
3144 lck_mtx_unlock(&nmp->nm_lock);
3147 lck_mtx_unlock(&nmp->nm_lock);
3163 nfs_request_match_reply(nmp, m);
3166 lck_mtx_lock(&nmp->nm_lock);
3167 if (nmp->nm_nso == nso) {
3169 lck_mtx_unlock(&nmp->nm_lock);
3174 if (nmp->nm_sockflags & NMSOCK_DISCONNECTING)
3175 wakeup(&nmp->nm_sockflags);
3177 lck_mtx_unlock(&nmp->nm_lock);
3187 nfs_need_reconnect(nmp);
3195 nfs_sock_poke(struct nfsmount *nmp)
3203 lck_mtx_lock(&nmp->nm_lock);
3204 if ((nmp->nm_sockflags & NMSOCK_UNMOUNT) ||
3205 !(nmp->nm_sockflags & NMSOCK_READY) || !nmp->nm_nso || !nmp->nm_nso->nso_so) {
3206 lck_mtx_unlock(&nmp->nm_lock);
3209 lck_mtx_unlock(&nmp->nm_lock);
3216 error = sock_send(nmp->nm_nso->nso_so, &msg, MSG_DONTWAIT, &len);
3218 nfs_is_dead(error, nmp);
3225 nfs_request_match_reply(struct nfsmount *nmp, mbuf_t mrep)
3258 lck_mtx_lock(&nmp->nm_lock);
3259 if (nmp->nm_sotype == SOCK_DGRAM) {
3264 FSDBG(530, R_XID32(req->r_xid), req, nmp->nm_sent, nmp->nm_cwnd);
3265 if (nmp->nm_cwnd <= nmp->nm_sent) {
3266 nmp->nm_cwnd +=
3268 (nmp->nm_cwnd >> 1)) / nmp->nm_cwnd;
3269 if (nmp->nm_cwnd > NFS_MAXCWND)
3270 nmp->nm_cwnd = NFS_MAXCWND;
3273 nmp->nm_sent -= NFS_CWNDSCALE;
3276 if ((nmp->nm_sent < nmp->nm_cwnd) && !TAILQ_EMPTY(&nmp->nm_cwndq)) {
3278 struct nfsreq *req2 = TAILQ_FIRST(&nmp->nm_cwndq);
3279 TAILQ_REMOVE(&nmp->nm_cwndq, req2, r_cchain);
3307 nmp->nm_timeouts = 0;
3308 lck_mtx_unlock(&nmp->nm_lock);
3425 struct nfsmount *nmp;
3443 nmp = VFSTONFS(np ? NFSTOMP(np) : mp);
3444 if (!nmp) {
3449 lck_mtx_lock(&nmp->nm_lock);
3450 if ((nmp->nm_state & (NFSSTA_FORCE|NFSSTA_TIMEO)) ==
3452 lck_mtx_unlock(&nmp->nm_lock);
3460 if ((nmp->nm_vers != NFS_VER4) && (procnum >= 0) && (procnum < NFS_NPROCS))
3462 if ((nmp->nm_vers == NFS_VER4) && (procnum != NFSPROC4_COMPOUND) && (procnum != NFSPROC4_NULL))
3466 req->r_nmp = nmp;
3490 req->r_auth = nmp->nm_auth;
3492 lck_mtx_unlock(&nmp->nm_lock);
3511 struct nfsmount *nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
3524 if (nmp && (req->r_achain.tqe_next != NFSREQNOLIST)) {
3525 TAILQ_REMOVE(&nmp->nm_iodq, req, r_achain);
3531 if (nmp) {
3532 lck_mtx_lock(&nmp->nm_lock);
3536 nmp->nm_sent -= NFS_CWNDSCALE;
3537 if ((nmp->nm_sent < nmp->nm_cwnd) && !TAILQ_EMPTY(&nmp->nm_cwndq)) {
3539 struct nfsreq *req2 = TAILQ_FIRST(&nmp->nm_cwndq);
3540 TAILQ_REMOVE(&nmp->nm_cwndq, req2, r_cchain);
3546 TAILQ_REMOVE(&nmp->nm_resendq, req, r_rchain);
3552 TAILQ_REMOVE(&nmp->nm_cwndq, req, r_cchain);
3557 nmp->nm_jbreqs--;
3558 clearjbtimeo = (nmp->nm_jbreqs == 0) ? NFSSTA_JUKEBOXTIMEO : 0;
3560 lck_mtx_unlock(&nmp->nm_lock);
3566 nfs_up(nmp, req->r_thread, clearjbtimeo, NULL);
3623 struct nfsmount *nmp;
3634 nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
3635 if (!nmp)
3643 nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
3644 if (!nmp)
3646 lck_mtx_lock(&nmp->nm_lock);
3647 if (NMFLAG(nmp, SOFT))
3648 req->r_retry = nmp->nm_retry;
3651 lck_mtx_unlock(&nmp->nm_lock);
3663 struct nfsmount *nmp;
3672 nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
3673 if (!nmp) {
3682 ((nmp->nm_tprintf_delay) - (nmp->nm_tprintf_initial_delay));
3725 struct nfsmount *nmp;
3746 nmp = req->r_np ? NFSTONMP(req->r_np) : req->r_nmp;
3748 if ((req->r_flags & R_CWND) && nmp) {
3753 lck_mtx_lock(&nmp->nm_lock);
3754 FSDBG(273, R_XID32(req->r_xid), req, nmp->nm_sent, nmp->nm_cwnd);
3755 nmp->nm_sent -= NFS_CWNDSCALE;
3756 if ((nmp->nm_sent < nmp->nm_cwnd) && !TAILQ_EMPTY(&nmp->nm_cwndq)) {
3758 struct nfsreq *req2 = TAILQ_FIRST(&nmp->nm_cwndq);
3759 TAILQ_REMOVE(&nmp->nm_cwndq, req2, r_cchain);
3763 lck_mtx_unlock(&nmp->nm_lock);
3801 (nmp && NMFLAG(nmp, SOFT) &&
3802 ((nmp->nm_state & (NFSSTA_TIMEO|NFSSTA_FORCE)) == NFSSTA_TIMEO)))
3803 nfs_up(nmp, req->r_thread, NFSSTA_TIMEO, "is alive again");
3805 nfs_up(nmp, req->r_thread, NFSSTA_TIMEO, NULL);
3807 if (!error && !nmp)
3891 if ((nmp->nm_vers != NFS_VER2) && (*status == NFSERR_TRYLATER)) {
3895 int delay, slpflag = (NMFLAG(nmp, INTR) && !(req->r_flags & R_NOINTR)) ? PCATCH : 0;
3899 if ((req->r_delay >= 30) && !(nmp->nm_state & NFSSTA_MOUNTED)) {
3910 if (nmp->nm_tprintf_initial_delay && (req->r_delay >= nmp->nm_tprintf_initial_delay)) {
3913 lck_mtx_lock(&nmp->nm_lock);
3914 nmp->nm_jbreqs++;
3915 lck_mtx_unlock(&nmp->nm_lock);
3920 if (NMFLAG(nmp, SOFT) && (req->r_delay == 30) && !(req->r_flags & R_NOINTR)) {
3943 FSDBG(273, R_XID32(req->r_xid), nmp, req, NFSERR_TRYLATER);
3949 lck_mtx_lock(&nmp->nm_lock);
3950 nmp->nm_jbreqs--;
3951 clearjbtimeo = (nmp->nm_jbreqs == 0) ? NFSSTA_JUKEBOXTIMEO : 0;
3952 lck_mtx_unlock(&nmp->nm_lock);
3953 nfs_up(nmp, req->r_thread, clearjbtimeo, "resource available again");
3956 if ((nmp->nm_vers >= NFS_VER4) && (*status == NFSERR_WRONGSEC)) {
3969 nfs4_secinfo_rpc(nmp, &req->r_secinfo, req->r_cred, srvflavors, &srvcount);
3979 if (nmp->nm_sec.count) { /* use the mount's preferred list of flavors */
3980 for(; i < nmp->nm_sec.count; i++)
3981 req->r_wrongsec[i] = nmp->nm_sec.flavors[i];
4034 FSDBG(273, R_XID32(req->r_xid), nmp, req, NFSERR_WRONGSEC);
4037 if ((nmp->nm_vers >= NFS_VER4) && req->r_wrongsec) {
4066 if (nmp->nm_vers == NFS_VER2)
4093 lck_mtx_lock(&nmp->nm_lock);
4094 nmp->nm_jbreqs--;
4095 clearjbtimeo = (nmp->nm_jbreqs == 0) ? NFSSTA_JUKEBOXTIMEO : 0;
4096 lck_mtx_unlock(&nmp->nm_lock);
4098 nfs_up(nmp, req->r_thread, clearjbtimeo, NULL);
4100 FSDBG(273, R_XID32(req->r_xid), nmp, req,
4254 struct nfsmount *nmp;
4280 if ((req->r_flags & R_RESENDQ) && ((nmp = req->r_nmp))) {
4281 lck_mtx_lock(&nmp->nm_lock);
4282 if ((nmp->nm_state & NFSSTA_RECOVER) && (req->r_rchain.tqe_next != NFSREQNOLIST)) {
4288 TAILQ_REMOVE(&nmp->nm_resendq, req, r_rchain);
4292 lck_mtx_unlock(&nmp->nm_lock);
4301 lck_mtx_unlock(&nmp->nm_lock);
4331 struct nfsmount *nmp;
4338 if ((nmp = req->r_nmp)) {
4339 lck_mtx_lock(&nmp->nm_lock);
4340 if ((nmp->nm_state & NFSSTA_RECOVER) && (req->r_rchain.tqe_next != NFSREQNOLIST)) {
4346 TAILQ_REMOVE(&nmp->nm_resendq, req, r_rchain);
4350 lck_mtx_unlock(&nmp->nm_lock);
4353 lck_mtx_unlock(&nmp->nm_lock);
4410 struct nfsmount *nmp = req->r_nmp;
4413 if (!(req->r_flags & R_CWND) || !nmp)
4417 lck_mtx_lock(&nmp->nm_lock);
4418 FSDBG(532, R_XID32(req->r_xid), req, nmp->nm_sent, nmp->nm_cwnd);
4419 nmp->nm_sent -= NFS_CWNDSCALE;
4420 if ((nmp->nm_sent < nmp->nm_cwnd) && !TAILQ_EMPTY(&nmp->nm_cwndq)) {
4422 struct nfsreq *req2 = TAILQ_FIRST(&nmp->nm_cwndq);
4423 TAILQ_REMOVE(&nmp->nm_cwndq, req2, r_cchain);
4427 lck_mtx_unlock(&nmp->nm_lock);
4500 struct nfsmount *nmp;
4518 nmp = req->r_nmp;
4519 if (!nmp) /* unmounted */
4523 if ((error = nfs_sigintr(nmp, req, req->r_thread, 0))) {
4539 if (nmp->nm_tprintf_initial_delay &&
4541 ((req->r_lastmsg + nmp->nm_tprintf_delay) < now.tv_sec)) {
4546 lck_mtx_lock(&nmp->nm_lock);
4547 if (!(nmp->nm_state & NFSSTA_MOUNTED)) {
4548 lck_mtx_unlock(&nmp->nm_lock);
4560 lck_mtx_unlock(&nmp->nm_lock);
4567 if (!NMFLAG(nmp, SOFT) && !nfs_can_squish(nmp))
4570 ((nmp->nm_reconnect_start <= 0) || ((now.tv_sec - nmp->nm_reconnect_start) < 8)))
4571 maxtime = (NFS_MAXTIMEO / (nmp->nm_timeouts+1))/2;
4580 lck_mtx_lock(&nmp->nm_lock);
4587 else if (NMFLAG(nmp, DUMBTIMER))
4588 timeo = nmp->nm_timeo;
4590 timeo = NFS_RTO(nmp, proct[req->r_procnum]);
4595 if (nmp->nm_timeouts > 0)
4596 timeo *= nfs_backoff[nmp->nm_timeouts - 1];
4602 lck_mtx_unlock(&nmp->nm_lock);
4609 req->r_xid, req->r_rtt, timeo, nmp->nm_timeouts,
4611 if (nmp->nm_timeouts < 8)
4612 nmp->nm_timeouts++;
4613 nfs_mount_check_dead_timeout(nmp);
4615 if ((nmp->nm_sotype == SOCK_STREAM) &&
4617 !(nmp->nm_sockflags & (NMSOCK_POKE|NMSOCK_UNMOUNT)) &&
4618 (nmp->nm_sockflags & NMSOCK_READY)) {
4619 nmp->nm_sockflags |= NMSOCK_POKE;
4620 TAILQ_INSERT_TAIL(&nfs_mount_poke_queue, nmp, nm_pokeq);
4622 lck_mtx_unlock(&nmp->nm_lock);
4626 if ((NMFLAG(nmp, SOFT) || (req->r_flags & (R_SETUP|R_RECOVER))) &&
4630 lck_mtx_lock(&nmp->nm_lock);
4631 if (!(nmp->nm_state & NFSSTA_TIMEO)) {
4632 lck_mtx_unlock(&nmp->nm_lock);
4640 lck_mtx_unlock(&nmp->nm_lock);
4660 if ((nmp->nm_sotype == SOCK_STREAM) && !(req->r_flags & R_MUSTRESEND)) {
4689 while ((nmp = TAILQ_FIRST(&nfs_mount_poke_queue))) {
4690 TAILQ_REMOVE(&nfs_mount_poke_queue, nmp, nm_pokeq);
4691 nfs_sock_poke(nmp);
4692 lck_mtx_lock(&nmp->nm_lock);
4693 nmp->nm_sockflags &= ~NMSOCK_POKE;
4694 wakeup(&nmp->nm_sockflags);
4695 lck_mtx_unlock(&nmp->nm_lock);
4721 nfs_sigintr(struct nfsmount *nmp, struct nfsreq *req, thread_t thd, int nmplocked)
4726 if (nmp == NULL)
4735 lck_mtx_lock(&nmp->nm_lock);
4736 if (nmp->nm_state & NFSSTA_FORCE) {
4739 } else if (nmp->nm_mountp->mnt_kern_flag & MNTK_FRCUNMOUNT) {
4741 NFS_BITMAP_SET(nmp->nm_flags, NFS_MFLAG_SOFT);
4742 nmp->nm_state |= NFSSTA_FORCE;
4746 if (!error && (nmp->nm_state & NFSSTA_DEAD))
4753 if (!error && (nmp->nm_state & NFSSTA_TIMEO) && nfs_noremotehang(thd))
4757 lck_mtx_unlock(&nmp->nm_lock);
4778 if (NMFLAG(nmp, INTR) && ((p = get_bsdthreadtask_info(thd))) &&
4793 struct nfsmount *nmp = req->r_nmp;
4798 if (nmp == NULL)
4801 lck_mtx_lock(&nmp->nm_lock);
4802 statep = &nmp->nm_state;
4804 if (NMFLAG(nmp, INTR) && req->r_thread && !(req->r_flags & R_NOINTR))
4807 if ((error = nfs_sigintr(nmp, req, req->r_thread, 1)))
4812 msleep(statep, &nmp->nm_lock, slpflag | (PZERO - 1), "nfsndlck", &ts);
4820 lck_mtx_unlock(&nmp->nm_lock);
4830 struct nfsmount *nmp = req->r_nmp;
4833 if (nmp == NULL)
4835 lck_mtx_lock(&nmp->nm_lock);
4836 statep = &nmp->nm_state;
4844 lck_mtx_unlock(&nmp->nm_lock);
4851 struct nfsmount *nmp,
4933 if ((error = nfs_sigintr(nmp, NULL, !try ? NULL : thd, 0)))
5023 struct nfsmount *nmp,
5082 error = nfsm_rpchead2(nmp, (ipproto == IPPROTO_UDP) ? SOCK_DGRAM : SOCK_STREAM,
5087 error = nfs_aux_request(nmp, thd, saddr, so, (ipproto == IPPROTO_UDP) ? SOCK_DGRAM : SOCK_STREAM,
5174 nfs_can_squish(struct nfsmount *nmp)
5176 uint64_t flags = vfs_flags(nmp->nm_mountp);
5177 int softsquish = ((nfs_squishy_flags & NFS_SQUISH_SOFT) & NMFLAG(nmp, SOFT));
5220 nfs_is_squishy(struct nfsmount *nmp)
5222 mount_t mp = nmp->nm_mountp;
5227 vfs_statfs(mp)->f_mntfromname, nmp->nm_curdeadtimeout, nfs_is_mobile));
5229 if (!nfs_can_squish(nmp))
5232 timeo = (nmp->nm_deadtimeout > timeo) ? max(nmp->nm_deadtimeout/8, timeo) : timeo;
5233 NFS_SOCK_DBG(("nfs_is_squishy: nm_writers = %d nm_mappers = %d timeo = %d\n", nmp->nm_writers, nmp->nm_mappers, timeo));
5235 if (nmp->nm_writers == 0 && nmp->nm_mappers == 0) {
5244 if (!(flags & MNT_RDONLY) && !(nmp->nm_state & NFSSTA_SQUISHY))
5250 nmp->nm_state |= NFSSTA_SQUISHY;
5252 nmp->nm_state &= ~NFSSTA_SQUISHY;
5254 nmp->nm_curdeadtimeout = squishy ? timeo : nmp->nm_deadtimeout;
5256 NFS_SOCK_DBG(("nfs_is_squishy: nm_curdeadtimeout = %d\n", nmp->nm_curdeadtimeout));
5267 nfs_is_dead_lock(int error, struct nfsmount *nmp)
5269 if (nmp->nm_state & NFSSTA_DEAD)
5273 !(nmp->nm_locations.nl_numlocs == 1 && nmp->nm_locations.nl_locations[0]->nl_servcount == 1))
5275 if ((nfs_squishy_flags & NFS_SQUISH_QUICK) && nfs_is_squishy(nmp)) {
5276 printf("nfs_is_dead: nfs server %s: unreachable. Squished dead\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname);
5277 nmp->nm_state |= NFSSTA_DEAD;
5278 vfs_event_signal(&vfs_statfs(nmp->nm_mountp)->f_fsid, VQ_DEAD, 0);
5285 nfs_is_dead(int error, struct nfsmount *nmp)
5289 lck_mtx_lock(&nmp->nm_lock);
5290 is_dead = nfs_is_dead_lock(error, nmp);
5291 lck_mtx_unlock(&nmp->nm_lock);
5297 nfs_down(struct nfsmount *nmp, thread_t thd, int error, int flags, const char *msg)
5303 if (nmp == NULL)
5306 lck_mtx_lock(&nmp->nm_lock);
5309 if (NMFLAG(nmp, MUTEJUKEBOX)) /* jukebox timeouts don't count as unresponsive if muted */
5311 wasunresponsive = (nmp->nm_state & timeoutmask);
5314 softnobrowse = (NMFLAG(nmp, SOFT) && (vfs_flags(nmp->nm_mountp) & MNT_DONTBROWSE));
5316 if ((flags & NFSSTA_TIMEO) && !(nmp->nm_state & NFSSTA_TIMEO))
5317 nmp->nm_state |= NFSSTA_TIMEO;
5318 if ((flags & NFSSTA_LOCKTIMEO) && !(nmp->nm_state & NFSSTA_LOCKTIMEO))
5319 nmp->nm_state |= NFSSTA_LOCKTIMEO;
5320 if ((flags & NFSSTA_JUKEBOXTIMEO) && !(nmp->nm_state & NFSSTA_JUKEBOXTIMEO))
5321 nmp->nm_state |= NFSSTA_JUKEBOXTIMEO;
5323 unresponsive = (nmp->nm_state & timeoutmask);
5325 nfs_is_squishy(nmp);
5327 if (unresponsive && (nmp->nm_curdeadtimeout > 0)) {
5330 nmp->nm_deadto_start = now.tv_sec;
5331 nfs_mount_sock_thread_wake(nmp);
5332 } else if ((now.tv_sec - nmp->nm_deadto_start) > nmp->nm_curdeadtimeout) {
5333 if (!(nmp->nm_state & NFSSTA_DEAD))
5334 printf("nfs server %s: %sdead\n", vfs_statfs(nmp->nm_mountp)->f_mntfromname,
5335 (nmp->nm_curdeadtimeout != nmp->nm_deadtimeout) ? "squished " : "");
5336 nmp->nm_state |= NFSSTA_DEAD;
5339 lck_mtx_unlock(&nmp->nm_lock);
5341 if (nmp->nm_state & NFSSTA_DEAD)
5348 vfs_event_signal(&vfs_statfs(nmp->nm_mountp)->f_fsid, do_vfs_signal, 0);
5350 nfs_msg(thd, vfs_statfs(nmp->nm_mountp)->f_mntfromname, msg, error);
5354 nfs_up(struct nfsmount *nmp, thread_t thd, int flags, const char *msg)
5359 if (nmp == NULL)
5363 nfs_msg(thd, vfs_statfs(nmp->nm_mountp)->f_mntfromname, msg, 0);
5365 lck_mtx_lock(&nmp->nm_lock);
5368 if (NMFLAG(nmp, MUTEJUKEBOX)) /* jukebox timeouts don't count as unresponsive if muted */
5370 wasunresponsive = (nmp->nm_state & timeoutmask);
5373 softnobrowse = (NMFLAG(nmp, SOFT) && (vfs_flags(nmp->nm_mountp) & MNT_DONTBROWSE));
5375 if ((flags & NFSSTA_TIMEO) && (nmp->nm_state & NFSSTA_TIMEO))
5376 nmp->nm_state &= ~NFSSTA_TIMEO;
5377 if ((flags & NFSSTA_LOCKTIMEO) && (nmp->nm_state & NFSSTA_LOCKTIMEO))
5378 nmp->nm_state &= ~NFSSTA_LOCKTIMEO;
5379 if ((flags & NFSSTA_JUKEBOXTIMEO) && (nmp->nm_state & NFSSTA_JUKEBOXTIMEO))
5380 nmp->nm_state &= ~NFSSTA_JUKEBOXTIMEO;
5382 unresponsive = (nmp->nm_state & timeoutmask);
5384 nmp->nm_deadto_start = 0;
5385 nmp->nm_curdeadtimeout = nmp->nm_deadtimeout;
5386 nmp->nm_state &= ~NFSSTA_SQUISHY;
5387 lck_mtx_unlock(&nmp->nm_lock);
5394 vfs_event_signal(&vfs_statfs(nmp->nm_mountp)->f_fsid, VQ_NOTRESP, 1);