1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright (c) 1989, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * Rick Macklem at The University of Guelph.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the University nor the names of its contributors
19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35 #include <sys/param.h>
36 #include <sys/syslog.h>
37 #include <sys/wait.h>
38 #include <sys/linker.h>
39 #include <sys/mount.h>
40 #include <sys/sysctl.h>
41
42 #include <err.h>
43 #include <stdio.h>
44 #include <stdlib.h>
45 #include <unistd.h>
46
47 #define MAXNFSDCNT 20
48
49 static void
usage(void)50 usage(void)
51 {
52 (void)fprintf(stderr, "usage: nfsiod [-n num_servers]\n");
53 exit(1);
54 }
55
56 int
main(int argc,char * argv[])57 main(int argc, char *argv[])
58 {
59 int ch;
60 struct xvfsconf vfc;
61 int error;
62 unsigned int iodmin, iodmax, num_servers;
63 size_t len;
64
65 error = getvfsbyname("nfs", &vfc);
66 if (error) {
67 if (kldload("nfs") == -1)
68 err(1, "kldload(nfs)");
69 error = getvfsbyname("nfs", &vfc);
70 }
71 if (error)
72 errx(1, "NFS support is not available in the running kernel");
73
74 num_servers = 0;
75 while ((ch = getopt(argc, argv, "n:")) != -1)
76 switch (ch) {
77 case 'n':
78 num_servers = atoi(optarg);
79 if (num_servers < 1) {
80 warnx("nfsiod count %u; reset to %d",
81 num_servers, 1);
82 num_servers = 1;
83 }
84 if (num_servers > MAXNFSDCNT) {
85 warnx("nfsiod count %u; reset to %d",
86 num_servers, MAXNFSDCNT);
87 num_servers = MAXNFSDCNT;
88 }
89 break;
90 case '?':
91 default:
92 usage();
93 }
94 argc -= optind;
95 argv += optind;
96
97 if (argc > 0)
98 usage();
99
100 len = sizeof iodmin;
101 error = sysctlbyname("vfs.nfs.iodmin", &iodmin, &len, NULL, 0);
102 if (error < 0)
103 err(1, "sysctlbyname(\"vfs.nfs.iodmin\")");
104 len = sizeof iodmax;
105 error = sysctlbyname("vfs.nfs.iodmax", &iodmax, &len, NULL, 0);
106 if (error < 0)
107 err(1, "sysctlbyname(\"vfs.nfs.iodmax\")");
108 if (num_servers == 0) { /* no change */
109 printf("vfs.nfs.iodmin=%u\nvfs.nfs.iodmax=%u\n",
110 iodmin, iodmax);
111 exit(0);
112 }
113 /* Catch the case where we're lowering num_servers below iodmin */
114 if (iodmin > num_servers) {
115 iodmin = num_servers;
116 error = sysctlbyname("vfs.nfs.iodmin", NULL, 0, &iodmin,
117 sizeof iodmin);
118 if (error < 0)
119 err(1, "sysctlbyname(\"vfs.nfs.iodmin\")");
120 }
121 iodmax = num_servers;
122 error = sysctlbyname("vfs.nfs.iodmax", NULL, 0, &iodmax, sizeof iodmax);
123 if (error < 0)
124 err(1, "sysctlbyname(\"vfs.nfs.iodmax\")");
125 exit (0);
126 }
127
128