|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: char copyright[] = ! 22: "@(#) Copyright (c) 1983 The Regents of the University of California.\n\ ! 23: All rights reserved.\n"; ! 24: #endif /* not lint */ ! 25: ! 26: #ifndef lint ! 27: static char sccsid[] = "@(#)tunefs.c 5.11 (Berkeley) 6/1/90"; ! 28: #endif /* not lint */ ! 29: ! 30: /* ! 31: * tunefs: change layout parameters to an existing file system. ! 32: */ ! 33: #include <sys/param.h> ! 34: #include <sys/stat.h> ! 35: #include <ufs/fs.h> ! 36: #include <fstab.h> ! 37: #include <stdio.h> ! 38: #include <paths.h> ! 39: ! 40: union { ! 41: struct fs sb; ! 42: char pad[MAXBSIZE]; ! 43: } sbun; ! 44: #define sblock sbun.sb ! 45: ! 46: int fi; ! 47: long dev_bsize = 1; ! 48: ! 49: main(argc, argv) ! 50: int argc; ! 51: char *argv[]; ! 52: { ! 53: char *cp, *special, *name; ! 54: struct stat st; ! 55: int i; ! 56: int Aflag = 0; ! 57: struct fstab *fs; ! 58: char *chg[2], device[MAXPATHLEN]; ! 59: ! 60: argc--, argv++; ! 61: if (argc < 2) ! 62: goto usage; ! 63: special = argv[argc - 1]; ! 64: fs = getfsfile(special); ! 65: if (fs) ! 66: special = fs->fs_spec; ! 67: again: ! 68: if (stat(special, &st) < 0) { ! 69: if (*special != '/') { ! 70: if (*special == 'r') ! 71: special++; ! 72: (void)sprintf(device, "%s/%s", _PATH_DEV, special); ! 73: special = device; ! 74: goto again; ! 75: } ! 76: fprintf(stderr, "tunefs: "); perror(special); ! 77: exit(1); ! 78: } ! 79: if ((st.st_mode & S_IFMT) != S_IFBLK && ! 80: (st.st_mode & S_IFMT) != S_IFCHR) ! 81: fatal("%s: not a block or character device", special); ! 82: getsb(&sblock, special); ! 83: for (; argc > 0 && argv[0][0] == '-'; argc--, argv++) { ! 84: for (cp = &argv[0][1]; *cp; cp++) ! 85: switch (*cp) { ! 86: ! 87: case 'A': ! 88: Aflag++; ! 89: continue; ! 90: ! 91: case 'a': ! 92: name = "maximum contiguous block count"; ! 93: if (argc < 1) ! 94: fatal("-a: missing %s", name); ! 95: argc--, argv++; ! 96: i = atoi(*argv); ! 97: if (i < 1) ! 98: fatal("%s: %s must be >= 1", ! 99: *argv, name); ! 100: fprintf(stdout, "%s changes from %d to %d\n", ! 101: name, sblock.fs_maxcontig, i); ! 102: sblock.fs_maxcontig = i; ! 103: continue; ! 104: ! 105: case 'd': ! 106: name = ! 107: "rotational delay between contiguous blocks"; ! 108: if (argc < 1) ! 109: fatal("-d: missing %s", name); ! 110: argc--, argv++; ! 111: i = atoi(*argv); ! 112: fprintf(stdout, ! 113: "%s changes from %dms to %dms\n", ! 114: name, sblock.fs_rotdelay, i); ! 115: sblock.fs_rotdelay = i; ! 116: continue; ! 117: ! 118: case 'e': ! 119: name = ! 120: "maximum blocks per file in a cylinder group"; ! 121: if (argc < 1) ! 122: fatal("-e: missing %s", name); ! 123: argc--, argv++; ! 124: i = atoi(*argv); ! 125: if (i < 1) ! 126: fatal("%s: %s must be >= 1", ! 127: *argv, name); ! 128: fprintf(stdout, "%s changes from %d to %d\n", ! 129: name, sblock.fs_maxbpg, i); ! 130: sblock.fs_maxbpg = i; ! 131: continue; ! 132: ! 133: case 'm': ! 134: name = "minimum percentage of free space"; ! 135: if (argc < 1) ! 136: fatal("-m: missing %s", name); ! 137: argc--, argv++; ! 138: i = atoi(*argv); ! 139: if (i < 0 || i > 99) ! 140: fatal("%s: bad %s", *argv, name); ! 141: fprintf(stdout, ! 142: "%s changes from %d%% to %d%%\n", ! 143: name, sblock.fs_minfree, i); ! 144: sblock.fs_minfree = i; ! 145: if (i >= 10 && sblock.fs_optim == FS_OPTSPACE) ! 146: fprintf(stdout, "should optimize %s", ! 147: "for time with minfree >= 10%\n"); ! 148: if (i < 10 && sblock.fs_optim == FS_OPTTIME) ! 149: fprintf(stdout, "should optimize %s", ! 150: "for space with minfree < 10%\n"); ! 151: continue; ! 152: ! 153: case 'o': ! 154: name = "optimization preference"; ! 155: if (argc < 1) ! 156: fatal("-o: missing %s", name); ! 157: argc--, argv++; ! 158: chg[FS_OPTSPACE] = "space"; ! 159: chg[FS_OPTTIME] = "time"; ! 160: if (strcmp(*argv, chg[FS_OPTSPACE]) == 0) ! 161: i = FS_OPTSPACE; ! 162: else if (strcmp(*argv, chg[FS_OPTTIME]) == 0) ! 163: i = FS_OPTTIME; ! 164: else ! 165: fatal("%s: bad %s (options are `space' or `time')", ! 166: *argv, name); ! 167: if (sblock.fs_optim == i) { ! 168: fprintf(stdout, ! 169: "%s remains unchanged as %s\n", ! 170: name, chg[i]); ! 171: continue; ! 172: } ! 173: fprintf(stdout, ! 174: "%s changes from %s to %s\n", ! 175: name, chg[sblock.fs_optim], chg[i]); ! 176: sblock.fs_optim = i; ! 177: if (sblock.fs_minfree >= 10 && i == FS_OPTSPACE) ! 178: fprintf(stdout, "should optimize %s", ! 179: "for time with minfree >= 10%\n"); ! 180: if (sblock.fs_minfree < 10 && i == FS_OPTTIME) ! 181: fprintf(stdout, "should optimize %s", ! 182: "for space with minfree < 10%\n"); ! 183: continue; ! 184: ! 185: default: ! 186: fatal("-%c: unknown flag", *cp); ! 187: } ! 188: } ! 189: if (argc != 1) ! 190: goto usage; ! 191: bwrite(SBOFF / dev_bsize, (char *)&sblock, SBSIZE); ! 192: if (Aflag) ! 193: for (i = 0; i < sblock.fs_ncg; i++) ! 194: bwrite(fsbtodb(&sblock, cgsblock(&sblock, i)), ! 195: (char *)&sblock, SBSIZE); ! 196: close(fi); ! 197: exit(0); ! 198: usage: ! 199: fprintf(stderr, "Usage: tunefs tuneup-options special-device\n"); ! 200: fprintf(stderr, "where tuneup-options are:\n"); ! 201: fprintf(stderr, "\t-a maximum contiguous blocks\n"); ! 202: fprintf(stderr, "\t-d rotational delay between contiguous blocks\n"); ! 203: fprintf(stderr, "\t-e maximum blocks per file in a cylinder group\n"); ! 204: fprintf(stderr, "\t-m minimum percentage of free space\n"); ! 205: fprintf(stderr, "\t-o optimization preference (`space' or `time')\n"); ! 206: exit(2); ! 207: } ! 208: ! 209: getsb(fs, file) ! 210: register struct fs *fs; ! 211: char *file; ! 212: { ! 213: ! 214: fi = open(file, 2); ! 215: if (fi < 0) { ! 216: fprintf(stderr, "cannot open"); ! 217: perror(file); ! 218: exit(3); ! 219: } ! 220: if (bread(SBOFF, (char *)fs, SBSIZE)) { ! 221: fprintf(stderr, "bad super block"); ! 222: perror(file); ! 223: exit(4); ! 224: } ! 225: if (fs->fs_magic != FS_MAGIC) { ! 226: fprintf(stderr, "%s: bad magic number\n", file); ! 227: exit(5); ! 228: } ! 229: dev_bsize = fs->fs_fsize / fsbtodb(fs, 1); ! 230: } ! 231: ! 232: bwrite(blk, buf, size) ! 233: char *buf; ! 234: daddr_t blk; ! 235: register size; ! 236: { ! 237: if (lseek(fi, blk * dev_bsize, 0) < 0) { ! 238: perror("FS SEEK"); ! 239: exit(6); ! 240: } ! 241: if (write(fi, buf, size) != size) { ! 242: perror("FS WRITE"); ! 243: exit(7); ! 244: } ! 245: } ! 246: ! 247: bread(bno, buf, cnt) ! 248: daddr_t bno; ! 249: char *buf; ! 250: { ! 251: register i; ! 252: ! 253: if (lseek(fi, bno * dev_bsize, 0) < 0) ! 254: return(1); ! 255: if ((i = read(fi, buf, cnt)) != cnt) { ! 256: for(i=0; i<sblock.fs_bsize; i++) ! 257: buf[i] = 0; ! 258: return (1); ! 259: } ! 260: return (0); ! 261: } ! 262: ! 263: /* VARARGS1 */ ! 264: fatal(fmt, arg1, arg2) ! 265: char *fmt, *arg1, *arg2; ! 266: { ! 267: ! 268: fprintf(stderr, "tunefs: "); ! 269: fprintf(stderr, fmt, arg1, arg2); ! 270: putc('\n', stderr); ! 271: exit(10); ! 272: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.