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 <b...@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);
 }
 
 /*
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to