diff --git a/sys/nfs4client/nfs4_vfsops.c b/sys/nfs4client/nfs4_vfsops.c index d4fc2d6accc2..0eb113bcfeaa 100644 --- a/sys/nfs4client/nfs4_vfsops.c +++ b/sys/nfs4client/nfs4_vfsops.c @@ -245,12 +245,18 @@ nfs_decode_args(struct nfsmount *nmp, struct nfs_args *argp) 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; diff --git a/sys/nfsclient/nfs.h b/sys/nfsclient/nfs.h index 9dc34a7a092b..a87966d560de 100644 --- a/sys/nfsclient/nfs.h +++ b/sys/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 */ diff --git a/sys/nfsclient/nfs_vfsops.c b/sys/nfsclient/nfs_vfsops.c index 17a009cb253a..858f405a4a2e 100644 --- a/sys/nfsclient/nfs_vfsops.c +++ b/sys/nfsclient/nfs_vfsops.c @@ -545,10 +545,15 @@ nfs_decode_args(struct mount *mp, struct nfsmount *nmp, struct nfs_args *argp) /* * 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)