Date: Fri, 24 May 2002 18:19:40 +0200 From: Martin Kraemer <Martin.Kraemer@Fujitsu-Siemens.com> To: freebsd-stable@freebsd.org Subject: Re: newfs now defaults to fragsize == blksize == 16k?!? Message-ID: <20020524181940.A15918@deejai2.mch.fsc.net> In-Reply-To: <20020524164214.A8063@deejai2.mch.fsc.net>; from Martin.Kraemer@Fujitsu-Siemens.com on Fri, May 24, 2002 at 04:42:14PM %2B0200 References: <20020524164214.A8063@deejai2.mch.fsc.net>
index | next in thread | previous in thread | raw e-mail
On Fri, May 24, 2002 at 04:42:14PM +0200, Martin Kraemer wrote:
>
> Closer analysis showed me that the default fragsize in newfs
> seems to be 16kB now (identical to blksize). :-((
Even closer inspection shows that this is a bug in disklabel, not in newfs.
In disklabel.c, a new disk is initialized thusly:
disklabel.c:
83 /* FIX! These are too low, but are traditional */
84 #define DEFAULT_NEWFS_BLOCK 8192U
85 #define DEFAULT_NEWFS_FRAG 1024U
86 #define DEFAULT_NEWFS_CPG 16U
87
88 #define BIG_NEWFS_BLOCK 16384U
89 #define BIG_NEWFS_FRAG 4096U
90 #define BIG_NEWFS_CPG 64U
...
1281 /*
1282 * FIX! poor attempt at
1283 * adaptive
1284 */
1285 /* 1 GB */
1286 if (pp->p_size < 1*1024*1024*1024/lp->d_secsize) {
1287 /* FIX! These are too low, but are traditional */
1288 pp->p_fsize = DEFAULT_NEWFS_BLOCK;
1289 pp->p_frag = (unsigned char) DEFAULT_NEWFS_FRAG;
1290 pp->p_cpg = DEFAULT_NEWFS_CPG;
1291 } else {
1292 pp->p_fsize = BIG_NEWFS_BLOCK;
1293 pp->p_frag = (unsigned char) BIG_NEWFS_FRAG;
1294 pp->p_cpg = BIG_NEWFS_CPG;
1295 }
But p_fsize is the fragment size (here set to 8k/16k depending on the total
disk size) by default.
IMHO a logic similar to this snippet from disklabel.c:
1265 pp->p_frag = v / pp->p_fsize;
must be used instead, like (concept only, not checked):
> /*
> * FIX! poor attempt at
> * adaptive
> */
> /* 1 GB */
> if (pp->p_size < 1*1024*1024*1024/lp->d_secsize) {
> /* FIX! These are too low, but are traditional */
> pp->p_fsize = DEFAULT_NEWFS_FRAG; /* @@@ was: DEFAULT_NEWFS_BLOCK */
> pp->p_frag = (unsigned char) (DEFAULT_NEWFS_BLOCK / DEFAULT_NEWFS_FRAG); /* was: DEFAULT_NEWFS_FRAG */
> pp->p_cpg = DEFAULT_NEWFS_CPG;
> } else {
> pp->p_fsize = BIG_NEWFS_FRAG; /* @@@ was: BIG_NEWFS_BLOCK */
> pp->p_frag = (unsigned char) (BIG_NEWFS_BLOCK / BIG_NEWFS_FRAG); /* was: BIG_NEWFS_FRAG */
> pp->p_cpg = BIG_NEWFS_CPG;
> }
See also the comments in:
/usr/include/sys/disklabel.h: u_int32_t p_fsize; /* filesystem basic fragment size */
/usr/include/sys/disklabel.h: u_int8_t p_frag; /* filesystem fragments per block */
/usr/include/disktab.h: short p_fsize; /* frag size in bytes */
And newfs copies (in absense of an explicit switch) these values into
the new fs.
newfs.c:
528 if (fsize == 0) {
529 fsize = pp->p_fsize;
------------^^^^^^^^^^^^^^^^^^^^ Here.
530 if (fsize <= 0)
531 fsize = MAX(DFL_FRAGSIZE, lp->d_secsize);
532 }
BTW: This is how I got the strange values:
a) I had used "disklabel -e" and edited the ascii copy
# size offset fstype [fsize bsize bps/cpg]
a: 2G * 4.2BSD
b: 2G * 4.2BSD
.... etc. -- but I left the [fsize bsize bps/cpg] empty.
b) "disklabel -e" created this output from the empty input:
# size offset fstype [fsize bsize bps/cpg]
a: 4194304 0 4.2BSD 16384 16384 389 # (Cyl. 0 - 4161*)
b: 4194304 4194304 4.2BSD 16384 16384 389 # (Cyl. 4161*- 8322*)
.... etc. Soo: it was disklabel that broke the frags.
c) newfs used the values that "disklabel" had left :-(
Hope this helps,
Martin
--
<Martin.Kraemer@Fujitsu-Siemens.com> | Fujitsu Siemens
Fon: +49-89-636-46021, FAX: +49-89-636-47655 | 81730 Munich, Germany
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-stable" in the body of the message
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020524181940.A15918>
