On 01/13/11 14:48, Vadim Zhukov wrote:
> 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.
I like the proposed functionality. Comments below.
>
> 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.
Can someone explain to me why the manpage needs to explain all of this
internal mumbo-jumbo? It just confused me. Either it's sector size or
it's in [KMGTP].
> 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),
errno will only be set if scan_scaled() failed.
> + 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);
same here
> 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 */
>
/Alexander