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, &sectorsize) == -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 */

Reply via email to