PERFORCE change 97694 for review
Marcel Moolenaar
marcel at FreeBSD.org
Tue May 23 19:09:41 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=97694
Change 97694 by marcel at marcel_nfs on 2006/05/23 19:08:16
IFC @97693
Affected files ...
.. //depot/projects/uart/arm/sa11x0/assabet_machdep.c#7 integrate
.. //depot/projects/uart/arm/sa11x0/sa11x0_io.c#5 integrate
.. //depot/projects/uart/arm/sa11x0/sa11x0_reg.h#3 integrate
.. //depot/projects/uart/arm/sa11x0/uart_cpu_sa1110.c#3 integrate
.. //depot/projects/uart/dev/uart/uart_dev_ns8250.c#45 integrate
.. //depot/projects/uart/dev/ubsec/ubsec.c#11 integrate
.. //depot/projects/uart/nfs4client/nfs4_vfsops.c#9 integrate
.. //depot/projects/uart/nfsclient/nfs.h#7 integrate
.. //depot/projects/uart/nfsclient/nfs_node.c#12 integrate
.. //depot/projects/uart/nfsclient/nfs_socket.c#13 integrate
.. //depot/projects/uart/nfsclient/nfs_vfsops.c#14 integrate
.. //depot/projects/uart/nfsclient/nfsmount.h#6 integrate
Differences ...
==== //depot/projects/uart/arm/sa11x0/assabet_machdep.c#7 (text+ko) ====
@@ -47,7 +47,7 @@
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/sa11x0/assabet_machdep.c,v 1.11 2006/05/22 23:25:34 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/sa11x0/assabet_machdep.c,v 1.12 2006/05/23 12:14:14 cognet Exp $");
#include "opt_md.h"
@@ -156,6 +156,35 @@
void enable_mmu(vm_offset_t);
static struct trapframe proc0_tf;
+/* Static device mappings. */
+static const struct pmap_devmap assabet_devmap[] = {
+ /*
+ * Map the on-board devices VA == PA so that we can access them
+ * with the MMU on or off.
+ */
+ {
+ SACOM1_VBASE,
+ SACOM1_BASE,
+ SACOM1_SIZE,
+ VM_PROT_READ|VM_PROT_WRITE,
+ PTE_NOCACHE,
+ },
+ {
+ SAIPIC_BASE,
+ SAIPIC_BASE,
+ SAIPIC_SIZE,
+ VM_PROT_READ|VM_PROT_WRITE,
+ PTE_NOCACHE,
+ },
+ {
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ }
+};
+
struct arm32_dma_range *
bus_dma_get_range(void)
{
@@ -336,11 +365,8 @@
/* Map the vector page. */
pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa,
VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
- /* Map SACOM1. */
- pmap_map_entry(l1pagetable, SACOM1_VBASE, SACOM1_BASE,
- VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
- pmap_map_entry(l1pagetable, 0x90050000, 0x90050000,
- VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE);
+ /* Map the statically mapped devices. */
+ pmap_devmap_bootstrap(l1pagetable, assabet_devmap);
pmap_map_chunk(l1pagetable, sa1_cache_clean_addr, 0xf0000000,
CPU_SA110_CACHE_CLEAN_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
==== //depot/projects/uart/arm/sa11x0/sa11x0_io.c#5 (text+ko) ====
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/sa11x0/sa11x0_io.c,v 1.7 2006/05/18 22:03:47 cognet Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/sa11x0/sa11x0_io.c,v 1.8 2006/05/23 12:14:14 cognet Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/queue.h>
@@ -146,6 +146,13 @@
u_long startpa, endpa, pa;
vm_offset_t va;
pt_entry_t *pte;
+ const struct pmap_devmap *pd;
+
+ if ((pd = pmap_devmap_find_pa(bpa, size)) != NULL) {
+ /* Device was statically mapped. */
+ *bshp = pd->pd_va + (bpa - pd->pd_pa);
+ return 0;
+ }
startpa = trunc_page(bpa);
endpa = round_page(bpa + size);
==== //depot/projects/uart/arm/sa11x0/sa11x0_reg.h#3 (text+ko) ====
@@ -34,7 +34,7 @@
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
- * $FreeBSD: src/sys/arm/sa11x0/sa11x0_reg.h,v 1.2 2006/05/22 23:25:34 cognet Exp $
+ * $FreeBSD: src/sys/arm/sa11x0/sa11x0_reg.h,v 1.3 2006/05/23 12:14:14 cognet Exp $
*
*/
@@ -48,9 +48,11 @@
#define SARCR_BASE 0x90030000 /* Reset Controller */
#define SAGPIO_BASE 0x90040000 /* GPIO */
#define SAIPIC_BASE 0x90050000 /* Interrupt Controller */
+#define SAIPIC_SIZE 0x24
#define SAPPC_BASE 0x90060000 /* Peripheral Pin Controller */
#define SAUDC_BASE 0x80000000 /* USB Device Controller*/
#define SACOM1_BASE 0x80010000 /* GPCLK/UART 1 */
+#define SACOM1_SIZE 0x24
#define SACOM3_HW_BASE 0x80050000 /* UART 3 */
#define SAMCP_BASE 0x80060000 /* MCP Controller */
#define SASSP_BASE 0x80070000 /* Synchronous serial port */
==== //depot/projects/uart/arm/sa11x0/uart_cpu_sa1110.c#3 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/sa11x0/uart_cpu_sa1110.c,v 1.3 2005/01/05 21:58:48 imp Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/sa11x0/uart_cpu_sa1110.c,v 1.4 2006/05/23 12:14:14 cognet Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -36,6 +36,7 @@
#include <dev/uart/uart.h>
#include <dev/uart/uart_cpu.h>
+#include <arm/sa11x0/sa11x0_reg.h>
#include <arm/sa11x0/sa11x0_var.h>
bus_space_tag_t uart_bus_space_io;
@@ -57,7 +58,7 @@
di->ops = uart_sa1110_ops;
di->bas.chan = 0;
di->bas.bst = &sa11x0_bs_tag;
- di->bas.bsh = 0x80010000;
+ di->bas.bsh = SACOM1_BASE;
di->bas.regshft = 0;
di->bas.rclk = 0;
di->baudrate = 9600;
==== //depot/projects/uart/dev/uart/uart_dev_ns8250.c#45 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.22 2006/05/23 00:41:12 benno Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/uart/uart_dev_ns8250.c,v 1.23 2006/05/23 06:04:45 benno Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -232,7 +232,7 @@
static int
ns8250_probe(struct uart_bas *bas)
{
- u_char lcr, val;
+ u_char val;
/* Check known 0 bits that don't depend on DLAB. */
val = uart_getreg(bas, REG_IIR);
==== //depot/projects/uart/dev/ubsec/ubsec.c#11 (text+ko) ====
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/dev/ubsec/ubsec.c,v 1.36 2006/05/22 16:18:21 pjd Exp $");
+__FBSDID("$FreeBSD: src/sys/dev/ubsec/ubsec.c,v 1.37 2006/05/23 09:02:14 pjd Exp $");
/*
* uBsec 5[56]01, 58xx hardware crypto accelerator
@@ -1552,7 +1552,6 @@
}
if (q != NULL || err == ERESTART) {
mtx_lock(&sc->sc_freeqlock);
- SIMPLEQ_INSERT_TAIL(&sc->sc_freequeue, q, q_next);
if (q != NULL)
SIMPLEQ_INSERT_TAIL(&sc->sc_freequeue, q, q_next);
if (err == ERESTART)
==== //depot/projects/uart/nfs4client/nfs4_vfsops.c#9 (text+ko) ====
@@ -1,4 +1,4 @@
-/* $FreeBSD: src/sys/nfs4client/nfs4_vfsops.c,v 1.24 2006/05/19 00:04:23 mohans Exp $ */
+/* $FreeBSD: src/sys/nfs4client/nfs4_vfsops.c,v 1.25 2006/05/23 18:48:06 cel Exp $ */
/* $Id: nfs_vfsops.c,v 1.38 2003/11/05 14:59:01 rees Exp $ */
/*-
@@ -60,7 +60,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfs4client/nfs4_vfsops.c,v 1.24 2006/05/19 00:04:23 mohans Exp $");
+__FBSDID("$FreeBSD: src/sys/nfs4client/nfs4_vfsops.c,v 1.25 2006/05/23 18:48:06 cel Exp $");
#include "opt_bootp.h"
#include "opt_nfsroot.h"
@@ -245,12 +245,18 @@
int maxio;
s = splnet();
+
/*
* Silently clear NFSMNT_NOCONN if it's a TCP mount, it makes
- * no sense in that context.
+ * no sense in that context. Also, set appropriate retransmit
+ * and soft timeout behavior.
*/
- if (argp->sotype == SOCK_STREAM)
+ if (argp->sotype == SOCK_STREAM) {
nmp->nm_flag &= ~NFSMNT_NOCONN;
+ nmp->nm_flag |= NFSMNT_DUMBTIMR;
+ nmp->nm_timeo = NFS_MAXTIMEO;
+ nmp->nm_retry = NFS_RETRANS_TCP;
+ }
nmp->nm_flag &= ~NFSMNT_RDIRPLUS;
==== //depot/projects/uart/nfsclient/nfs.h#7 (text+ko) ====
@@ -30,7 +30,7 @@
* SUCH DAMAGE.
*
* @(#)nfs.h 8.4 (Berkeley) 5/1/95
- * $FreeBSD: src/sys/nfsclient/nfs.h,v 1.92 2006/05/19 00:04:23 mohans Exp $
+ * $FreeBSD: src/sys/nfsclient/nfs.h,v 1.94 2006/05/23 18:48:06 cel Exp $
*/
#ifndef _NFSCLIENT_NFS_H_
@@ -53,7 +53,8 @@
#define NFS_MAXTIMEO (60 * NFS_HZ) /* Max timeout to backoff to */
#define NFS_MINIDEMTIMEO (5 * NFS_HZ) /* Min timeout for non-idempotent ops*/
#define NFS_MAXREXMIT 100 /* Stop counting after this many */
-#define NFS_RETRANS 10 /* Num of retrans for soft mounts */
+#define NFS_RETRANS 10 /* Num of retrans for UDP soft mounts */
+#define NFS_RETRANS_TCP 2 /* Num of retrans for TCP soft mounts */
#define NFS_MAXGRPS 16 /* Max. size of groups list */
#ifndef NFS_MINATTRTIMO
#define NFS_MINATTRTIMO 3 /* VREG attrib cache timeout in sec */
@@ -257,6 +258,31 @@
#endif
+/*
+ * On fast networks, the estimator will try to reduce the
+ * timeout lower than the latency of the server's disks,
+ * which results in too many timeouts, so cap the lower
+ * bound.
+ */
+#define NFS_MINRTO (NFS_HZ >> 2)
+
+/*
+ * Keep the RTO from increasing to unreasonably large values
+ * when a server is not responding.
+ */
+#define NFS_MAXRTO (20 * NFS_HZ)
+
+enum nfs_rto_timer_t {
+ NFS_DEFAULT_TIMER,
+ NFS_GETATTR_TIMER,
+ NFS_LOOKUP_TIMER,
+ NFS_READ_TIMER,
+ NFS_WRITE_TIMER,
+};
+#define NFS_MAX_TIMER (NFS_WRITE_TIMER)
+
+#define NFS_INITRTT (NFS_HZ << 3)
+
vfs_init_t nfs_init;
vfs_uninit_t nfs_uninit;
int nfs_mountroot(struct mount *mp, struct thread *td);
==== //depot/projects/uart/nfsclient/nfs_node.c#12 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_node.c,v 1.80 2006/05/19 00:04:24 mohans Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_node.c,v 1.81 2006/05/23 16:07:23 mohans Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -148,6 +148,11 @@
vp->v_bufobj.bo_ops = &buf_ops_nfs;
vp->v_data = np;
np->n_vnode = vp;
+ /*
+ * NFS supports recursive and shared locking.
+ */
+ vp->v_vnlock->lk_flags |= LK_CANRECURSE;
+ vp->v_vnlock->lk_flags &= ~LK_NOSHARE;
error = vfs_hash_insert(vp, hash, LK_EXCLUSIVE,
td, &nvp, nfs_vncmpf, &ncmp);
if (error)
==== //depot/projects/uart/nfsclient/nfs_socket.c#13 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_socket.c,v 1.140 2006/05/19 00:04:24 mohans Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_socket.c,v 1.141 2006/05/23 18:33:58 cel Exp $");
/*
* Socket operations for use by nfs
@@ -79,38 +79,6 @@
extern u_int32_t nfs_xid;
-/*
- * Estimate rto for an nfs rpc sent via. an unreliable datagram.
- * Use the mean and mean deviation of rtt for the appropriate type of rpc
- * for the frequent rpcs and a default for the others.
- * The justification for doing "other" this way is that these rpcs
- * happen so infrequently that timer est. would probably be stale.
- * Also, since many of these rpcs are
- * non-idempotent, a conservative timeout is desired.
- * getattr, lookup - A+2D
- * read, write - A+4D
- * other - nm_timeo
- */
-#define NFS_RTO(n, t) \
- ((t) == 0 ? (n)->nm_timeo : \
- ((t) < 3 ? \
- (((((n)->nm_srtt[t-1] + 3) >> 2) + (n)->nm_sdrtt[t-1] + 1) >> 1) : \
- ((((n)->nm_srtt[t-1] + 7) >> 3) + (n)->nm_sdrtt[t-1] + 1)))
-#define NFS_SRTT(r) (r)->r_nmp->nm_srtt[proct[(r)->r_procnum] - 1]
-#define NFS_SDRTT(r) (r)->r_nmp->nm_sdrtt[proct[(r)->r_procnum] - 1]
-
-/*
- * Defines which timer to use for the procnum.
- * 0 - default
- * 1 - getattr
- * 2 - lookup
- * 3 - read
- * 4 - write
- */
-static int proct[NFS_NPROCS] = {
- 0, 1, 0, 2, 1, 3, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0,
-};
-
static int nfs_realign_test;
static int nfs_realign_count;
static int nfs_bufpackets = 4;
@@ -157,6 +125,132 @@
extern struct mtx nfs_reqq_mtx;
/*
+ * RTT estimator
+ */
+
+static enum nfs_rto_timer_t nfs_proct[NFS_NPROCS] = {
+ NFS_DEFAULT_TIMER, /* NULL */
+ NFS_GETATTR_TIMER, /* GETATTR */
+ NFS_DEFAULT_TIMER, /* SETATTR */
+ NFS_LOOKUP_TIMER, /* LOOKUP */
+ NFS_GETATTR_TIMER, /* ACCESS */
+ NFS_READ_TIMER, /* READLINK */
+ NFS_READ_TIMER, /* READ */
+ NFS_WRITE_TIMER, /* WRITE */
+ NFS_DEFAULT_TIMER, /* CREATE */
+ NFS_DEFAULT_TIMER, /* MKDIR */
+ NFS_DEFAULT_TIMER, /* SYMLINK */
+ NFS_DEFAULT_TIMER, /* MKNOD */
+ NFS_DEFAULT_TIMER, /* REMOVE */
+ NFS_DEFAULT_TIMER, /* RMDIR */
+ NFS_DEFAULT_TIMER, /* RENAME */
+ NFS_DEFAULT_TIMER, /* LINK */
+ NFS_READ_TIMER, /* READDIR */
+ NFS_READ_TIMER, /* READDIRPLUS */
+ NFS_DEFAULT_TIMER, /* FSSTAT */
+ NFS_DEFAULT_TIMER, /* FSINFO */
+ NFS_DEFAULT_TIMER, /* PATHCONF */
+ NFS_DEFAULT_TIMER, /* COMMIT */
+ NFS_DEFAULT_TIMER, /* NOOP */
+};
+
+/*
+ * Choose the correct RTT timer for this NFS procedure.
+ */
+static inline enum nfs_rto_timer_t
+nfs_rto_timer(u_int32_t procnum)
+{
+ return nfs_proct[procnum];
+}
+
+/*
+ * Initialize the RTT estimator state for a new mount point.
+ */
+static void
+nfs_init_rtt(struct nfsmount *nmp)
+{
+ int i;
+
+ for (i = 0; i < NFS_MAX_TIMER; i++)
+ nmp->nm_srtt[i] = NFS_INITRTT;
+ for (i = 0; i < NFS_MAX_TIMER; i++)
+ nmp->nm_sdrtt[i] = 0;
+}
+
+/*
+ * Update a mount point's RTT estimator state using data from the
+ * passed-in request.
+ *
+ * Use a gain of 0.125 on the mean and a gain of 0.25 on the deviation.
+ *
+ * NB: Since the timer resolution of NFS_HZ is so course, it can often
+ * result in r_rtt == 0. Since r_rtt == N means that the actual RTT is
+ * between N + dt and N + 2 - dt ticks, add 1 before calculating the
+ * update values.
+ */
+static void
+nfs_update_rtt(struct nfsreq *rep)
+{
+ int t1 = rep->r_rtt + 1;
+ int index = nfs_rto_timer(rep->r_procnum) - 1;
+ int *srtt = &rep->r_nmp->nm_srtt[index];
+ int *sdrtt = &rep->r_nmp->nm_sdrtt[index];
+
+ t1 -= *srtt >> 3;
+ *srtt += t1;
+ if (t1 < 0)
+ t1 = -t1;
+ t1 -= *sdrtt >> 2;
+ *sdrtt += t1;
+}
+
+/*
+ * Estimate RTO for an NFS RPC sent via an unreliable datagram.
+ *
+ * Use the mean and mean deviation of RTT for the appropriate type
+ * of RPC for the frequent RPCs and a default for the others.
+ * The justification for doing "other" this way is that these RPCs
+ * happen so infrequently that timer est. would probably be stale.
+ * Also, since many of these RPCs are non-idempotent, a conservative
+ * timeout is desired.
+ *
+ * getattr, lookup - A+2D
+ * read, write - A+4D
+ * other - nm_timeo
+ */
+static int
+nfs_estimate_rto(struct nfsmount *nmp, u_int32_t procnum)
+{
+ enum nfs_rto_timer_t timer = nfs_rto_timer(procnum);
+ int index = timer - 1;
+ int rto;
+
+ switch (timer) {
+ case NFS_GETATTR_TIMER:
+ case NFS_LOOKUP_TIMER:
+ rto = ((nmp->nm_srtt[index] + 3) >> 2) +
+ ((nmp->nm_sdrtt[index] + 1) >> 1);
+ break;
+ case NFS_READ_TIMER:
+ case NFS_WRITE_TIMER:
+ rto = ((nmp->nm_srtt[index] + 7) >> 3) +
+ (nmp->nm_sdrtt[index] + 1);
+ break;
+ default:
+ rto = nmp->nm_timeo;
+ return (rto);
+ }
+
+ if (rto < NFS_MINRTO)
+ rto = NFS_MINRTO;
+ else if (rto > NFS_MAXRTO)
+ rto = NFS_MAXRTO;
+
+ return (rto);
+}
+
+
+/*
* Initialize sockets and congestion for a new NFS connection.
* We do not free the sockaddr if error.
*/
@@ -357,10 +451,7 @@
mtx_lock(&nmp->nm_mtx);
/* Initialize other non-zero congestion variables */
- nmp->nm_srtt[0] = nmp->nm_srtt[1] = nmp->nm_srtt[2] =
- nmp->nm_srtt[3] = (NFS_TIMEO << 3);
- nmp->nm_sdrtt[0] = nmp->nm_sdrtt[1] = nmp->nm_sdrtt[2] =
- nmp->nm_sdrtt[3] = 0;
+ nfs_init_rtt(nmp);
nmp->nm_cwnd = NFS_MAXCWND / 2; /* Initial send window */
nmp->nm_sent = 0;
nmp->nm_timeouts = 0;
@@ -685,7 +776,6 @@
caddr_t dpos;
u_int32_t rxid, *tl;
struct nfsreq *rep;
- register int32_t t1;
int error;
/*
@@ -743,27 +833,8 @@
rep->r_flags &= ~R_SENT;
nmp->nm_sent -= NFS_CWNDSCALE;
}
- /*
- * Update rtt using a gain of 0.125 on the mean
- * and a gain of 0.25 on the deviation.
- */
- if (rep->r_flags & R_TIMING) {
- /*
- * Since the timer resolution of
- * NFS_HZ is so course, it can often
- * result in r_rtt == 0. Since
- * r_rtt == N means that the actual
- * rtt is between N+dt and N+2-dt ticks,
- * add 1.
- */
- t1 = rep->r_rtt + 1;
- t1 -= (NFS_SRTT(rep) >> 3);
- NFS_SRTT(rep) += t1;
- if (t1 < 0)
- t1 = -t1;
- t1 -= (NFS_SDRTT(rep) >> 2);
- NFS_SDRTT(rep) += t1;
- }
+ if (rep->r_flags & R_TIMING)
+ nfs_update_rtt(rep);
nmp->nm_timeouts = 0;
wakeup((caddr_t)rep);
mtx_unlock(&rep->r_mtx);
@@ -1073,7 +1144,7 @@
else
rep->r_retry = NFS_MAXREXMIT + 1; /* past clip limit */
rep->r_rtt = rep->r_rexmit = 0;
- if (proct[procnum] > 0)
+ if (nfs_rto_timer(procnum) != NFS_DEFAULT_TIMER)
rep->r_flags = R_TIMING;
else
rep->r_flags = 0;
@@ -1328,7 +1399,7 @@
if (nmp->nm_flag & NFSMNT_DUMBTIMR)
timeo = nmp->nm_timeo;
else
- timeo = NFS_RTO(nmp, proct[rep->r_procnum]);
+ timeo = nfs_estimate_rto(nmp, rep->r_procnum);
if (nmp->nm_timeouts > 0)
timeo *= nfs_backoff[nmp->nm_timeouts - 1];
if (rep->r_rtt <= timeo) {
==== //depot/projects/uart/nfsclient/nfs_vfsops.c#14 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_vfsops.c,v 1.181 2006/05/19 00:04:24 mohans Exp $");
+__FBSDID("$FreeBSD: src/sys/nfsclient/nfs_vfsops.c,v 1.182 2006/05/23 18:48:07 cel Exp $");
#include "opt_bootp.h"
@@ -545,10 +545,15 @@
/*
* Silently clear NFSMNT_NOCONN if it's a TCP mount, it makes
- * no sense in that context.
+ * no sense in that context. Also, set up appropriate retransmit
+ * and soft timeout behavior.
*/
- if (argp->sotype == SOCK_STREAM)
+ if (argp->sotype == SOCK_STREAM) {
nmp->nm_flag &= ~NFSMNT_NOCONN;
+ nmp->nm_flag |= NFSMNT_DUMBTIMR;
+ nmp->nm_timeo = NFS_MAXTIMEO;
+ nmp->nm_retry = NFS_RETRANS_TCP;
+ }
/* Also clear RDIRPLUS if not NFSv3, it crashes some servers */
if ((argp->flags & NFSMNT_NFSV3) == 0)
==== //depot/projects/uart/nfsclient/nfsmount.h#6 (text+ko) ====
@@ -30,7 +30,7 @@
* SUCH DAMAGE.
*
* @(#)nfsmount.h 8.3 (Berkeley) 3/30/95
- * $FreeBSD: src/sys/nfsclient/nfsmount.h,v 1.31 2006/05/19 00:04:24 mohans Exp $
+ * $FreeBSD: src/sys/nfsclient/nfsmount.h,v 1.32 2006/05/23 18:33:58 cel Exp $
*/
#ifndef _NFSCLIENT_NFSMOUNT_H_
@@ -64,8 +64,8 @@
struct sockaddr *nm_nam; /* Addr of server */
int nm_timeo; /* Init timer for NFSMNT_DUMBTIMR */
int nm_retry; /* Max retries */
- int nm_srtt[4]; /* Timers for rpcs */
- int nm_sdrtt[4];
+ int nm_srtt[NFS_MAX_TIMER], /* RTT Timers for rpcs */
+ nm_sdrtt[NFS_MAX_TIMER];
int nm_sent; /* Request send count */
int nm_cwnd; /* Request send window */
int nm_timeouts; /* Request timeouts */
More information about the p4-projects
mailing list