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