Utility changes associated with the updated dirpref algorithm for Darwin/OSX. Index: fsck.tproj/setup.c =================================================================== RCS file: /cvs/Darwin/diskdev_cmds/fsck.tproj/setup.c,v retrieving revision 1.8 diff -u -r1.8 setup.c --- fsck.tproj/setup.c 2002/05/29 22:13:52 1.8 +++ fsck.tproj/setup.c 2003/03/26 19:32:06 @@ -481,11 +481,14 @@ altsblock.fs_rotdelay = sblock.fs_rotdelay; altsblock.fs_maxbpg = sblock.fs_maxbpg; memmove(altsblock.fs_ocsp, sblock.fs_ocsp, sizeof sblock.fs_ocsp); + altsblock.fs_contigdirs = sblock.fs_contigdirs; altsblock.fs_csp = sblock.fs_csp; altsblock.fs_maxcluster = sblock.fs_maxcluster; memmove(altsblock.fs_fsmnt, sblock.fs_fsmnt, sizeof sblock.fs_fsmnt); memmove(altsblock.fs_sparecon, sblock.fs_sparecon, sizeof sblock.fs_sparecon); + altsblock.fs_avgfilesize = sblock.fs_avgfilesize; + altsblock.fs_avgfpdir = sblock.fs_avgfpdir; /* * The following should not have to be copied. */ Index: newfs.tproj/mkfs.c =================================================================== RCS file: /cvs/Darwin/diskdev_cmds/newfs.tproj/mkfs.c,v retrieving revision 1.4 diff -u -r1.4 mkfs.c --- newfs.tproj/mkfs.c 2002/11/22 03:15:14 1.4 +++ newfs.tproj/mkfs.c 2003/03/26 19:32:06 @@ -150,6 +150,8 @@ extern int nrpos; /* # of distinguished rotational positions */ extern int bbsize; /* boot block size */ extern int sbsize; /* superblock size */ +extern int avgfilesize; /* expected average file size */ +extern int avgfilesperdir; /* expected number of files per directory */ extern u_long memleft; /* virtual memory available */ extern caddr_t membase; /* start address of memory based filesystem */ extern caddr_t malloc(u_long), calloc(u_long, u_long); @@ -264,6 +266,17 @@ printf("preposterous ntrak %d\n", sblock.fs_ntrak), exit(14); if (sblock.fs_nsect <= 0) printf("preposterous nsect %d\n", sblock.fs_nsect), exit(15); + /* + * collect and verify the filesystem density info + */ + sblock.fs_avgfilesize = avgfilesize; + sblock.fs_avgfpdir = avgfilesperdir; + if (sblock.fs_avgfilesize <= 0) + printf("illegal expected average file size %d\n", + sblock.fs_avgfilesize), exit(14); + if (sblock.fs_avgfpdir <= 0) + printf("illegal expected number of files per directory %d\n", + sblock.fs_avgfpdir), exit(15); /* * collect and verify the block and fragment sizes */ Index: newfs.tproj/newfs.c =================================================================== RCS file: /cvs/Darwin/diskdev_cmds/newfs.tproj/newfs.c,v retrieving revision 1.4 diff -u -r1.4 newfs.c --- newfs.tproj/newfs.c 2002/11/22 03:15:14 1.4 +++ newfs.tproj/newfs.c 2003/03/26 19:32:06 @@ -214,6 +214,8 @@ int rotdelay = ROTDELAY; /* rotational delay between blocks */ int maxbpg; /* maximum blocks per file in a cyl group */ int nrpos = NRPOS; /* # of distinguished rotational positions */ +int avgfilesize = AVFILESIZ;/* expected average file size */ +int avgfilesperdir = AFPDIR;/* expected number of files per directory */ int bbsize = BBSIZE; /* boot block size */ int sbsize = SBSIZE; /* superblock size */ int mntflags = MNT_ASYNC; /* flags to be passed to mount */ @@ -254,7 +256,7 @@ else progname = *argv; - opstring = "NOS:T:a:b:c:d:e:f:i:k:l:m:n:o:p:r:s:t:u:v:x:"; + opstring = "NOS:T:a:b:c:d:e:f:g:h:i:k:l:m:n:o:p:r:s:t:u:v:x:"; while ((ch = getopt(argc, argv, opstring)) != EOF) switch (ch) { case 'N': @@ -299,6 +301,14 @@ if ((fsize = atoi(optarg)) <= 0) fatal("%s: bad fragment size", optarg); break; + case 'g': + if ((avgfilesize = atoi(optarg)) <= 0) + fatal("%s: bad average file size", optarg); + break; + case 'h': + if ((avgfilesperdir = atoi(optarg)) <= 0) + fatal("%s: bad average files per dir", optarg); + break; case 'i': if ((density = atoi(optarg)) <= 0) fatal("%s: bad bytes per inode\n", optarg); @@ -708,6 +718,8 @@ 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-f frag size\n"); + fprintf(stderr, "\t-g average file size\n"); + fprintf(stderr, "\t-h average files per directory\n"); fprintf(stderr, "\t-i number of bytes per inode\n"); fprintf(stderr, "\t-k sector 0 skew, per track\n"); fprintf(stderr, "\t-l hardware sector interleave\n"); Index: tunefs.tproj/tunefs.c =================================================================== RCS file: /cvs/Darwin/diskdev_cmds/tunefs.tproj/tunefs.c,v retrieving revision 1.1.1.1 diff -u -r1.1.1.1 tunefs.c --- tunefs.tproj/tunefs.c 1999/05/02 01:42:44 1.1.1.1 +++ tunefs.tproj/tunefs.c 2003/03/26 19:32:06 @@ -179,6 +179,22 @@ sblock.fs_maxbpg = i; continue; + case 'f': + name = "average file size"; + i = atoi(*argv); + if (i < 1) + errx(10, "%s must be >= 1 (was %s)", + name, *argv); + if (sblock.fs_avgfilesize == i) { + warnx("%s remains unchanged as %d", + name, *argv); + } else { + warn("%s changes from %d to %d", + name, sblock.fs_avgfilesize, i); + sblock.fs_avgfilesize = i; + } + continue; + case 'm': name = "minimum percentage of free space"; if (argc < 1) @@ -226,6 +242,22 @@ warnx(OPTWARN, "space", "<", MINFREE); continue; + case 's': + name = "expected number of files per directory"; + i = atoi(*argv); + if (i < 1) + errx(10, "%s must be >= 1 (was %s)", + name, *argv); + if (sblock.fs_avgfpdir == i) { + warnx("%s remains unchanged as %d", + name, i); + } else { + warnx("%s changes from %d to %d", + name, sblock.fs_avgfpdir, i); + sblock.fs_avgfpdir = i; + } + continue; + case 't': name = "track skew in sectors"; if (argc < 1) @@ -262,6 +294,10 @@ chg[sblock.fs_optim]); fprintf(stdout, "\ttrack skew %d sectors\n", sblock.fs_trackskew); + fprintf(stdout, "\texpected average file size %d\n", + sblock.fs_avgfilesize); + fprintf(stdout, "\texpexted number of files per directory %d\n", + sblock.fs_avgfpdir); fprintf(stdout, "tunefs: no changes made\n"); exit(0); } @@ -289,6 +325,8 @@ fprintf(stderr, "\t-m minimum percentage of free space\n"); fprintf(stderr, "\t-o optimization preference (`space' or `time')\n"); fprintf(stderr, "\t-t track skew in sectors\n"); + fprintf(stderr, "\t-f expected average file size\n"); + fprintf(stderr, "\t-s expected number of files per directory\n"); exit(2); }