2011/5/13 Vadim Zhukov <persg...@gmail.com>: > On 2 May 2011 G. 16:05:08 David Coppa wrote: >> PING. > > Sorry for sooooo looooooonnnng delaaaaaaay. :( > >> On Thu, Apr 21, 2011 at 2:03 PM, Otto Moerbeek <o...@drijf.net> wrote: >> > I think there a bug, see inline. > > Yep. I also fixed extern declaration in mkfs.c. > > (lint prints out many-many lines of warnings for mkfs.c, and it surely > needs love, but this is, of course, completely another case...)
Thanks a lot! Otto, can this go in now? Ciao, David > Index: mkfs.c > =================================================================== > RCS file: /cvs/src/sbin/newfs/mkfs.c,v > retrieving revision 1.74 > diff -u -p -r1.74 mkfs.c > --- mkfs.c 21 Mar 2010 09:13:30 -0000 1.74 > +++ mkfs.c 12 May 2011 22:04:36 -0000 > @@ -87,7 +87,7 @@ extern int mfs; /* run as the memory ba > extern int Nflag; /* run mkfs without writing file system */ > extern int Oflag; /* format as an 4.3BSD file system */ > extern daddr64_t fssize; /* file system size */ > -extern int sectorsize; /* bytes/sector */ > +extern long long sectorsize; /* bytes/sector */ > extern int fsize; /* fragment size */ > extern int bsize; /* block size */ > extern int maxfrgspercg; /* maximum fragments per cylinder group */ > @@ -404,8 +404,8 @@ mkfs(struct partition *pp, char *fsys, i > lastminfpg = roundup(sblock.fs_iblkno + > sblock.fs_ipg / INOPF(&sblock), sblock.fs_frag); > if (sblock.fs_size < lastminfpg) > - errx(28, "file system size %jd < minimum size of %d", > - (intmax_t)sblock.fs_size, lastminfpg); > + errx(28, "file system size %jd < minimum size of %d " > + "sectors", (intmax_t)sblock.fs_size, lastminfpg); > > if (sblock.fs_size % sblock.fs_fpg >= lastminfpg || > sblock.fs_size % sblock.fs_fpg == 0) > Index: newfs.8 > =================================================================== > RCS file: /cvs/src/sbin/newfs/newfs.8,v > retrieving revision 1.69 > diff -u -p -r1.69 newfs.8 > --- newfs.8 31 Mar 2011 11:17:58 -0000 1.69 > +++ newfs.8 12 May 2011 22:04:36 -0000 > @@ -218,6 +218,13 @@ With this option, > will not print extraneous information like superblock backups. > .It Fl S Ar sector-size > The size of a sector in bytes (almost always 512). > +Alternatively > +.Ar sector-size > +may instead use a multiplier, as documented in > +.Xr scan_scaled 3 . > +.Ar sector-size > +should be 512 or a multiple of it because the kernel operates > +512\-byte blocks internally. > A sector is the smallest addressable unit on the physical device. > Changing this is useful only when using > .Nm > @@ -227,14 +234,19 @@ created (for example on a write-once dis > Note that changing this > from its default will make it impossible for > .Xr fsck 8 > -to find the alternate superblocks if the standard superblock is > -lost. > +to find the alternate superblocks automatically if the standard > +superblock is lost. > .It Fl s Ar size > -The size of the file system in sectors. > -This value is multiplied by the number of 512\-byte blocks in a sector > -to yield the size of the file system in 512\-byte blocks, which is the value > -used by the kernel. > -The maximum size of an FFS file system is 2,147,483,647 (2^31 \- 1) of these > +The size of the file system in sectors (see > +.Fl S ) . > +Alternatively > +.Ar size > +may instead use a multiplier, as documented in > +.Xr scan_scaled 3 , > +to specify size in bytes; in this case > +.Ar size > +is rounded up to the next sector boundary. > +The maximum size of an FFS file system is 2,147,483,647 (2^31 \- 1) of > 512\-byte blocks, slightly less than 1 TB. > FFS2 file systems can be as large as 64 PB. > Note however that for > Index: newfs.c > =================================================================== > RCS file: /cvs/src/sbin/newfs/newfs.c,v > retrieving revision 1.89 > diff -u -p -r1.89 newfs.c > --- newfs.c 26 Apr 2011 14:02:14 -0000 1.89 > +++ newfs.c 12 May 2011 22:04:36 -0000 > @@ -114,7 +114,7 @@ int mfs; /* run as the memory based fi > int Nflag; /* run without writing file system */ > int Oflag = 1; /* 0 = 4.3BSD ffs, 1 = 4.4BSD ffs, 2 = ffs2 */ > daddr64_t fssize; /* file system size */ > -int sectorsize; /* bytes/sector */ > +long long sectorsize; /* bytes/sector */ > int fsize = 0; /* fragment size */ > int bsize = 0; /* block size */ > int maxfrgspercg = INT_MAX; /* maximum fragments per cylinder group */ > @@ -169,6 +169,8 @@ main(int argc, char *argv[]) > char **saveargv = argv; > int ffsflag = 1; > const char *errstr; > + long long fssize_input = 0; > + int fssize_usebytes = 0; > > if (strstr(__progname, "mfs")) > mfs = Nflag = quiet = 1; > @@ -192,9 +194,9 @@ main(int argc, char *argv[]) > oflagset = 1; > break; > case 'S': > - sectorsize = strtonum(optarg, 1, INT_MAX, &errstr); > - if (errstr) > - fatal("sector size is %s: %s", errstr, optarg); > + if (scan_scaled(optarg, §orsize) == -1 || > + sectorsize <= 0 || (sectorsize % DEV_BSIZE)) > + fatal("sector size invalid: %s", optarg); > break; > case 'T': > disktype = optarg; > @@ -264,11 +266,17 @@ main(int argc, char *argv[]) > case 'q': > quiet = 1; > break; > + > case 's': > - fssize = strtonum(optarg, 1, LLONG_MAX, &errstr); > - if (errstr) > - fatal("file system size is %s: %s", > - errstr, optarg); > + if (scan_scaled(optarg, &fssize_input) == -1 || > + fssize_input <= 0) > + fatal("file system size invalid: %s", optarg); > + fssize_usebytes = 0; /* in case of multiple -s */ > + for (s1 = optarg; *s1 != '\0'; s1++) > + if (isalpha(*s1)) { > + fssize_usebytes = 1; > + break; > + } > break; > case 't': > fstype = optarg; > @@ -414,17 +422,25 @@ main(int argc, char *argv[]) > argv[0], *cp); > } > havelabel: > - if (fssize == 0) > - fssize = DL_GETPSIZE(pp); > - if (fssize > DL_GETPSIZE(pp) && !mfs) > - fatal("%s: maximum file system size on the `%c' partition is %lld", > - argv[0], *cp, DL_GETPSIZE(pp)); > - > if (sectorsize == 0) { > sectorsize = lp->d_secsize; > if (sectorsize <= 0) > fatal("%s: no default sector size", argv[0]); > } > + > + if (fssize_usebytes) { > + fssize = (daddr64_t)fssize_input / (daddr64_t)sectorsize; > + if ((daddr64_t)fssize_input % (daddr64_t)sectorsize != 0) > + fssize++; > + } else if (fssize_input == 0) > + fssize = DL_GETPSIZE(pp); > + else > + fssize = (daddr64_t)fssize_input; > + > + if (fssize > DL_GETPSIZE(pp) && !mfs) > + fatal("%s: maximum file system size on the `%c' partition is " > + "%lld sectors", argv[0], *cp, DL_GETPSIZE(pp)); > + > fssize *= sectorsize / DEV_BSIZE; > if (oflagset == 0 && fssize >= INT_MAX) > Oflag = 2; /* FFS2 */