Hello all. This patch allows specifing K/M/T/... prefixies in newfs(8) -S and -s options. Useful for mount_mfs, now you can just say:
mount_mfs -s 50m swap /mnt and it will do what you want, taking in account sector size. Old behavior of -s (specifying count of sectors) is, of course, preserved. Hope this'll be useful. Index: newfs.8 =================================================================== RCS file: /cvs/src/sbin/newfs/newfs.8,v retrieving revision 1.68 diff -u -p -r1.68 newfs.8 --- newfs.8 21 Mar 2010 07:51:23 -0000 1.68 +++ newfs.8 13 Jan 2011 13:43:08 -0000 @@ -218,6 +218,8 @@ 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). +The argument may contain a multiplier, as documented in +.Xr scan_scaled 3 . A sector is the smallest addressable unit on the physical device. Changing this is useful only when using .Nm @@ -230,10 +232,12 @@ from its default will make it impossible to find the alternate superblocks 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 size of the file system. +The argument may contain a multiplier, as documented in +.Xr scan_scaled 3 . +If multiplier was not specified then 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 (not bytes!), 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 512\-byte blocks, slightly less than 1 TB. FFS2 file systems can be as large as 64 PB. Index: newfs.c =================================================================== RCS file: /cvs/src/sbin/newfs/newfs.c,v retrieving revision 1.88 diff -u -p -r1.88 newfs.c --- newfs.c 13 Dec 2010 00:02:58 -0000 1.88 +++ newfs.c 13 Jan 2011 13:43:08 -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,7 @@ main(int argc, char *argv[]) char **saveargv = argv; int ffsflag = 1; const char *errstr; + long long fssize_scaled = -1; if (strstr(__progname, "mfs")) mfs = Nflag = quiet = 1; @@ -192,9 +193,10 @@ 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 > INT_MAX) + fatal("sector size: %s: %s", strerror(errno), + optarg); break; case 'T': disktype = optarg; @@ -265,10 +267,18 @@ main(int argc, char *argv[]) quiet = 1; break; case 's': + /* + * We need to save scaled and unscaled value separately + * because unscaled is not representing bytes. + */ + fssize_scaled = -1; /* in case of multiple -s */ fssize = strtonum(optarg, 1, LLONG_MAX, &errstr); - if (errstr) - fatal("file system size is %s: %s", - errstr, optarg); + if (!errstr) + break; + if (strcmp(errstr, "invalid") || + scan_scaled(optarg, &fssize_scaled) == -1 || + fssize_scaled <= 0) + fatal("file system size is %s: %s", errstr, optarg); break; case 't': fstype = optarg; @@ -412,17 +422,23 @@ 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_scaled != -1) { + fssize = (daddr64_t)fssize_scaled / (daddr64_t)sectorsize; + if ((daddr64_t)fssize_scaled % (daddr64_t)sectorsize != 0) + fssize++; + } else 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)); + fssize *= sectorsize / DEV_BSIZE; if (oflagset == 0 && fssize >= INT_MAX) Oflag = 2; /* FFS2 */