summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
Diffstat (limited to 'sbin')
-rw-r--r--sbin/newfs/mkfs.c38
-rw-r--r--sbin/newfs/newfs.c6
2 files changed, 29 insertions, 15 deletions
diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c
index 837f608..625efb5 100644
--- a/sbin/newfs/mkfs.c
+++ b/sbin/newfs/mkfs.c
@@ -136,19 +136,6 @@ mkfs(struct partition *pp, char *fsys)
randinit = 1;
srandomdev();
}
- /*
- * allocate space for superblock, cylinder group map, and
- * two sets of inode blocks.
- */
- if (bsize < SBLOCKSIZE)
- iobufsize = SBLOCKSIZE + 3 * bsize;
- else
- iobufsize = 4 * bsize;
- if ((iobuf = malloc(iobufsize)) == 0) {
- printf("Cannot allocate I/O buffer\n");
- exit(38);
- }
- bzero(iobuf, iobufsize);
sblock.fs_old_flags = FS_FLAGS_UPDATED;
sblock.fs_flags = 0;
if (Uflag)
@@ -195,11 +182,21 @@ mkfs(struct partition *pp, char *fsys)
sblock.fs_fsize, sectorsize);
sblock.fs_fsize = sectorsize;
}
+ if (sblock.fs_bsize > MAXBSIZE) {
+ printf("decreasing block size from %d to maximum (%d)\n",
+ sblock.fs_bsize, MAXBSIZE);
+ sblock.fs_bsize = MAXBSIZE;
+ }
if (sblock.fs_bsize < MINBSIZE) {
printf("increasing block size from %d to minimum (%d)\n",
sblock.fs_bsize, MINBSIZE);
sblock.fs_bsize = MINBSIZE;
}
+ if (sblock.fs_fsize > MAXBSIZE) {
+ printf("decreasing fragment size from %d to maximum (%d)\n",
+ sblock.fs_fsize, MAXBSIZE);
+ sblock.fs_fsize = MAXBSIZE;
+ }
if (sblock.fs_bsize < sblock.fs_fsize) {
printf("increasing block size from %d to fragment size (%d)\n",
sblock.fs_bsize, sblock.fs_fsize);
@@ -297,7 +294,7 @@ mkfs(struct partition *pp, char *fsys)
*/
origdensity = density;
for (;;) {
- fragsperinode = numfrags(&sblock, density);
+ fragsperinode = MAX(numfrags(&sblock, density), 1);
minfpg = fragsperinode * INOPB(&sblock);
if (minfpg > sblock.fs_size)
minfpg = sblock.fs_size;
@@ -444,6 +441,19 @@ mkfs(struct partition *pp, char *fsys)
i = 0;
width = charsperline();
/*
+ * allocate space for superblock, cylinder group map, and
+ * two sets of inode blocks.
+ */
+ if (sblock.fs_bsize < SBLOCKSIZE)
+ iobufsize = SBLOCKSIZE + 3 * sblock.fs_bsize;
+ else
+ iobufsize = 4 * sblock.fs_bsize;
+ if ((iobuf = malloc(iobufsize)) == 0) {
+ printf("Cannot allocate I/O buffer\n");
+ exit(38);
+ }
+ bzero(iobuf, iobufsize);
+ /*
* Make a copy of the superblock into the buffer that we will be
* writing out in each cylinder group.
*/
diff --git a/sbin/newfs/newfs.c b/sbin/newfs/newfs.c
index 8b03e94..50034a2 100644
--- a/sbin/newfs/newfs.c
+++ b/sbin/newfs/newfs.c
@@ -187,7 +187,11 @@ main(int argc, char *argv[])
break;
case 'b':
if ((bsize = atoi(optarg)) < MINBSIZE)
- errx(1, "%s: bad block size", optarg);
+ errx(1, "%s: block size too small, min is %d",
+ optarg, MINBSIZE);
+ if (bsize > MAXBSIZE)
+ errx(1, "%s: block size too large, max is %d",
+ optarg, MAXBSIZE);
break;
case 'c':
if ((maxblkspercg = atoi(optarg)) <= 0)
OpenPOWER on IntegriCloud