|
|
1.1 root 1: #ifndef lint
2: static char *sccsid = "@(#)tunefs.c 4.4 (Berkeley) 7/1/83";
3: #endif lint
4:
5: /*
6: * tunefs: change layout parameters to an existing file system.
7: */
8:
9: #include <sys/param.h>
10: #include <sys/stat.h>
11: #include <sys/fs.h>
12: #include <sys/inode.h>
13:
14: #include <stdio.h>
15: #include <fstab.h>
16:
17: union {
18: struct fs sb;
19: char pad[MAXBSIZE];
20: } sbun;
21: #define sblock sbun.sb
22:
23: int fi;
24:
25: main(argc, argv)
26: int argc;
27: char *argv[];
28: {
29: char *cp, *special, *name;
30: struct stat st;
31: int i;
32: int Aflag = 0;
33: char device[MAXPATHLEN];
34: extern char *sprintf();
35: struct fstab *fs;
36:
37: argc--, argv++;
38: if (argc < 2)
39: goto usage;
40: special = argv[argc - 1];
41: fs = getfsfile(special);
42: if (fs)
43: special = fs->fs_spec;
44: again:
45: if (stat(special, &st) < 0) {
46: if (*special != '/') {
47: if (*special == 'r')
48: special++;
49: special = sprintf(device, "/dev/%s", special);
50: goto again;
51: }
52: fprintf(stderr, "tunefs: "); perror(special);
53: exit(1);
54: }
55: if ((st.st_mode & S_IFMT) != S_IFBLK &&
56: (st.st_mode & S_IFMT) != S_IFCHR)
57: fatal("%s: not a block or character device", special);
58: getsb(&sblock, special);
59: for (; argc > 0 && argv[0][0] == '-'; argc--, argv++) {
60: for (cp = &argv[0][1]; *cp; cp++)
61: switch (*cp) {
62:
63: case 'A':
64: Aflag++;
65: continue;
66:
67: case 'a':
68: name = "maximum contiguous block count";
69: if (argc < 1)
70: fatal("-a: missing %s", name);
71: argc--, argv++;
72: i = atoi(*argv);
73: if (i < 1)
74: fatal("%s: %s must be >= 1",
75: *argv, name);
76: fprintf(stdout, "%s changes from %d to %d\n",
77: name, sblock.fs_maxcontig, i);
78: sblock.fs_maxcontig = i;
79: continue;
80:
81: case 'd':
82: name =
83: "rotational delay between contiguous blocks";
84: if (argc < 1)
85: fatal("-d: missing %s", name);
86: argc--, argv++;
87: i = atoi(*argv);
88: if (i < 0)
89: fatal("%s: bad %s", *argv, name);
90: fprintf(stdout,
91: "%s changes from %dms to %dms\n",
92: name, sblock.fs_rotdelay, i);
93: sblock.fs_rotdelay = i;
94: continue;
95:
96: case 'e':
97: name =
98: "maximum blocks per file in a cylinder group";
99: if (argc < 1)
100: fatal("-e: missing %s", name);
101: argc--, argv++;
102: i = atoi(*argv);
103: if (i < 1)
104: fatal("%s: %s must be >= 1",
105: *argv, name);
106: fprintf(stdout, "%s changes from %d to %d\n",
107: name, sblock.fs_maxbpg, i);
108: sblock.fs_maxbpg = i;
109: continue;
110:
111: case 'm':
112: name = "minimum percentage of free space";
113: if (argc < 1)
114: fatal("-m: missing %s", name);
115: argc--, argv++;
116: i = atoi(*argv);
117: if (i < 0 || i > 99)
118: fatal("%s: bad %s", *argv, name);
119: fprintf(stdout,
120: "%s changes from %d%% to %d%%\n",
121: name, sblock.fs_minfree, i);
122: sblock.fs_minfree = i;
123: continue;
124:
125: default:
126: fatal("-%c: unknown flag", *cp);
127: }
128: }
129: if (argc != 1)
130: goto usage;
131: bwrite(SBLOCK, (char *)&sblock, SBSIZE);
132: if (Aflag)
133: for (i = 0; i < sblock.fs_ncg; i++)
134: bwrite(fsbtodb(&sblock, cgsblock(&sblock, i)),
135: (char *)&sblock, SBSIZE);
136: close(fi);
137: exit(0);
138: usage:
139: fprintf(stderr, "Usage: tunefs tuneup-options special-device\n");
140: fprintf(stderr, "where tuneup-options are:\n");
141: fprintf(stderr, "\t-a maximum contiguous blocks\n");
142: fprintf(stderr, "\t-d rotational delay between contiguous blocks\n");
143: fprintf(stderr, "\t-e maximum blocks per file in a cylinder group\n");
144: fprintf(stderr, "\t-m minimum percentage of free space\n");
145: exit(2);
146: }
147:
148: getsb(fs, file)
149: register struct fs *fs;
150: char *file;
151: {
152:
153: fi = open(file, 2);
154: if (fi < 0) {
155: fprintf(stderr, "cannot open");
156: perror(file);
157: exit(3);
158: }
159: if (bread(SBLOCK, (char *)fs, SBSIZE)) {
160: fprintf(stderr, "bad super block");
161: perror(file);
162: exit(4);
163: }
164: if (fs->fs_magic != FS_MAGIC) {
165: fprintf(stderr, "%s: bad magic number\n", file);
166: exit(5);
167: }
168: }
169:
170: bwrite(blk, buf, size)
171: char *buf;
172: daddr_t blk;
173: register size;
174: {
175: if (lseek(fi, blk * DEV_BSIZE, 0) < 0) {
176: perror("FS SEEK");
177: exit(6);
178: }
179: if (write(fi, buf, size) != size) {
180: perror("FS WRITE");
181: exit(7);
182: }
183: }
184:
185: bread(bno, buf, cnt)
186: daddr_t bno;
187: char *buf;
188: {
189: register i;
190:
191: if (lseek(fi, bno * DEV_BSIZE, 0) < 0)
192: return(1);
193: if ((i = read(fi, buf, cnt)) != cnt) {
194: for(i=0; i<sblock.fs_bsize; i++)
195: buf[i] = 0;
196: return (1);
197: }
198: return (0);
199: }
200:
201: /* VARARGS1 */
202: fatal(fmt, arg1, arg2)
203: char *fmt, *arg1, *arg2;
204: {
205:
206: fprintf(stderr, "tunefs: ");
207: fprintf(stderr, fmt, arg1, arg2);
208: putc('\n', stderr);
209: exit(10);
210: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.