svn commit: r328821 - head/sbin/newfs

Kirk McKusick mckusick at FreeBSD.org
Fri Feb 2 23:26:53 UTC 2018


Author: mckusick
Date: Fri Feb  2 23:26:52 2018
New Revision: 328821
URL: https://svnweb.freebsd.org/changeset/base/328821

Log:
  Check and report error returns from sbput(3) calls.
  Convert to using cgput(3) for writing cylinder groups.
  Check and report error returns from cgput(3).
  
  Submitted by: Bruce Evans <bde at freebsd.org>

Modified:
  head/sbin/newfs/mkfs.c

Modified: head/sbin/newfs/mkfs.c
==============================================================================
--- head/sbin/newfs/mkfs.c	Fri Feb  2 23:22:58 2018	(r328820)
+++ head/sbin/newfs/mkfs.c	Fri Feb  2 23:26:52 2018	(r328821)
@@ -101,7 +101,6 @@ static void iput(union dinode *, ino_t);
 static int makedir(struct direct *, int);
 static void setblock(struct fs *, unsigned char *, int);
 static void wtfs(ufs2_daddr_t, int, char *);
-static void cgckhash(struct cg *);
 static u_int32_t newfs_random(void);
 
 void
@@ -520,24 +519,27 @@ restart:
 	 * Wipe out old UFS1 superblock(s) if necessary.
 	 */
 	if (!Nflag && Oflag != 1 && realsectorsize <= SBLOCK_UFS1) {
-		i = bread(&disk, part_ofs + SBLOCK_UFS1 / disk.d_bsize, chdummy, SBLOCKSIZE);
+		i = bread(&disk, part_ofs + SBLOCK_UFS1 / disk.d_bsize, chdummy,
+		    SBLOCKSIZE);
 		if (i == -1)
-			err(1, "can't read old UFS1 superblock: %s", disk.d_error);
+			err(1, "can't read old UFS1 superblock: %s",
+			    disk.d_error);
 
 		if (fsdummy.fs_magic == FS_UFS1_MAGIC) {
 			fsdummy.fs_magic = 0;
 			bwrite(&disk, part_ofs + SBLOCK_UFS1 / disk.d_bsize,
 			    chdummy, SBLOCKSIZE);
 			for (cg = 0; cg < fsdummy.fs_ncg; cg++) {
-				if (fsbtodb(&fsdummy, cgsblock(&fsdummy, cg)) > fssize)
+				if (fsbtodb(&fsdummy, cgsblock(&fsdummy, cg)) >
+				    fssize)
 					break;
 				bwrite(&disk, part_ofs + fsbtodb(&fsdummy,
 				  cgsblock(&fsdummy, cg)), chdummy, SBLOCKSIZE);
 			}
 		}
 	}
-	if (!Nflag)
-		sbput(disk.d_fd, &disk.d_fs, 0);
+	if (!Nflag && sbput(disk.d_fd, &disk.d_fs, 0) != 0)
+		err(1, "sbput: %s", disk.d_error);
 	if (Xflag == 1) {
 		printf("** Exiting on Xflag 1\n");
 		exit(0);
@@ -555,10 +557,9 @@ restart:
 	i = 0;
 	width = charsperline();
 	/*
-	 * Allocate space for cylinder group map and
-	 * two sets of inode blocks.
+	 * Allocate space for two sets of inode blocks.
 	 */
-	iobufsize = 3 * sblock.fs_bsize;
+	iobufsize = 2 * sblock.fs_bsize;
 	if ((iobuf = calloc(1, iobufsize)) == 0) {
 		printf("Cannot allocate I/O buffer\n");
 		exit(38);
@@ -604,7 +605,8 @@ restart:
 	 * Reference the summary information so it will also be written.
 	 */
 	sblock.fs_csp = fscs;
-	sbput(disk.d_fd, &disk.d_fs, 0);
+	if (sbput(disk.d_fd, &disk.d_fs, 0) != 0)
+		err(1, "sbput: %s", disk.d_error);
 	/*
 	 * For UFS1 filesystems with a blocksize of 64K, the first
 	 * alternate superblock resides at the location used for
@@ -788,7 +790,6 @@ initcg(int cylno, time_t utime)
 		}
 	}
 	*cs = acg.cg_cs;
-	cgckhash(&acg);
 	/*
 	 * Write out the duplicate super block. Then write the cylinder
 	 * group map and two blocks worth of inodes in a single write.
@@ -796,11 +797,12 @@ initcg(int cylno, time_t utime)
 	savedactualloc = sblock.fs_sblockactualloc;
 	sblock.fs_sblockactualloc =
 	    dbtob(fsbtodb(&sblock, cgsblock(&sblock, cylno)));
-	sbput(disk.d_fd, &disk.d_fs, 0);
+	if (sbput(disk.d_fd, &disk.d_fs, 0) != 0)
+		err(1, "sbput: %s", disk.d_error);
 	sblock.fs_sblockactualloc = savedactualloc;
+	if (cgput(&disk, &acg) != 0)
+		err(1, "initcg: cgput: %s", disk.d_error);
 	start = 0;
-	bcopy((char *)&acg, &iobuf[start], sblock.fs_cgsize);
-	start += sblock.fs_bsize;
 	dp1 = (struct ufs1_dinode *)(&iobuf[start]);
 	dp2 = (struct ufs2_dinode *)(&iobuf[start]);
 	for (i = 0; i < acg.cg_initediblk; i++) {
@@ -812,7 +814,7 @@ initcg(int cylno, time_t utime)
 			dp2++;
 		}
 	}
-	wtfs(fsbtodb(&sblock, cgtod(&sblock, cylno)), iobufsize, iobuf);
+	wtfs(fsbtodb(&sblock, cgimin(&sblock, cylno)), iobufsize, iobuf);
 	/*
 	 * For the old file system, we have to initialize all the inodes.
 	 */
@@ -1008,10 +1010,8 @@ goth:
 		for (i = frag; i < sblock.fs_frag; i++)
 			setbit(cg_blksfree(&acg), d + i);
 	}
-	/* XXX cgwrite(&disk, 0)??? */
-	cgckhash(&acg);
-	wtfs(fsbtodb(&sblock, cgtod(&sblock, 0)), sblock.fs_cgsize,
-	    (char *)&acg);
+	if (cgput(&disk, &acg) != 0)
+		err(1, "alloc: cgput: %s", disk.d_error);
 	return ((ufs2_daddr_t)d);
 }
 
@@ -1031,9 +1031,8 @@ iput(union dinode *ip, ino_t ino)
 	}
 	acg.cg_cs.cs_nifree--;
 	setbit(cg_inosused(&acg), ino);
-	cgckhash(&acg);
-	wtfs(fsbtodb(&sblock, cgtod(&sblock, 0)), sblock.fs_cgsize,
-	    (char *)&acg);
+	if (cgput(&disk, &acg) != 0)
+		err(1, "iput: cgput: %s", disk.d_error);
 	sblock.fs_cstotal.cs_nifree--;
 	fscs[0].cs_nifree--;
 	if (ino >= (unsigned long)sblock.fs_ipg * sblock.fs_ncg) {
@@ -1062,20 +1061,6 @@ wtfs(ufs2_daddr_t bno, int size, char *bf)
 		return;
 	if (bwrite(&disk, part_ofs + bno, bf, size) < 0)
 		err(36, "wtfs: %d bytes at sector %jd", size, (intmax_t)bno);
-}
-
-/*
- * Calculate the check-hash of the cylinder group.
- */
-static void
-cgckhash(cgp)
-	struct cg *cgp;
-{
-
-	if ((sblock.fs_metackhash & CK_CYLGRP) == 0)
-		return;
-	cgp->cg_ckhash = 0;
-	cgp->cg_ckhash = calculate_crc32c(~0L, (void *)cgp, sblock.fs_cgsize);
 }
 
 /*


More information about the svn-src-head mailing list