From a96941dd51230f3b73457f2aec633a0df6da5b4c Mon Sep 17 00:00:00 2001 From: mckusick Date: Fri, 2 Feb 2018 23:26:52 +0000 Subject: [PATCH] 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 --- sbin/newfs/mkfs.c | 57 +++++++++++++++++------------------------------ 1 file changed, 21 insertions(+), 36 deletions(-) diff --git a/sbin/newfs/mkfs.c b/sbin/newfs/mkfs.c index c381134bee6d..1a2993a205b9 100644 --- a/sbin/newfs/mkfs.c +++ b/sbin/newfs/mkfs.c @@ -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 @@ mkfs(struct partition *pp, char *fsys) * 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 @@ mkfs(struct partition *pp, char *fsys) 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 @@ mkfs(struct partition *pp, char *fsys) * 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 @@ alloc(int size, int mode) 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) { @@ -1064,20 +1063,6 @@ wtfs(ufs2_daddr_t bno, int size, char *bf) 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); -} - /* * check if a block is available */