|
|
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.