new format, add manual page
[unix-history] / usr / src / sbin / tunefs / tunefs.c
index 1c831bb..2d4046e 100644 (file)
@@ -1,11 +1,33 @@
+/*
+ * Copyright (c) 1983 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)tunefs.c    4.4 (Berkeley) %G%";
-#endif lint
+char copyright[] =
+"@(#) Copyright (c) 1983 The Regents of the University of California.\n\
+ All rights reserved.\n";
+#endif /* not lint */
+
+#ifndef lint
+static char sccsid[] = "@(#)tunefs.c   5.7 (Berkeley) %G%";
+#endif /* not lint */
 
 /*
  * tunefs: change layout parameters to an existing file system.
  */
 
 /*
  * tunefs: change layout parameters to an existing file system.
  */
-
 #include <sys/param.h>
 #include <sys/stat.h>
 #include <sys/fs.h>
 #include <sys/param.h>
 #include <sys/stat.h>
 #include <sys/fs.h>
@@ -21,6 +43,7 @@ union {
 #define        sblock sbun.sb
 
 int fi;
 #define        sblock sbun.sb
 
 int fi;
+long dev_bsize = 1;
 
 main(argc, argv)
        int argc;
 
 main(argc, argv)
        int argc;
@@ -30,9 +53,8 @@ main(argc, argv)
        struct stat st;
        int i;
        int Aflag = 0;
        struct stat st;
        int i;
        int Aflag = 0;
-       char device[MAXPATHLEN];
-       extern char *sprintf();
        struct fstab *fs;
        struct fstab *fs;
+       char *chg[2], device[MAXPATHLEN];
 
        argc--, argv++; 
        if (argc < 2)
 
        argc--, argv++; 
        if (argc < 2)
@@ -46,7 +68,8 @@ again:
                if (*special != '/') {
                        if (*special == 'r')
                                special++;
                if (*special != '/') {
                        if (*special == 'r')
                                special++;
-                       special = sprintf(device, "/dev/%s", special);
+                       (void)sprintf(device, "/dev/%s", special);
+                       special = device;
                        goto again;
                }
                fprintf(stderr, "tunefs: "); perror(special);
                        goto again;
                }
                fprintf(stderr, "tunefs: "); perror(special);
@@ -85,8 +108,6 @@ again:
                                        fatal("-d: missing %s", name);
                                argc--, argv++;
                                i = atoi(*argv);
                                        fatal("-d: missing %s", name);
                                argc--, argv++;
                                i = atoi(*argv);
-                               if (i < 0)
-                                       fatal("%s: bad %s", *argv, name);
                                fprintf(stdout,
                                        "%s changes from %dms to %dms\n",
                                        name, sblock.fs_rotdelay, i);
                                fprintf(stdout,
                                        "%s changes from %dms to %dms\n",
                                        name, sblock.fs_rotdelay, i);
@@ -120,6 +141,44 @@ again:
                                        "%s changes from %d%% to %d%%\n",
                                        name, sblock.fs_minfree, i);
                                sblock.fs_minfree = i;
                                        "%s changes from %d%% to %d%%\n",
                                        name, sblock.fs_minfree, i);
                                sblock.fs_minfree = i;
+                               if (i >= 10 && sblock.fs_optim == FS_OPTSPACE)
+                                       fprintf(stdout, "should optimize %s",
+                                           "for time with minfree >= 10%\n");
+                               if (i < 10 && sblock.fs_optim == FS_OPTTIME)
+                                       fprintf(stdout, "should optimize %s",
+                                           "for space with minfree < 10%\n");
+                               continue;
+
+                       case 'o':
+                               name = "optimization preference";
+                               if (argc < 1)
+                                       fatal("-o: missing %s", name);
+                               argc--, argv++;
+                               chg[FS_OPTSPACE] = "space";
+                               chg[FS_OPTTIME] = "time";
+                               if (strcmp(*argv, chg[FS_OPTSPACE]) == 0)
+                                       i = FS_OPTSPACE;
+                               else if (strcmp(*argv, chg[FS_OPTTIME]) == 0)
+                                       i = FS_OPTTIME;
+                               else
+                                       fatal("%s: bad %s (options are `space' or `time')",
+                                               *argv, name);
+                               if (sblock.fs_optim == i) {
+                                       fprintf(stdout,
+                                               "%s remains unchanged as %s\n",
+                                               name, chg[i]);
+                                       continue;
+                               }
+                               fprintf(stdout,
+                                       "%s changes from %s to %s\n",
+                                       name, chg[sblock.fs_optim], chg[i]);
+                               sblock.fs_optim = i;
+                               if (sblock.fs_minfree >= 10 && i == FS_OPTSPACE)
+                                       fprintf(stdout, "should optimize %s",
+                                           "for time with minfree >= 10%\n");
+                               if (sblock.fs_minfree < 10 && i == FS_OPTTIME)
+                                       fprintf(stdout, "should optimize %s",
+                                           "for space with minfree < 10%\n");
                                continue;
 
                        default:
                                continue;
 
                        default:
@@ -128,7 +187,7 @@ again:
        }
        if (argc != 1)
                goto usage;
        }
        if (argc != 1)
                goto usage;
-       bwrite(SBLOCK, (char *)&sblock, SBSIZE);
+       bwrite(SBOFF / dev_bsize, (char *)&sblock, SBSIZE);
        if (Aflag)
                for (i = 0; i < sblock.fs_ncg; i++)
                        bwrite(fsbtodb(&sblock, cgsblock(&sblock, i)),
        if (Aflag)
                for (i = 0; i < sblock.fs_ncg; i++)
                        bwrite(fsbtodb(&sblock, cgsblock(&sblock, i)),
@@ -142,6 +201,7 @@ usage:
        fprintf(stderr, "\t-d rotational delay between contiguous blocks\n");
        fprintf(stderr, "\t-e maximum blocks per file in a cylinder group\n");
        fprintf(stderr, "\t-m minimum percentage of free space\n");
        fprintf(stderr, "\t-d rotational delay between contiguous blocks\n");
        fprintf(stderr, "\t-e maximum blocks per file in a cylinder group\n");
        fprintf(stderr, "\t-m minimum percentage of free space\n");
+       fprintf(stderr, "\t-o optimization preference (`space' or `time')\n");
        exit(2);
 }
 
        exit(2);
 }
 
@@ -156,7 +216,7 @@ getsb(fs, file)
                perror(file);
                exit(3);
        }
                perror(file);
                exit(3);
        }
-       if (bread(SBLOCK, (char *)fs, SBSIZE)) {
+       if (bread(SBOFF, (char *)fs, SBSIZE)) {
                fprintf(stderr, "bad super block");
                perror(file);
                exit(4);
                fprintf(stderr, "bad super block");
                perror(file);
                exit(4);
@@ -165,6 +225,7 @@ getsb(fs, file)
                fprintf(stderr, "%s: bad magic number\n", file);
                exit(5);
        }
                fprintf(stderr, "%s: bad magic number\n", file);
                exit(5);
        }
+       dev_bsize = fs->fs_fsize / fsbtodb(fs, 1);
 }
 
 bwrite(blk, buf, size)
 }
 
 bwrite(blk, buf, size)
@@ -172,7 +233,7 @@ bwrite(blk, buf, size)
        daddr_t blk;
        register size;
 {
        daddr_t blk;
        register size;
 {
-       if (lseek(fi, blk * DEV_BSIZE, 0) < 0) {
+       if (lseek(fi, blk * dev_bsize, 0) < 0) {
                perror("FS SEEK");
                exit(6);
        }
                perror("FS SEEK");
                exit(6);
        }
@@ -188,7 +249,7 @@ bread(bno, buf, cnt)
 {
        register i;
 
 {
        register i;
 
-       if (lseek(fi, bno * DEV_BSIZE, 0) < 0)
+       if (lseek(fi, bno * dev_bsize, 0) < 0)
                return(1);
        if ((i = read(fi, buf, cnt)) != cnt) {
                for(i=0; i<sblock.fs_bsize; i++)
                return(1);
        if ((i = read(fi, buf, cnt)) != cnt) {
                for(i=0; i<sblock.fs_bsize; i++)