]> Zhao Yanbai Git Server - minix.git/commitdiff
check for devices that would need more blocks than 32
authorBen Gras <ben@minix3.org>
Thu, 5 Feb 2009 16:30:20 +0000 (16:30 +0000)
committerBen Gras <ben@minix3.org>
Thu, 5 Feb 2009 16:30:20 +0000 (16:30 +0000)
bits allow..

commands/simple/mkfs.c

index ef29539ca68f914a58eaf2ba5683da902982a3f2..9d0d91e0545106443460334544b2c0fc25165812 100755 (executable)
@@ -266,20 +266,12 @@ char *argv[];
                if (blocks == 0) pexit("Can't open prototype file");
        }
        if (i == 0) {
-               int kb;
-               kb = blocks * (max(block_size,1024) / 1024);
-               /* The default for inodes is 2 blocks per kb, rounded up
-                * to fill an inode block.  Above 20M, the average files are
-                * sure to be larger because it is hard to fill up 20M with
-                * tiny files, so reduce the default number of inodes.  This
-                * default can always be overridden by using the '-i option.
-                */
-               i = kb / 2;
-               if (kb >= 20000) i = kb / 3;
-               if (kb >= 40000) i = kb / 4;
-               if (kb >= 60000) i = kb / 5;
-               if (kb >= 80000) i = kb / 6;
-               if (kb >= 100000) i = kb / 7;
+               i = blocks / 2;
+               if (blocks >= 20000) i = blocks / 3;
+               if (blocks >= 40000) i = blocks / 4;
+               if (blocks >= 60000) i = blocks / 5;
+               if (blocks >= 80000) i = blocks / 6;
+               if (blocks >= 100000) i = blocks / 7;
 
                /* round up to fill inode block */
                i += inodes_per_block - 1;
@@ -392,6 +384,8 @@ char *device;
   struct partition entry;
   block_t d;
   struct stat st;
+  unsigned int rem;
+  u64_t resize;
 
   if ((fd = open(device, O_RDONLY)) == -1) {
        if (errno != ENOENT)
@@ -410,6 +404,14 @@ char *device;
   }
   close(fd);
   d = div64u(entry.size, block_size);
+  rem = rem64u(entry.size, block_size);
+
+  resize = add64u(mul64u(d, block_size), rem);
+  if(cmp64(resize, entry.size) != 0) {
+       d = ULONG_MAX;
+       fprintf(stderr, "mkfs: truncating FS at %lu blocks\n", d);
+  }
+
   return d;
 }