Print this page
4953763 Need way to configure NFS window sizes without changing system wide defaults
6216670 NFS server needs a bigger transmit buffer

*** 126,135 **** --- 126,148 ---- * Set the default for server delegation enablement and set per * /etc/default/nfs configuration (if present). */ 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[]) { char *dir = "/"; int allflag = 0;
*** 137,147 **** int opt_cnt = 0; int maxservers = 1; /* zero allows inifinte number of threads */ int maxservers_set = 0; int logmaxservers = 0; int pid; ! int i; char *provider = (char *)NULL; char *df_provider = (char *)NULL; struct protob *protobp0, *protobp; NETSELDECL(proto) = NULL; NETSELDECL(df_proto) = NULL; --- 150,160 ---- int opt_cnt = 0; int maxservers = 1; /* zero allows inifinte number of threads */ int maxservers_set = 0; int logmaxservers = 0; int pid; ! int i, bufsz; char *provider = (char *)NULL; char *df_provider = (char *)NULL; struct protob *protobp0, *protobp; NETSELDECL(proto) = NULL; NETSELDECL(df_proto) = NULL;
*** 233,242 **** --- 246,267 ---- if ((defval = defread("NFS_SERVER_DELEGATION=")) != NULL) { if (strcmp(defval, "off") == 0) { 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); }
*** 532,542 **** NFS_ACL_V3 : nfs_server_vers_max; protobp->program = NFS_ACL_PROGRAM; protobp->next = (struct protob *)NULL; if (allflag) { ! if (do_all(protobp0, nfssvc, 0) == -1) { fprintf(stderr, "setnetconfig failed : %s", strerror(errno)); exit(1); } } else if (proto) { --- 557,568 ---- NFS_ACL_V3 : nfs_server_vers_max; protobp->program = NFS_ACL_PROGRAM; protobp->next = (struct protob *)NULL; if (allflag) { ! if (do_all_setbuf(protobp0, nfssvc, 0, nfs_server_sndbufsz, ! nfs_server_rcvbufsz) == -1) { fprintf(stderr, "setnetconfig failed : %s", strerror(errno)); exit(1); } } else if (proto) {
*** 550,576 **** goto done; } while (nconf = getnetconfig(nc)) { if (strcmp(nconf->nc_proto, proto) == 0) { protoFound = TRUE; ! do_one(nconf->nc_device, NULL, ! protobp0, nfssvc, 0); } } (void) endnetconfig(nc); if (protoFound == FALSE) { fprintf(stderr, "couldn't find netconfig entry for protocol %s", proto); } } else if (provider) ! do_one(provider, proto, protobp0, nfssvc, 0); else { for (providerp = defaultproviders; *providerp != NULL; providerp++) { provider = *providerp; ! do_one(provider, NULL, protobp0, nfssvc, 0); } } done: free(protobp); --- 576,605 ---- goto done; } while (nconf = getnetconfig(nc)) { if (strcmp(nconf->nc_proto, proto) == 0) { protoFound = TRUE; ! do_one_setbuf(nconf->nc_device, NULL, ! protobp0, nfssvc, 0, ! nfs_server_sndbufsz, nfs_server_rcvbufsz); } } (void) endnetconfig(nc); if (protoFound == FALSE) { fprintf(stderr, "couldn't find netconfig entry for protocol %s", proto); } } else if (provider) ! 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_setbuf(provider, NULL, protobp0, nfssvc, 0, ! nfs_server_sndbufsz, nfs_server_rcvbufsz); } } done: free(protobp);