+/*
+ * 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
-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.
*/
-
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/fs.h>
#define sblock sbun.sb
int fi;
+long dev_bsize = 1;
main(argc, argv)
int argc;
struct stat st;
int i;
int Aflag = 0;
- char device[MAXPATHLEN];
- extern char *sprintf();
struct fstab *fs;
+ char *chg[2], device[MAXPATHLEN];
argc--, argv++;
if (argc < 2)
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);
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);
"%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:
}
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)),
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);
}
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, "%s: bad magic number\n", file);
exit(5);
}
+ dev_bsize = fs->fs_fsize / fsbtodb(fs, 1);
}
bwrite(blk, buf, 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);
}
{
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++)