MFS - Fix MFS size passed to kernel mfs component
authorMatthew Dillon <dillon@apollo.backplane.com>
Tue, 1 Sep 2009 14:37:42 +0000 (07:37 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Tue, 1 Sep 2009 14:37:42 +0000 (07:37 -0700)
* Half the size was being passed because fssize is adjusted by
  mkfs from a sector-based count to a filesystem-block-based count.
  This caused failures as the MFS filesystem filled up.

sbin/newfs/mkfs.c
sbin/newfs/newfs.c

index 4e3350c..bd302bb 100644 (file)
@@ -77,7 +77,7 @@ extern struct stat mfs_mtstat;        /* stat prior to mount          */
 extern int     Nflag;          /* run mkfs without writing file system */
 extern int     Oflag;          /* format as an 4.3BSD file system */
 extern int     Uflag;          /* enable soft updates for file system */
-extern int     fssize;         /* file system size */
+extern u_long  fssize;         /* file system size */
 extern int     ntracks;        /* # tracks/cylinder */
 extern int     nsectors;       /* # sectors/track */
 extern int     nphyssectors;   /* # sectors/track including spares */
@@ -228,7 +228,7 @@ mkfs(char *fsys, int fi, int fo, const char *mfscopy)
                        l1 = fssize * sectorsize;
                        if (l1 > BUFSIZ)
                                l1 = BUFSIZ;
-                       for (l = 0; l < (u_long)fssize * (u_long)sectorsize; l += l1) {
+                       for (l = 0; l < fssize * (u_long)sectorsize; l += l1) {
                                w = write(fd, buf, l1);
                                if (w < 0 || (u_long)w != l1)
                                        err(12, "%s", filename);
@@ -247,8 +247,7 @@ mkfs(char *fsys, int fi, int fo, const char *mfscopy)
 #ifndef STANDALONE
                        get_memleft();
 #endif
-                       if ((u_long)fssize * (u_long)sectorsize >
-                           (memleft - 131072))
+                       if (fssize * (u_long)sectorsize > (memleft - 131072))
                                fssize = (memleft - 131072) / sectorsize;
                        if ((membase = malloc(fssize * sectorsize)) == NULL)
                                errx(13, "malloc failed");
@@ -269,8 +268,8 @@ mkfs(char *fsys, int fi, int fo, const char *mfscopy)
         * Validate the given file system size.
         * Verify that its last block can actually be accessed.
         */
-       if (fssize <= 0)
-               printf("preposterous size %d\n", fssize), exit(13);
+       if (fssize == 0)
+               printf("preposterous size %lu\n", fssize), exit(13);
        wtfs(fssize - (realsectorsize / DEV_BSIZE), realsectorsize,
                 (char *)&sblock);
        /*
@@ -530,7 +529,7 @@ mkfs(char *fsys, int fi, int fo, const char *mfscopy)
         */
        sblock.fs_size = fssize = dbtofsb(&sblock, fssize);
        sblock.fs_ncyl = fssize * NSPF(&sblock) / sblock.fs_spc;
-       if (fssize * NSPF(&sblock) > sblock.fs_ncyl * sblock.fs_spc) {
+       if ((long)fssize * NSPF(&sblock) > sblock.fs_ncyl * sblock.fs_spc) {
                sblock.fs_ncyl++;
                emitwarn = 1;
        }
@@ -647,7 +646,7 @@ next:
                emitwarn = 0;
        }
        if (emitwarn && !mfs) {
-               printf("Warning: %d sector(s) in last cylinder unallocated\n",
+               printf("Warning: %lu sector(s) in last cylinder unallocated\n",
                    sblock.fs_spc -
                    (fssize * NSPF(&sblock) - (sblock.fs_ncyl - 1)
                    * sblock.fs_spc));
index d80a202..c7a423b 100644 (file)
@@ -161,7 +161,7 @@ int Nflag;                  /* run without writing file system */
 int    Oflag;                  /* format as an 4.3BSD file system */
 int    Cflag;                  /* copy underlying filesystem (mfs only) */
 int    Uflag;                  /* enable soft updates for file system */
-int    fssize;                 /* file system size */
+u_long fssize;                 /* file system size */
 int    ntracks = NTRACKS;      /* # tracks/cylinder */
 int    nsectors = NSECTORS;    /* # sectors/track */
 int    nphyssectors;           /* # sectors/track including spares */
@@ -342,7 +342,16 @@ main(int argc, char **argv)
                                fatal("%s: bad revolutions/minute", optarg);
                        break;
                case 's':
-                       if ((fssize = atoi(optarg)) <= 0)
+                       /*
+                        * Unsigned long but limit to long.  On 32 bit a
+                        * tad under 2G, on 64 bit the upper bound is more
+                        * swap space then operand size.
+                        *
+                        * NOTE: fssize is converted from 512 byte sectors
+                        * to filesystem block-sized sectors by mkfs XXX.
+                        */
+                       fssize = strtoul(optarg, NULL, 10);
+                       if (fssize == 0 || fssize > LONG_MAX)
                                fatal("%s: bad file system size", optarg);
                        break;
                case 't':
@@ -495,7 +504,7 @@ main(int argc, char **argv)
 havelabel:
        if (fssize == 0)
                fssize = geom.d_media_blocks;
-       if ((uint32_t)fssize > geom.d_media_blocks && !mfs) {
+       if ((u_long)fssize > geom.d_media_blocks && !mfs) {
               fatal("%s: maximum file system size is %lld blocks",
                     argv[0], geom.d_media_blocks);
        }
@@ -591,6 +600,9 @@ havelabel:
        /*
         * NOTE: Newfs no longer accesses or attempts to update the
         * filesystem disklabel.
+        *
+        * NOTE: fssize is converted from 512 byte sectors
+        * to filesystem block-sized sectors by mkfs XXX.
         */
        if (!Nflag)
                close(fso);
@@ -610,7 +622,7 @@ havelabel:
                else
                        args.export.ex_flags = 0;
                args.base = membase;
-               args.size = fssize * sectorsize;
+               args.size = fssize * fsize;
 
                error = getvfsbyname("mfs", &vfc);
                if (error && vfsisloadable("mfs")) {
@@ -645,7 +657,7 @@ static void
 mfsintr(__unused int signo)
 {
        if (filename)
-               munmap(membase, fssize * sectorsize);
+               munmap(membase, fssize * fsize);
 #if 0
        remove(mfsdevname);
 #endif