aboutsummaryrefslogtreecommitdiff
path: root/sbin
diff options
context:
space:
mode:
authorKirk McKusick <mckusick@FreeBSD.org>2018-01-17 17:58:24 +0000
committerKirk McKusick <mckusick@FreeBSD.org>2018-01-17 17:58:24 +0000
commit72f854ce8f359100d957a07da44ae98591d3dfd9 (patch)
tree6603c949e870e1510902951cb2391e730e174006 /sbin
parent64e12b4140ffeaea04b7230d506ee0326e3b077d (diff)
downloadsrc-72f854ce8f359100d957a07da44ae98591d3dfd9.tar.gz
src-72f854ce8f359100d957a07da44ae98591d3dfd9.zip
Correct fsck journal-recovery code to update a cylinder-group
check-hash after making changes to the cylinder group. The problem was that the journal-recovery code was calling the libufs bwrite() function instead of the cgput() function. The cgput() function updates the cylinder-group check-hash before writing the cylinder group. This change required the additions of the cgget() and cgput() functions to the libufs API to avoid a gratuitous bcopy of every cylinder group to be read or written. These new functions have been added to the libufs manual pages. This was the first opportunity that I have had to use and document the use of the EDOOFUS error code. Reviewed by: kib Reported by: emaste and others
Notes
Notes: svn path=/head/; revision=328092
Diffstat (limited to 'sbin')
-rw-r--r--sbin/fsck_ffs/gjournal.c11
-rw-r--r--sbin/fsck_ffs/suj.c3
2 files changed, 5 insertions, 9 deletions
diff --git a/sbin/fsck_ffs/gjournal.c b/sbin/fsck_ffs/gjournal.c
index ea972dafe916..06505f250f87 100644
--- a/sbin/fsck_ffs/gjournal.c
+++ b/sbin/fsck_ffs/gjournal.c
@@ -134,9 +134,8 @@ getcg(int cg)
if (cgc == NULL)
err(1, "malloc(%zu)", sizeof(*cgc));
}
- if (cgread1(disk, cg) == -1)
- err(1, "cgread1(%d)", cg);
- bcopy(&disk->d_cg, &cgc->cgc_cg, sizeof(cgc->cgc_union));
+ if (cgget(disk, cg, &cgc->cgc_cg) == -1)
+ err(1, "cgget(%d)", cg);
cgc->cgc_busy = 0;
cgc->cgc_dirty = 0;
LIST_INSERT_HEAD(&cglist, cgc, cgc_next);
@@ -191,10 +190,8 @@ putcgs(void)
LIST_REMOVE(cgc, cgc_next);
ncgs--;
if (cgc->cgc_dirty) {
- bcopy(&cgc->cgc_cg, &disk->d_cg,
- sizeof(cgc->cgc_union));
- if (cgwrite1(disk, cgc->cgc_cg.cg_cgx) == -1)
- err(1, "cgwrite1(%d)", cgc->cgc_cg.cg_cgx);
+ if (cgput(disk, &cgc->cgc_cg) == -1)
+ err(1, "cgput(%d)", cgc->cgc_cg.cg_cgx);
//printf("%s: Wrote cg=%d\n", __func__,
// cgc->cgc_cg.cg_cgx);
}
diff --git a/sbin/fsck_ffs/suj.c b/sbin/fsck_ffs/suj.c
index 69ed3d5e59ac..186697c03103 100644
--- a/sbin/fsck_ffs/suj.c
+++ b/sbin/fsck_ffs/suj.c
@@ -1892,8 +1892,7 @@ cg_write(struct suj_cg *sc)
* before writing the block.
*/
fs->fs_cs(fs, sc->sc_cgx) = cgp->cg_cs;
- if (bwrite(disk, fsbtodb(fs, cgtod(fs, sc->sc_cgx)), sc->sc_cgbuf,
- fs->fs_bsize) == -1)
+ if (cgput(disk, cgp) == -1)
err_suj("Unable to write cylinder group %d\n", sc->sc_cgx);
}