--- old/usr/src/cmd/fs.d/nfs/nfsd/nfsd.c Wed Jun 17 00:15:44 2009 +++ new/usr/src/cmd/fs.d/nfs/nfsd/nfsd.c Wed Jun 17 00:15:43 2009 @@ -128,6 +128,19 @@ */ int nfs_server_delegation = NFS_SERVER_DELEGATION_DEFAULT; +/* + * Default values for TCP send and receive buffer size of NFS server + * connections. + * + * These values can be tuned by user via /etc/default/nfs configuration + * file by setting NFS_SERVER_SNDBUFSZ and NFS_SERVER_RCVBUFSZ. + * + * To force NFS connections to use system-wide default for TCP send and + * receive buffer, set NFS_SERVER_SNDBUFSZ and NFS_SERVER_RCVBUFSZ to 0. + */ +int nfs_server_sndbufsz = 1048576; +int nfs_server_rcvbufsz = 1048576; + int main(int ac, char *av[]) { @@ -139,7 +152,7 @@ int maxservers_set = 0; int logmaxservers = 0; int pid; - int i; + int i, bufsz; char *provider = (char *)NULL; char *df_provider = (char *)NULL; struct protob *protobp0, *protobp; @@ -235,6 +248,18 @@ nfs_server_delegation = FALSE; } } + if ((defval = defread("NFS_SERVER_SNDBUFSZ=")) != NULL) { + errno = 0; + bufsz = strtol(defval, (char **)NULL, 10); + if (errno == 0) + nfs_server_sndbufsz = bufsz; + } + if ((defval = defread("NFS_SERVER_RCVBUFSZ=")) != NULL) { + errno = 0; + bufsz = strtol(defval, (char **)NULL, 10); + if (errno == 0) + nfs_server_rcvbufsz = bufsz; + } /* close defaults file */ defopen(NULL); @@ -534,7 +559,8 @@ protobp->next = (struct protob *)NULL; if (allflag) { - if (do_all(protobp0, nfssvc, 0) == -1) { + if (do_all_setbuf(protobp0, nfssvc, 0, nfs_server_sndbufsz, + nfs_server_rcvbufsz) == -1) { fprintf(stderr, "setnetconfig failed : %s", strerror(errno)); exit(1); @@ -552,8 +578,9 @@ while (nconf = getnetconfig(nc)) { if (strcmp(nconf->nc_proto, proto) == 0) { protoFound = TRUE; - do_one(nconf->nc_device, NULL, - protobp0, nfssvc, 0); + do_one_setbuf(nconf->nc_device, NULL, + protobp0, nfssvc, 0, + nfs_server_sndbufsz, nfs_server_rcvbufsz); } } (void) endnetconfig(nc); @@ -563,12 +590,14 @@ proto); } } else if (provider) - do_one(provider, proto, protobp0, nfssvc, 0); + do_one_setbuf(provider, proto, protobp0, nfssvc, 0, + nfs_server_sndbufsz, nfs_server_rcvbufsz); else { for (providerp = defaultproviders; *providerp != NULL; providerp++) { provider = *providerp; - do_one(provider, NULL, protobp0, nfssvc, 0); + do_one_setbuf(provider, NULL, protobp0, nfssvc, 0, + nfs_server_sndbufsz, nfs_server_rcvbufsz); } } done: