Module Name: src Committed By: dholland Date: Wed Aug 12 18:26:27 UTC 2015
Modified Files: src/libexec/lfs_cleanerd: lfs_cleanerd.c src/sbin/fsck_lfs: lfs.c lfs_user.h pass6.c segwrite.c setup.c src/sys/ufs/lfs: lfs.h lfs_accessors.h lfs_pages.c lfs_rfw.c lfs_segment.c lfs_vfsops.c lfs_vnops.c src/usr.sbin/dumplfs: dumplfs.c Log Message: Make 32-bit and 64-bit versions of SEGSUM. Also fix some of the FINFO handling as it's closely entangled. To generate a diff of this commit: cvs rdiff -u -r1.47 -r1.48 src/libexec/lfs_cleanerd/lfs_cleanerd.c cvs rdiff -u -r1.53 -r1.54 src/sbin/fsck_lfs/lfs.c cvs rdiff -u -r1.7 -r1.8 src/sbin/fsck_lfs/lfs_user.h cvs rdiff -u -r1.39 -r1.40 src/sbin/fsck_lfs/pass6.c cvs rdiff -u -r1.38 -r1.39 src/sbin/fsck_lfs/segwrite.c cvs rdiff -u -r1.52 -r1.53 src/sbin/fsck_lfs/setup.c cvs rdiff -u -r1.176 -r1.177 src/sys/ufs/lfs/lfs.h cvs rdiff -u -r1.10 -r1.11 src/sys/ufs/lfs/lfs_accessors.h cvs rdiff -u -r1.6 -r1.7 src/sys/ufs/lfs/lfs_pages.c cvs rdiff -u -r1.26 -r1.27 src/sys/ufs/lfs/lfs_rfw.c cvs rdiff -u -r1.253 -r1.254 src/sys/ufs/lfs/lfs_segment.c cvs rdiff -u -r1.337 -r1.338 src/sys/ufs/lfs/lfs_vfsops.c cvs rdiff -u -r1.284 -r1.285 src/sys/ufs/lfs/lfs_vnops.c cvs rdiff -u -r1.51 -r1.52 src/usr.sbin/dumplfs/dumplfs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/libexec/lfs_cleanerd/lfs_cleanerd.c diff -u src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.47 src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.48 --- src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.47 Wed Aug 12 18:25:51 2015 +++ src/libexec/lfs_cleanerd/lfs_cleanerd.c Wed Aug 12 18:26:26 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_cleanerd.c,v 1.47 2015/08/12 18:25:51 dholland Exp $ */ +/* $NetBSD: lfs_cleanerd.c,v 1.48 2015/08/12 18:26:26 dholland Exp $ */ /*- * Copyright (c) 2005 The NetBSD Foundation, Inc. @@ -423,6 +423,7 @@ parse_pseg(struct clfs *fs, daddr_t dadd struct ulfs1_dinode *dip; u_int32_t ck, vers; int fic, inoc, obic; + size_t sumstart; int i; char *cp; @@ -438,22 +439,23 @@ parse_pseg(struct clfs *fs, daddr_t dadd ssp = (SEGSUM *)cp; /* XXX ondisk32 */ iaddrp = ((int32_t *)(cp + lfs_sb_getibsize(fs))) - 1; - fip = (FINFO *)(cp + sizeof(SEGSUM)); + fip = SEGSUM_FINFOBASE(fs, cp); /* * Check segment header magic and checksum */ - if (ssp->ss_magic != SS_MAGIC) { + if (lfs_ss_getmagic(fs, ssp) != SS_MAGIC) { syslog(LOG_WARNING, "%s: sumsum magic number bad at 0x%jx:" " read 0x%x, expected 0x%x", lfs_sb_getfsmnt(fs), - (intmax_t)daddr, ssp->ss_magic, SS_MAGIC); + (intmax_t)daddr, lfs_ss_getmagic(fs, ssp), SS_MAGIC); return 0x0; } - ck = cksum(&ssp->ss_datasum, lfs_sb_getsumsize(fs) - sizeof(ssp->ss_sumsum)); - if (ck != ssp->ss_sumsum) { + sumstart = lfs_ss_getsumstart(fs); + ck = cksum((char *)ssp + sumstart, lfs_sb_getsumsize(fs) - sumstart); + if (ck != lfs_ss_getsumsum(fs, ssp)) { syslog(LOG_WARNING, "%s: sumsum checksum mismatch at 0x%jx:" " read 0x%x, computed 0x%x", lfs_sb_getfsmnt(fs), - (intmax_t)daddr, ssp->ss_sumsum, ck); + (intmax_t)daddr, lfs_ss_getsumsum(fs, ssp), ck); return 0x0; } @@ -469,12 +471,12 @@ parse_pseg(struct clfs *fs, daddr_t dadd * as we go. */ fic = inoc = 0; - while (fic < ssp->ss_nfinfo || inoc < ssp->ss_ninos) { + while (fic < lfs_ss_getnfinfo(fs, ssp) || inoc < lfs_ss_getninos(fs, ssp)) { /* * We must have either a file block or an inode block. * If we don't have either one, it's an error. */ - if (fic >= ssp->ss_nfinfo && *iaddrp != daddr) { + if (fic >= lfs_ss_getnfinfo(fs, ssp) && *iaddrp != daddr) { syslog(LOG_WARNING, "%s: bad pseg at %jx (seg %d)", lfs_sb_getfsmnt(fs), (intmax_t)odaddr, lfs_dtosn(fs, odaddr)); *bipp = bip; @@ -484,7 +486,7 @@ parse_pseg(struct clfs *fs, daddr_t dadd /* * Note each inode from the inode blocks */ - if (inoc < ssp->ss_ninos && *iaddrp == daddr) { + if (inoc < lfs_ss_getninos(fs, ssp) && *iaddrp == daddr) { cp = fd_ptrget(fs->clfs_devvp, daddr); ck = lfs_cksum_part(cp, sizeof(u_int32_t), ck); dip = (struct ulfs1_dinode *)cp; @@ -519,7 +521,7 @@ parse_pseg(struct clfs *fs, daddr_t dadd bip[*bic - 1].bi_inode = dip[i].di_inumber; bip[*bic - 1].bi_lbn = LFS_UNUSED_LBN; bip[*bic - 1].bi_daddr = daddr; - bip[*bic - 1].bi_segcreate = ssp->ss_create; + bip[*bic - 1].bi_segcreate = lfs_ss_getcreate(fs, ssp); bip[*bic - 1].bi_version = dip[i].di_gen; bip[*bic - 1].bi_bp = &(dip[i]); bip[*bic - 1].bi_size = LFS_DINODE1_SIZE; @@ -533,7 +535,7 @@ parse_pseg(struct clfs *fs, daddr_t dadd /* * Note each file block from the finfo blocks */ - if (fic >= ssp->ss_nfinfo) + if (fic >= lfs_ss_getnfinfo(fs, ssp)) continue; /* Count this finfo, whether or not we use it */ @@ -603,7 +605,7 @@ parse_pseg(struct clfs *fs, daddr_t dadd bip[*bic + i].bi_inode = fip->fi_ino; bip[*bic + i].bi_lbn = fip->fi_blocks[i]; bip[*bic + i].bi_daddr = daddr; - bip[*bic + i].bi_segcreate = ssp->ss_create; + bip[*bic + i].bi_segcreate = lfs_ss_getcreate(fs, ssp); bip[*bic + i].bi_version = fip->fi_version; bip[*bic + i].bi_size = (i == fip->fi_nblocks - 1) ? fip->fi_lastlength : lfs_sb_getbsize(fs); @@ -617,15 +619,15 @@ parse_pseg(struct clfs *fs, daddr_t dadd #endif } *bic += fip->fi_nblocks; - fip = (FINFO *)(fip->fi_blocks + fip->fi_nblocks); + fip = NEXT_FINFO(fs, fip); } #ifndef REPAIR_ZERO_FINFO - if (ssp->ss_datasum != ck) { + if (lfs_ss_getdatasum(fs, ssp) != ck) { syslog(LOG_WARNING, "%s: data checksum bad at 0x%jx:" " read 0x%x, computed 0x%x", lfs_sb_getfsmnt(fs), (intmax_t)odaddr, - ssp->ss_datasum, ck); + lfs_ss_getdatasum(fs, ssp), ck); *bic = obic; return 0x0; } Index: src/sbin/fsck_lfs/lfs.c diff -u src/sbin/fsck_lfs/lfs.c:1.53 src/sbin/fsck_lfs/lfs.c:1.54 --- src/sbin/fsck_lfs/lfs.c:1.53 Wed Aug 12 18:25:52 2015 +++ src/sbin/fsck_lfs/lfs.c Wed Aug 12 18:26:26 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs.c,v 1.53 2015/08/12 18:25:52 dholland Exp $ */ +/* $NetBSD: lfs.c,v 1.54 2015/08/12 18:26:26 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. * All rights reserved. @@ -611,28 +611,29 @@ try_verify(struct lfs *osb, struct uvnod /* * Check for a valid segment summary belonging to our fs. */ - if (sp->ss_magic != SS_MAGIC || - sp->ss_ident != lfs_sb_getident(osb) || - sp->ss_serial < serial || /* XXX strengthen this */ - sp->ss_sumsum != cksum(&sp->ss_datasum, lfs_sb_getsumsize(osb) - - sizeof(sp->ss_sumsum))) { + if (lfs_ss_getmagic(osb, sp) != SS_MAGIC || + lfs_ss_getident(osb, sp) != lfs_sb_getident(osb) || + lfs_ss_getserial(osb, sp) < serial || /* XXX strengthen this */ + lfs_ss_getsumsum(osb, sp) != + cksum((char *)sp + lfs_ss_getsumstart(osb), + lfs_sb_getsumsize(osb) - lfs_ss_getsumstart(osb))) { brelse(bp, 0); if (debug) { - if (sp->ss_magic != SS_MAGIC) + if (lfs_ss_getmagic(osb, sp) != SS_MAGIC) pwarn("pseg at 0x%jx: " "wrong magic number\n", (uintmax_t)daddr); - else if (sp->ss_ident != lfs_sb_getident(osb)) + else if (lfs_ss_getident(osb, sp) != lfs_sb_getident(osb)) pwarn("pseg at 0x%jx: " "expected ident %jx, got %jx\n", (uintmax_t)daddr, - (uintmax_t)sp->ss_ident, + (uintmax_t)lfs_ss_getident(osb, sp), (uintmax_t)lfs_sb_getident(osb)); - else if (sp->ss_serial >= serial) + else if (lfs_ss_getserial(osb, sp) >= serial) pwarn("pseg at 0x%jx: " "serial %d < %d\n", (uintmax_t)daddr, - (int)sp->ss_serial, (int)serial); + (int)lfs_ss_getserial(osb, sp), (int)serial); else pwarn("pseg at 0x%jx: " "summary checksum wrong\n", @@ -640,9 +641,9 @@ try_verify(struct lfs *osb, struct uvnod } break; } - if (debug && sp->ss_serial != serial) + if (debug && lfs_ss_getserial(osb, sp) != serial) pwarn("warning, serial=%d ss_serial=%d\n", - (int)serial, (int)sp->ss_serial); + (int)serial, (int)lfs_ss_getserial(osb, sp)); ++serial; bc = check_summary(osb, sp, daddr, debug, devvp, NULL); if (bc == 0) { @@ -651,14 +652,14 @@ try_verify(struct lfs *osb, struct uvnod } if (debug) pwarn("summary good: 0x%x/%d\n", (uintmax_t)daddr, - (int)sp->ss_serial); + (int)lfs_ss_getserial(osb, sp)); assert (bc > 0); odaddr = daddr; daddr += lfs_btofsb(osb, lfs_sb_getsumsize(osb) + bc); if (lfs_dtosn(osb, odaddr) != lfs_dtosn(osb, daddr) || lfs_dtosn(osb, daddr) != lfs_dtosn(osb, daddr + lfs_btofsb(osb, lfs_sb_getsumsize(osb) + lfs_sb_getbsize(osb)) - 1)) { - daddr = sp->ss_next; + daddr = lfs_ss_getnext(osb, sp); } /* @@ -668,9 +669,9 @@ try_verify(struct lfs *osb, struct uvnod * to roll forward through them. Likewise, psegs written * by a previous roll-forward attempt are not interesting. */ - if (sp->ss_flags & (SS_CLEAN | SS_RFW)) + if (lfs_ss_getflags(osb, sp) & (SS_CLEAN | SS_RFW)) hitclean = 1; - if (hitclean == 0 && (sp->ss_flags & SS_CONT) == 0) + if (hitclean == 0 && (lfs_ss_getflags(osb, sp) & SS_CONT) == 0) nodirop_daddr = daddr; brelse(bp, 0); @@ -761,17 +762,17 @@ check_summary(struct lfs *fs, SEGSUM *sp /* We've already checked the sumsum, just do the data bounds and sum */ /* Count the blocks. */ - nblocks = howmany(sp->ss_ninos, LFS_INOPB(fs)); + nblocks = howmany(lfs_ss_getninos(fs, sp), LFS_INOPB(fs)); bc = nblocks << (lfs_sb_getversion(fs) > 1 ? lfs_sb_getffshift(fs) : lfs_sb_getbshift(fs)); assert(bc >= 0); - fp = (FINFO *) (sp + 1); - for (i = 0; i < sp->ss_nfinfo; i++) { + fp = SEGSUM_FINFOBASE(fs, sp); + for (i = 0; i < lfs_ss_getnfinfo(fs, sp); i++) { nblocks += fp->fi_nblocks; bc += fp->fi_lastlength + ((fp->fi_nblocks - 1) << lfs_sb_getbshift(fs)); assert(bc >= 0); - fp = (FINFO *) (fp->fi_blocks + fp->fi_nblocks); + fp = NEXT_FINFO(fs, fp); if (((char *)fp) - (char *)sp > lfs_sb_getsumsize(fs)) return 0; } @@ -786,17 +787,18 @@ check_summary(struct lfs *fs, SEGSUM *sp daddr = pseg_addr + lfs_btofsb(fs, lfs_sb_getsumsize(fs)); fp = (FINFO *) (sp + 1); for (i = 0, j = 0; - i < sp->ss_nfinfo || j < howmany(sp->ss_ninos, LFS_INOPB(fs)); i++) { - if (i >= sp->ss_nfinfo && *idp != daddr) { + i < lfs_ss_getnfinfo(fs, sp) || j < howmany(lfs_ss_getninos(fs, sp), LFS_INOPB(fs)); i++) { + if (i >= lfs_ss_getnfinfo(fs, sp) && *idp != daddr) { pwarn("Not enough inode blocks in pseg at 0x%" PRIx32 ": found %d, wanted %d\n", - pseg_addr, j, howmany(sp->ss_ninos, LFS_INOPB(fs))); + pseg_addr, j, howmany(lfs_ss_getninos(fs, sp), + LFS_INOPB(fs))); if (debug) pwarn("*idp=%x, daddr=%" PRIx32 "\n", *idp, daddr); break; } - while (j < howmany(sp->ss_ninos, LFS_INOPB(fs)) && *idp == daddr) { + while (j < howmany(lfs_ss_getninos(fs, sp), LFS_INOPB(fs)) && *idp == daddr) { bread(devvp, LFS_FSBTODB(fs, daddr), lfs_sb_getibsize(fs), 0, &bp); datap[datac++] = ((u_int32_t *) (bp->b_data))[0]; @@ -806,7 +808,7 @@ check_summary(struct lfs *fs, SEGSUM *sp daddr += lfs_btofsb(fs, lfs_sb_getibsize(fs)); --idp; } - if (i < sp->ss_nfinfo) { + if (i < lfs_ss_getnfinfo(fs, sp)) { if (func) func(daddr, fp); for (k = 0; k < fp->fi_nblocks; k++) { @@ -819,7 +821,7 @@ check_summary(struct lfs *fs, SEGSUM *sp brelse(bp, 0); daddr += lfs_btofsb(fs, len); } - fp = (FINFO *) (fp->fi_blocks + fp->fi_nblocks); + fp = NEXT_FINFO(fs, fp); } } @@ -827,12 +829,13 @@ check_summary(struct lfs *fs, SEGSUM *sp pwarn("Partial segment at 0x%jx expected %d blocks counted %d\n", (intmax_t)pseg_addr, nblocks, datac); } + /* XXX ondisk32 */ ccksum = cksum(datap, nblocks * sizeof(u_int32_t)); /* Check the data checksum */ - if (ccksum != sp->ss_datasum) { + if (ccksum != lfs_ss_getdatasum(fs, sp)) { pwarn("Partial segment at 0x%jx data checksum" " mismatch: given 0x%x, computed 0x%x\n", - (uintmax_t)pseg_addr, sp->ss_datasum, ccksum); + (uintmax_t)pseg_addr, lfs_ss_getdatasum(fs, sp), ccksum); free(datap); return 0; } Index: src/sbin/fsck_lfs/lfs_user.h diff -u src/sbin/fsck_lfs/lfs_user.h:1.7 src/sbin/fsck_lfs/lfs_user.h:1.8 --- src/sbin/fsck_lfs/lfs_user.h:1.7 Sun Jul 13 02:44:21 2014 +++ src/sbin/fsck_lfs/lfs_user.h Wed Aug 12 18:26:26 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_user.h,v 1.7 2014/07/13 02:44:21 dholland Exp $ */ +/* $NetBSD: lfs_user.h,v 1.8 2015/08/12 18:26:26 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. * All rights reserved. @@ -31,7 +31,8 @@ #include <stdarg.h> struct lfs; -struct segsum; +/* XXX do these really need to be here? */ +union segsum; struct finfo; /* @@ -85,7 +86,7 @@ int lfs_vop_bmap(struct uvnode *, daddr_ struct uvnode *lfs_raw_vget(struct lfs *, ino_t, int, ulfs_daddr_t); struct lfs *lfs_init(int, daddr_t, daddr_t, int, int); struct lfs *lfs_verify(struct lfs *, struct lfs *, struct uvnode *, int); -int check_summary(struct lfs *, struct segsum *, ulfs_daddr_t, int, struct uvnode *, void (*)(ulfs_daddr_t, struct finfo *)); +int check_summary(struct lfs *, union segsum *, ulfs_daddr_t, int, struct uvnode *, void (*)(ulfs_daddr_t, struct finfo *)); ulfs_daddr_t try_verify(struct lfs *, struct uvnode *, ulfs_daddr_t, int); struct ulfs1_dinode *lfs_ifind(struct lfs *, ino_t, struct ubuf *); void call_panic(const char *, ...); Index: src/sbin/fsck_lfs/pass6.c diff -u src/sbin/fsck_lfs/pass6.c:1.39 src/sbin/fsck_lfs/pass6.c:1.40 --- src/sbin/fsck_lfs/pass6.c:1.39 Wed Aug 12 18:25:52 2015 +++ src/sbin/fsck_lfs/pass6.c Wed Aug 12 18:26:26 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: pass6.c,v 1.39 2015/08/12 18:25:52 dholland Exp $ */ +/* $NetBSD: pass6.c,v 1.40 2015/08/12 18:26:26 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -618,8 +618,8 @@ pass6(void) sp = (SEGSUM *)bp->b_data; if (debug) pwarn("sum at 0x%x: ninos=%d nfinfo=%d\n", - (unsigned)daddr, (int)sp->ss_ninos, - (int)sp->ss_nfinfo); + (unsigned)daddr, (int)lfs_ss_getninos(fs, sp), + (int)lfs_ss_getnfinfo(fs, sp)); /* We have verified that this is a good summary. */ LFS_SEGENTRY(sup, fs, lfs_dtosn(fs, daddr), sbp); @@ -636,16 +636,16 @@ pass6(void) } /* Find inodes, look at generation number. */ - if (sp->ss_ninos) { + if (lfs_ss_getninos(fs, sp)) { LFS_SEGENTRY(sup, fs, lfs_dtosn(fs, daddr), sbp); - sup->su_ninos += howmany(sp->ss_ninos, LFS_INOPB(fs)); + sup->su_ninos += howmany(lfs_ss_getninos(fs, sp), LFS_INOPB(fs)); VOP_BWRITE(sbp); - lfs_sb_adddmeta(fs, lfs_btofsb(fs, howmany(sp->ss_ninos, + lfs_sb_adddmeta(fs, lfs_btofsb(fs, howmany(lfs_ss_getninos(fs, sp), LFS_INOPB(fs)) * lfs_sb_getibsize(fs))); } idaddrp = ((ulfs_daddr_t *)((char *)bp->b_data + lfs_sb_getsumsize(fs))); - for (i = 0; i < howmany(sp->ss_ninos, LFS_INOPB(fs)); i++) { + for (i = 0; i < howmany(lfs_ss_getninos(fs, sp), LFS_INOPB(fs)); i++) { ino_t *inums; inums = ecalloc(LFS_INOPB(fs) + 1, sizeof(*inums)); @@ -697,7 +697,7 @@ pass6(void) * loop. */ if (vp == NULL) { - if (!(sp->ss_flags & SS_DIROP)) + if (!(lfs_ss_getflags(fs, sp) & SS_DIROP)) pfatal("NEW FILE IN NON-DIROP PARTIAL SEGMENT"); else { inums[j++] = dp->di_inumber; @@ -712,7 +712,7 @@ pass6(void) */ if (vp && VTOI(vp)->i_ffs1_gen < dp->di_gen) { remove_ino(vp, dp->di_inumber); - if (!(sp->ss_flags & SS_DIROP)) + if (!(lfs_ss_getflags(fs, sp) & SS_DIROP)) pfatal("NEW FILE VERSION IN NON-DIROP PARTIAL SEGMENT"); else { inums[j++] = dp->di_inumber; @@ -770,21 +770,21 @@ pass6(void) bc = check_summary(fs, sp, daddr, debug, devvp, NULL); if (bc == 0) { pwarn("unexpected bad seg ptr at 0x%x with serial=%d\n", - (int)daddr, (int)sp->ss_serial); + (int)daddr, (int)lfs_ss_getserial(fs, sp)); brelse(bp, 0); break; } else { if (debug) pwarn("good seg ptr at 0x%x with serial=%d\n", - (int)daddr, (int)sp->ss_serial); - lastserial = sp->ss_serial; + (int)daddr, (int)lfs_ss_getserial(fs, sp)); + lastserial = lfs_ss_getserial(fs, sp); } odaddr = daddr; daddr += lfs_btofsb(fs, lfs_sb_getsumsize(fs) + bc); if (lfs_dtosn(fs, odaddr) != lfs_dtosn(fs, daddr) || lfs_dtosn(fs, daddr) != lfs_dtosn(fs, daddr + lfs_btofsb(fs, lfs_sb_getsumsize(fs) + lfs_sb_getbsize(fs)) - 1)) { - daddr = ((SEGSUM *)bp->b_data)->ss_next; + daddr = lfs_ss_getnext(fs, sp); } brelse(bp, 0); } @@ -845,7 +845,7 @@ pass6(void) bc = check_summary(fs, sp, daddr, debug, devvp, pass6harvest); if (bc == 0) { pwarn("unexpected bad seg ptr [2] at 0x%x with serial=%d\n", - (int)daddr, (int)sp->ss_serial); + (int)daddr, (int)lfs_ss_getserial(fs, sp)); brelse(bp, 0); break; } @@ -856,7 +856,7 @@ pass6(void) lfs_dtosn(fs, daddr) != lfs_dtosn(fs, daddr + lfs_btofsb(fs, lfs_sb_getsumsize(fs) + lfs_sb_getbsize(fs)) - 1)) { lfs_sb_subavail(fs, lfs_sntod(fs, lfs_dtosn(fs, daddr) + 1) - daddr); - daddr = ((SEGSUM *)bp->b_data)->ss_next; + daddr = lfs_ss_getnext(fs, sp); } LFS_CLEANERINFO(cip, fs, cbp); LFS_SYNC_CLEANERINFO(cip, fs, cbp, 0); Index: src/sbin/fsck_lfs/segwrite.c diff -u src/sbin/fsck_lfs/segwrite.c:1.38 src/sbin/fsck_lfs/segwrite.c:1.39 --- src/sbin/fsck_lfs/segwrite.c:1.38 Wed Aug 12 18:25:52 2015 +++ src/sbin/fsck_lfs/segwrite.c Wed Aug 12 18:26:27 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: segwrite.c,v 1.38 2015/08/12 18:25:52 dholland Exp $ */ +/* $NetBSD: segwrite.c,v 1.39 2015/08/12 18:26:27 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. * All rights reserved. @@ -152,6 +152,7 @@ lfs_segwrite(struct lfs * fs, int flags) struct inode *ip; struct segment *sp; struct uvnode *vp; + SEGSUM *ssp; int redo; lfs_seglock(fs, flags | SEGM_CKP); @@ -159,7 +160,8 @@ lfs_segwrite(struct lfs * fs, int flags) lfs_writevnodes(fs, sp, VN_REG); lfs_writevnodes(fs, sp, VN_DIROP); - ((SEGSUM *) (sp->segsum))->ss_flags &= ~(SS_CONT); + ssp = (SEGSUM *)sp->segsum; + lfs_ss_setflags(fs, ssp, lfs_ss_getflags(fs, ssp) & ~(SS_CONT)); do { vp = fs->lfs_ivnode; @@ -199,6 +201,7 @@ lfs_writefile(struct lfs * fs, struct se struct finfo *fip; struct inode *ip; IFILE *ifp; + SEGSUM *ssp; ip = VTOI(vp); @@ -207,10 +210,13 @@ lfs_writefile(struct lfs * fs, struct se (void) lfs_writeseg(fs, sp); sp->sum_bytes_left -= FINFOSIZE; - ++((SEGSUM *) (sp->segsum))->ss_nfinfo; + ssp = (SEGSUM *)sp->segsum; + lfs_ss_setnfinfo(fs, ssp, lfs_ss_getnfinfo(fs, ssp) + 1); - if (vp->v_uflag & VU_DIROP) - ((SEGSUM *) (sp->segsum))->ss_flags |= (SS_DIROP | SS_CONT); + if (vp->v_uflag & VU_DIROP) { + lfs_ss_setflags(fs, ssp, + lfs_ss_getflags(fs, ssp) | (SS_DIROP | SS_CONT)); + } fip = sp->fip; fip->fi_nblocks = 0; @@ -226,12 +232,11 @@ lfs_writefile(struct lfs * fs, struct se fip = sp->fip; if (fip->fi_nblocks != 0) { - sp->fip = (FINFO *) ((caddr_t) fip + FINFOSIZE + - sizeof(ulfs_daddr_t) * (fip->fi_nblocks)); + sp->fip = NEXT_FINFO(fs, fip); sp->start_lbp = &sp->fip->fi_blocks[0]; } else { sp->sum_bytes_left += FINFOSIZE; - --((SEGSUM *) (sp->segsum))->ss_nfinfo; + lfs_ss_setnfinfo(fs, ssp, lfs_ss_getnfinfo(fs, ssp) - 1); } } @@ -242,6 +247,7 @@ lfs_writeinode(struct lfs * fs, struct s struct ulfs1_dinode *cdp; IFILE *ifp; SEGUSE *sup; + SEGSUM *ssp; daddr_t daddr; ino_t ino; int i, ndx, fsb = 0; @@ -315,7 +321,8 @@ lfs_writeinode(struct lfs * fs, struct s brelse(bp, 0); } /* Increment inode count in segment summary block. */ - ++((SEGSUM *) (sp->segsum))->ss_ninos; + ssp = (SEGSUM *)sp->segsum; + lfs_ss_setninos(fs, ssp, lfs_ss_getninos(fs, ssp) + 1); /* If this page is full, set flag to allocate a new page. */ if (++sp->ninodes % LFS_INOPB(fs) == 0) @@ -359,6 +366,7 @@ int lfs_gatherblock(struct segment * sp, struct ubuf * bp) { struct lfs *fs; + SEGSUM *ssp; int version; int j, blksinblk; @@ -378,7 +386,8 @@ lfs_gatherblock(struct segment * sp, str sp->fip->fi_version = version; sp->fip->fi_ino = VTOI(sp->vp)->i_number; /* Add the current file to the segment summary. */ - ++((SEGSUM *) (sp->segsum))->ss_nfinfo; + ssp = (SEGSUM *)sp->segsum; + lfs_ss_setnfinfo(fs, ssp, lfs_ss_getnfinfo(fs, ssp) + 1); sp->sum_bytes_left -= FINFOSIZE; return 1; @@ -664,12 +673,13 @@ lfs_initseg(struct lfs * fs) /* Set point to SEGSUM, initialize it. */ ssp = sp->segsum; - ssp->ss_next = lfs_sb_getnextseg(fs); - ssp->ss_nfinfo = ssp->ss_ninos = 0; - ssp->ss_magic = SS_MAGIC; + lfs_ss_setnext(fs, ssp, lfs_sb_getnextseg(fs)); + lfs_ss_setnfinfo(fs, ssp, 0); + lfs_ss_setninos(fs, ssp, 0); + lfs_ss_setmagic(fs, ssp, SS_MAGIC); /* Set pointer to first FINFO, initialize it. */ - sp->fip = (struct finfo *) ((caddr_t) sp->segsum + SEGSUM_SIZE(fs)); + sp->fip = SEGSUM_FINFOBASE(fs, ssp); sp->fip->fi_nblocks = 0; sp->start_lbp = &sp->fip->fi_blocks[0]; sp->fip->fi_lastlength = 0; @@ -735,6 +745,7 @@ lfs_writeseg(struct lfs * fs, struct seg int do_again, nblocks, byteoffset; size_t el_size; u_short ninos; + size_t sumstart; struct uvnode *devvp; /* @@ -765,10 +776,10 @@ lfs_writeseg(struct lfs * fs, struct seg } ssp = (SEGSUM *) sp->segsum; - ssp->ss_flags |= SS_RFW; + lfs_ss_setflags(fs, ssp, lfs_ss_getflags(fs, ssp) | SS_RFW); - ninos = (ssp->ss_ninos + LFS_INOPB(fs) - 1) / LFS_INOPB(fs); - sup->su_nbytes += ssp->ss_ninos * LFS_DINODE1_SIZE; + ninos = (lfs_ss_getninos(fs, ssp) + LFS_INOPB(fs) - 1) / LFS_INOPB(fs); + sup->su_nbytes += lfs_ss_getninos(fs, ssp) * LFS_DINODE1_SIZE; if (lfs_sb_getversion(fs) == 1) sup->su_olastmod = write_time; @@ -805,20 +816,21 @@ lfs_writeseg(struct lfs * fs, struct seg (*bpp)->b_flags |= B_BUSY; } if (lfs_sb_getversion(fs) == 1) - ssp->ss_ocreate = write_time; + lfs_ss_setocreate(fs, ssp, write_time); else { - ssp->ss_create = write_time; + lfs_ss_setcreate(fs, ssp, write_time); lfs_sb_addserial(fs, 1); - ssp->ss_serial = lfs_sb_getserial(fs); - ssp->ss_ident = lfs_sb_getident(fs); + lfs_ss_setserial(fs, ssp, lfs_sb_getserial(fs)); + lfs_ss_setident(fs, ssp, lfs_sb_getident(fs)); } /* Set the summary block busy too */ bremfree(*(sp->bpp)); (*(sp->bpp))->b_flags |= B_BUSY; - ssp->ss_datasum = cksum(datap, (nblocks - 1) * el_size); - ssp->ss_sumsum = - cksum(&ssp->ss_datasum, lfs_sb_getsumsize(fs) - sizeof(ssp->ss_sumsum)); + lfs_ss_setdatasum(fs, ssp, cksum(datap, (nblocks - 1) * el_size)); + sumstart = lfs_ss_getsumstart(fs); + lfs_ss_setsumsum(fs, ssp, + cksum((char *)ssp + sumstart, lfs_sb_getsumsize(fs) - sumstart)); free(datap); datap = dp = NULL; lfs_sb_subbfree(fs, (lfs_btofsb(fs, ninos * lfs_sb_getibsize(fs)) + Index: src/sbin/fsck_lfs/setup.c diff -u src/sbin/fsck_lfs/setup.c:1.52 src/sbin/fsck_lfs/setup.c:1.53 --- src/sbin/fsck_lfs/setup.c:1.52 Sun Aug 2 18:14:16 2015 +++ src/sbin/fsck_lfs/setup.c Wed Aug 12 18:26:27 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: setup.c,v 1.52 2015/08/02 18:14:16 dholland Exp $ */ +/* $NetBSD: setup.c,v 1.53 2015/08/12 18:26:27 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -174,6 +174,7 @@ setup(const char *dev) int i, isdirty; long sn, curseg; SEGUSE *sup; + size_t sumstart; havesb = 0; doskipclean = skipclean; @@ -261,28 +262,29 @@ setup(const char *dev) lfs_sb_getsumsize(fs), 0, &bp); sp = (SEGSUM *)bp->b_data; - if (sp->ss_sumsum != cksum(&sp->ss_datasum, - lfs_sb_getsumsize(fs) - - sizeof(sp->ss_sumsum))) { + sumstart = lfs_ss_getsumstart(fs); + if (lfs_ss_getsumsum(fs, sp) != + cksum((char *)sp + sumstart, + lfs_sb_getsumsize(fs) - sumstart)) { brelse(bp, 0); if (debug) printf("bad cksum at %jx\n", (uintmax_t)tdaddr); break; } - fp = (FINFO *)(sp + 1); - bc = howmany(sp->ss_ninos, LFS_INOPB(fs)) << + fp = SEGSUM_FINFOBASE(fs, sp); + bc = howmany(lfs_ss_getninos(fs, sp), LFS_INOPB(fs)) << (lfs_sb_getversion(fs) > 1 ? lfs_sb_getffshift(fs) : lfs_sb_getbshift(fs)); - for (i = 0; i < sp->ss_nfinfo; i++) { + for (i = 0; i < lfs_ss_getnfinfo(fs, sp); i++) { bc += fp->fi_lastlength + ((fp->fi_nblocks - 1) << lfs_sb_getbshift(fs)); - fp = (FINFO *)(fp->fi_blocks + fp->fi_nblocks); + fp = NEXT_FINFO(fs, fp); } tdaddr += lfs_btofsb(fs, bc) + 1; lfs_sb_setoffset(fs, tdaddr); - lfs_sb_setserial(fs, sp->ss_serial + 1); + lfs_sb_setserial(fs, lfs_ss_getserial(fs, sp) + 1); brelse(bp, 0); } Index: src/sys/ufs/lfs/lfs.h diff -u src/sys/ufs/lfs/lfs.h:1.176 src/sys/ufs/lfs/lfs.h:1.177 --- src/sys/ufs/lfs/lfs.h:1.176 Wed Aug 12 18:25:52 2015 +++ src/sys/ufs/lfs/lfs.h Wed Aug 12 18:26:27 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs.h,v 1.176 2015/08/12 18:25:52 dholland Exp $ */ +/* $NetBSD: lfs.h,v 1.177 2015/08/12 18:26:27 dholland Exp $ */ /* from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp */ /* from NetBSD: dir.h,v 1.21 2009/07/22 04:49:19 dholland Exp */ @@ -148,6 +148,10 @@ #ifndef _UFS_LFS_LFS_H_ #define _UFS_LFS_LFS_H_ +#if !defined(_KERNEL) && !defined(_STANDALONE) +#include <stddef.h> /* for offsetof */ +#endif + #include <sys/rwlock.h> #include <sys/mutex.h> #include <sys/queue.h> @@ -571,35 +575,38 @@ typedef union _cleanerinfo { /* * On-disk segment summary information */ + +/* magic value for ss_magic */ +#define SS_MAGIC 0x061561 + +/* flags for ss_flags */ +#define SS_DIROP 0x01 /* segment begins a dirop */ +#define SS_CONT 0x02 /* more partials to finish this write*/ +#define SS_CLEAN 0x04 /* written by the cleaner */ +#define SS_RFW 0x08 /* written by the roll-forward agent */ +#define SS_RECLAIM 0x10 /* written by the roll-forward agent */ + typedef struct segsum_v1 SEGSUM_V1; struct segsum_v1 { u_int32_t ss_sumsum; /* 0: check sum of summary block */ u_int32_t ss_datasum; /* 4: check sum of data */ u_int32_t ss_magic; /* 8: segment summary magic number */ -#define SS_MAGIC 0x061561 int32_t ss_next; /* 12: next segment */ u_int32_t ss_create; /* 16: creation time stamp */ u_int16_t ss_nfinfo; /* 20: number of file info structures */ u_int16_t ss_ninos; /* 22: number of inodes in summary */ - -#define SS_DIROP 0x01 /* segment begins a dirop */ -#define SS_CONT 0x02 /* more partials to finish this write*/ -#define SS_CLEAN 0x04 /* written by the cleaner */ -#define SS_RFW 0x08 /* written by the roll-forward agent */ -#define SS_RECLAIM 0x10 /* written by the roll-forward agent */ u_int16_t ss_flags; /* 24: used for directory operations */ u_int16_t ss_pad; /* 26: extra space */ /* FINFO's and inode daddr's... */ }; -typedef struct segsum SEGSUM; -struct segsum { +typedef struct segsum32 SEGSUM32; +struct segsum32 { u_int32_t ss_sumsum; /* 0: check sum of summary block */ u_int32_t ss_datasum; /* 4: check sum of data */ u_int32_t ss_magic; /* 8: segment summary magic number */ int32_t ss_next; /* 12: next segment (disk address) */ u_int32_t ss_ident; /* 16: roll-forward fsid */ -#define ss_ocreate ss_ident /* ident is where create was in v1 */ u_int16_t ss_nfinfo; /* 20: number of file info structures */ u_int16_t ss_ninos; /* 22: number of inodes in summary */ u_int16_t ss_flags; /* 24: used for directory operations */ @@ -610,6 +617,30 @@ struct segsum { /* FINFO's and inode daddr's... */ }; +typedef struct segsum64 SEGSUM64; +struct segsum64 { + u_int32_t ss_sumsum; /* 0: check sum of summary block */ + u_int32_t ss_datasum; /* 4: check sum of data */ + u_int32_t ss_magic; /* 8: segment summary magic number */ + u_int32_t ss_ident; /* 12: roll-forward fsid */ + int64_t ss_next; /* 16: next segment (disk address) */ + u_int16_t ss_nfinfo; /* 24: number of file info structures */ + u_int16_t ss_ninos; /* 26: number of inodes in summary */ + u_int16_t ss_flags; /* 28: used for directory operations */ + u_int8_t ss_pad[2]; /* 30: extra space */ + u_int64_t ss_reclino; /* 32: inode being reclaimed */ + u_int64_t ss_serial; /* 40: serial number */ + u_int64_t ss_create; /* 48: time stamp */ + /* FINFO's and inode daddr's... */ +}; + +typedef union segsum SEGSUM; +union segsum { + struct segsum64 u_64; + struct segsum32 u_32; + struct segsum_v1 u_v1; +}; + /* * On-disk super block. Index: src/sys/ufs/lfs/lfs_accessors.h diff -u src/sys/ufs/lfs/lfs_accessors.h:1.10 src/sys/ufs/lfs/lfs_accessors.h:1.11 --- src/sys/ufs/lfs/lfs_accessors.h:1.10 Wed Aug 12 18:25:52 2015 +++ src/sys/ufs/lfs/lfs_accessors.h Wed Aug 12 18:26:27 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_accessors.h,v 1.10 2015/08/12 18:25:52 dholland Exp $ */ +/* $NetBSD: lfs_accessors.h,v 1.11 2015/08/12 18:26:27 dholland Exp $ */ /* from NetBSD: lfs.h,v 1.165 2015/07/24 06:59:32 dholland Exp */ /* from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp */ @@ -145,6 +145,11 @@ #ifndef _UFS_LFS_LFS_ACCESSORS_H_ #define _UFS_LFS_LFS_ACCESSORS_H_ +#if !defined(_KERNEL) && !defined(_STANDALONE) +#include <assert.h> +#define KASSERT assert +#endif + /* * STRUCT_LFS is used by the libsa code to get accessors that work * with struct salfs instead of struct lfs, and by the cleaner to @@ -273,6 +278,21 @@ } while (0) /* + * FINFO (file info) entries. + */ + +/* Size of an on-disk block pointer, e.g. in an indirect block. */ +/* XXX: move to a more suitable location in this file */ +#define LFS_BLKPTRSIZE(fs) ((fs)->lfs_is64 ? sizeof(int64_t) : sizeof(int32_t)) + +/* Full size of the provided FINFO record, including its block pointers. */ +#define FINFO_FULLSIZE(fs, fip) \ + (FINFOSIZE + (fip)->fi_nblocks * LFS_BLKPTRSIZE(fs)) + +#define NEXT_FINFO(fs, fip) \ + ((FINFO *)((char *)(fip) + FINFO_FULLSIZE(fs, fip))) + +/* * Index file inode entries. */ @@ -464,7 +484,100 @@ lfs_ci_shiftdirtytoclean(STRUCT_LFS *fs, * On-disk segment summary information */ -#define SEGSUM_SIZE(fs) (lfs_sb_getversion(fs) == 1 ? sizeof(SEGSUM_V1) : sizeof(SEGSUM)) +#define SEGSUM_SIZE(fs) \ + (fs->lfs_is64 ? sizeof(SEGSUM64) : \ + lfs_sb_getversion(fs) > 1 ? sizeof(SEGSUM32) : sizeof(SEGSUM_V1)) + +/* + * The SEGSUM structure is followed by FINFO structures. Get the pointer + * to the first FINFO. + * + * XXX this can't be a macro yet; this file needs to be resorted. + */ +#if 0 +static __unused inline FINFO * +segsum_finfobase(STRUCT_LFS *fs, SEGSUM *ssp) +{ + return (FINFO *)((char *)ssp) + SEGSUM_SIZE(fs); +} +#else +#define SEGSUM_FINFOBASE(fs, ssp) \ + ((FINFO *)((char *)(ssp)) + SEGSUM_SIZE(fs)); +#endif + +#define LFS_DEF_SS_ACCESSOR(type, type32, field) \ + static __unused inline type \ + lfs_ss_get##field(STRUCT_LFS *fs, SEGSUM *ssp) \ + { \ + if (fs->lfs_is64) { \ + return ssp->u_64.ss_##field; \ + } else { \ + return ssp->u_32.ss_##field; \ + } \ + } \ + static __unused inline void \ + lfs_ss_set##field(STRUCT_LFS *fs, SEGSUM *ssp, type val) \ + { \ + if (fs->lfs_is64) { \ + type *p = &ssp->u_64.ss_##field; \ + (void)p; \ + ssp->u_64.ss_##field = val; \ + } else { \ + type32 *p = &ssp->u_32.ss_##field; \ + (void)p; \ + ssp->u_32.ss_##field = val; \ + } \ + } \ + +LFS_DEF_SS_ACCESSOR(uint32_t, uint32_t, sumsum); +LFS_DEF_SS_ACCESSOR(uint32_t, uint32_t, datasum); +LFS_DEF_SS_ACCESSOR(uint32_t, uint32_t, magic); +LFS_DEF_SS_ACCESSOR(uint32_t, uint32_t, ident); +LFS_DEF_SS_ACCESSOR(int64_t, int32_t, next); +LFS_DEF_SS_ACCESSOR(uint16_t, uint16_t, nfinfo); +LFS_DEF_SS_ACCESSOR(uint16_t, uint16_t, ninos); +LFS_DEF_SS_ACCESSOR(uint16_t, uint16_t, flags); +LFS_DEF_SS_ACCESSOR(uint64_t, uint32_t, reclino); +LFS_DEF_SS_ACCESSOR(uint64_t, uint64_t, serial); +LFS_DEF_SS_ACCESSOR(uint64_t, uint64_t, create); + +static __unused inline size_t +lfs_ss_getsumstart(STRUCT_LFS *fs) +{ + /* These are actually all the same. */ + if (fs->lfs_is64) { + return offsetof(SEGSUM64, ss_datasum); + } else /* if (lfs_sb_getversion(fs) > 1) */ { + return offsetof(SEGSUM32, ss_datasum); + } /* else { + return offsetof(SEGSUM_V1, ss_datasum); + } */ + /* + * XXX ^^^ until this file is resorted lfs_sb_getversion isn't + * defined yet. + */ +} + +static __unused inline uint32_t +lfs_ss_getocreate(STRUCT_LFS *fs, SEGSUM *ssp) +{ + KASSERT(fs->lfs_is64 == 0); + /* XXX need to resort this file before we can do this */ + //KASSERT(lfs_sb_getversion(fs) == 1); + + return ssp->u_v1.ss_create; +} + +static __unused inline void +lfs_ss_setocreate(STRUCT_LFS *fs, SEGSUM *ssp, uint32_t val) +{ + KASSERT(fs->lfs_is64 == 0); + /* XXX need to resort this file before we can do this */ + //KASSERT(lfs_sb_getversion(fs) == 1); + + ssp->u_v1.ss_create = val; +} + /* * Super block. Index: src/sys/ufs/lfs/lfs_pages.c diff -u src/sys/ufs/lfs/lfs_pages.c:1.6 src/sys/ufs/lfs/lfs_pages.c:1.7 --- src/sys/ufs/lfs/lfs_pages.c:1.6 Sun Aug 2 18:10:08 2015 +++ src/sys/ufs/lfs/lfs_pages.c Wed Aug 12 18:26:27 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_pages.c,v 1.6 2015/08/02 18:10:08 dholland Exp $ */ +/* $NetBSD: lfs_pages.c,v 1.7 2015/08/12 18:26:27 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_pages.c,v 1.6 2015/08/02 18:10:08 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_pages.c,v 1.7 2015/08/12 18:26:27 dholland Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -743,8 +743,12 @@ lfs_putpages(void *v) * Ensure that the partial segment is marked SS_DIROP if this * vnode is a DIROP. */ - if (!seglocked && vp->v_uflag & VU_DIROP) - ((SEGSUM *)(sp->segsum))->ss_flags |= (SS_DIROP|SS_CONT); + if (!seglocked && vp->v_uflag & VU_DIROP) { + SEGSUM *ssp = sp->segsum; + + lfs_ss_setflags(fs, ssp, + lfs_ss_getflags(fs, ssp) | (SS_DIROP|SS_CONT)); + } /* * Loop over genfs_putpages until all pages are gathered. Index: src/sys/ufs/lfs/lfs_rfw.c diff -u src/sys/ufs/lfs/lfs_rfw.c:1.26 src/sys/ufs/lfs/lfs_rfw.c:1.27 --- src/sys/ufs/lfs/lfs_rfw.c:1.26 Wed Aug 12 18:25:52 2015 +++ src/sys/ufs/lfs/lfs_rfw.c Wed Aug 12 18:26:27 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_rfw.c,v 1.26 2015/08/12 18:25:52 dholland Exp $ */ +/* $NetBSD: lfs_rfw.c,v 1.27 2015/08/12 18:26:27 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_rfw.c,v 1.26 2015/08/12 18:25:52 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_rfw.c,v 1.27 2015/08/12 18:26:27 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_quota.h" @@ -355,6 +355,7 @@ check_segsum(struct lfs *fs, daddr_t off FINFO *fip; SEGUSE *sup; size_t size; + uint32_t datasum, foundsum; devvp = VTOI(fs->lfs_ivnode)->i_devvp; /* @@ -377,57 +378,60 @@ check_segsum(struct lfs *fs, daddr_t off /* Check summary checksum */ ssp = (SEGSUM *)bp->b_data; if (flags & CHECK_CKSUM) { - if (ssp->ss_sumsum != cksum(&ssp->ss_datasum, - lfs_sb_getsumsize(fs) - - sizeof(ssp->ss_sumsum))) { + size_t sumstart; + + sumstart = lfs_ss_getsumstart(fs); + if (lfs_ss_getsumsum(fs, ssp) != + cksum((char *)ssp + sumstart, + lfs_sb_getsumsize(fs) - sumstart)) { DLOG((DLOG_RF, "Sumsum error at 0x%" PRIx64 "\n", offset)); offset = -1; goto err1; } - if (ssp->ss_nfinfo == 0 && ssp->ss_ninos == 0) { + if (lfs_ss_getnfinfo(fs, ssp) == 0 && + lfs_ss_getninos(fs, ssp) == 0) { DLOG((DLOG_RF, "Empty pseg at 0x%" PRIx64 "\n", offset)); offset = -1; goto err1; } - if (ssp->ss_create < lfs_sb_gettstamp(fs)) { + if (lfs_ss_getcreate(fs, ssp) < lfs_sb_gettstamp(fs)) { DLOG((DLOG_RF, "Old data at 0x%" PRIx64 "\n", offset)); offset = -1; goto err1; } } if (lfs_sb_getversion(fs) > 1) { - if (ssp->ss_serial != nextserial) { + if (lfs_ss_getserial(fs, ssp) != nextserial) { DLOG((DLOG_RF, "Unexpected serial number at 0x%" PRIx64 "\n", offset)); offset = -1; goto err1; } - if (ssp->ss_ident != lfs_sb_getident(fs)) { + if (lfs_ss_getident(fs, ssp) != lfs_sb_getident(fs)) { DLOG((DLOG_RF, "Incorrect fsid (0x%x vs 0x%x) at 0x%" - PRIx64 "\n", ssp->ss_ident, lfs_sb_getident(fs), offset)); + PRIx64 "\n", lfs_ss_getident(fs, ssp), + lfs_sb_getident(fs), offset)); offset = -1; goto err1; } } if (pseg_flags) - *pseg_flags = ssp->ss_flags; + *pseg_flags = lfs_ss_getflags(fs, ssp); oldoffset = offset; offset += lfs_btofsb(fs, lfs_sb_getsumsize(fs)); - ninos = howmany(ssp->ss_ninos, LFS_INOPB(fs)); + ninos = howmany(lfs_ss_getninos(fs, ssp), LFS_INOPB(fs)); /* XXX ondisk32 */ iaddr = (int32_t *)((char*)bp->b_data + lfs_sb_getsumsize(fs) - sizeof(int32_t)); if (flags & CHECK_CKSUM) { /* Count blocks */ nblocks = 0; - fip = (FINFO *)((char*)bp->b_data + SEGSUM_SIZE(fs)); - for (i = 0; i < ssp->ss_nfinfo; ++i) { + fip = SEGSUM_FINFOBASE(fs, (SEGSUM *)bp->b_data); + for (i = 0; i < lfs_ss_getnfinfo(fs, ssp); ++i) { nblocks += fip->fi_nblocks; if (fip->fi_nblocks <= 0) break; - /* XXX ondisk32 */ - fip = (FINFO *)(((char *)fip) + FINFOSIZE + - (fip->fi_nblocks * sizeof(int32_t))); + fip = NEXT_FINFO(fs, fip); } nblocks += ninos; /* Create the sum array */ @@ -436,8 +440,8 @@ check_segsum(struct lfs *fs, daddr_t off } /* Handle individual blocks */ - fip = (FINFO *)((char*)bp->b_data + SEGSUM_SIZE(fs)); - for (i = 0; i < ssp->ss_nfinfo || ninos; ++i) { + fip = SEGSUM_FINFOBASE(fs, (SEGSUM *)bp->b_data); + for (i = 0; i < lfs_ss_getnfinfo(fs, ssp) || ninos; ++i) { /* Inode block? */ if (ninos && *iaddr == offset) { if (flags & CHECK_CKSUM) { @@ -487,18 +491,15 @@ check_segsum(struct lfs *fs, daddr_t off } offset += lfs_btofsb(fs, size); } - /* XXX ondisk32 */ - fip = (FINFO *)(((char *)fip) + FINFOSIZE - + fip->fi_nblocks * sizeof(int32_t)); + fip = NEXT_FINFO(fs, fip); } /* Checksum the array, compare */ - if ((flags & CHECK_CKSUM) && - ssp->ss_datasum != cksum(datap, nblocks * sizeof(u_long))) - { + datasum = lfs_ss_getdatasum(fs, ssp); + foundsum = cksum(datap, nblocks * sizeof(u_long)); + if ((flags & CHECK_CKSUM) && datasum != foundsum) { DLOG((DLOG_RF, "Datasum error at 0x%" PRIx64 " (wanted %x got %x)\n", - offset, ssp->ss_datasum, cksum(datap, nblocks * - sizeof(u_long)))); + offset, datasum, foundsum)); offset = -1; goto err2; } @@ -506,11 +507,11 @@ check_segsum(struct lfs *fs, daddr_t off /* If we're at the end of the segment, move to the next */ if (lfs_dtosn(fs, offset + lfs_btofsb(fs, lfs_sb_getsumsize(fs) + lfs_sb_getbsize(fs))) != lfs_dtosn(fs, offset)) { - if (lfs_dtosn(fs, offset) == lfs_dtosn(fs, ssp->ss_next)) { + if (lfs_dtosn(fs, offset) == lfs_dtosn(fs, lfs_ss_getnext(fs, ssp))) { offset = -1; goto err2; } - offset = ssp->ss_next; + offset = lfs_ss_getnext(fs, ssp); DLOG((DLOG_RF, "LFS roll forward: moving to offset 0x%" PRIx64 " -> segment %d\n", offset, lfs_dtosn(fs,offset))); } Index: src/sys/ufs/lfs/lfs_segment.c diff -u src/sys/ufs/lfs/lfs_segment.c:1.253 src/sys/ufs/lfs/lfs_segment.c:1.254 --- src/sys/ufs/lfs/lfs_segment.c:1.253 Wed Aug 12 18:25:52 2015 +++ src/sys/ufs/lfs/lfs_segment.c Wed Aug 12 18:26:27 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_segment.c,v 1.253 2015/08/12 18:25:52 dholland Exp $ */ +/* $NetBSD: lfs_segment.c,v 1.254 2015/08/12 18:26:27 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.253 2015/08/12 18:25:52 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.254 2015/08/12 18:26:27 dholland Exp $"); #define _VFS_VNODE_PRIVATE /* XXX: check for VI_MARKER, this has to go */ @@ -622,6 +622,7 @@ lfs_segwrite(struct mount *mp, int flags int writer_set = 0; int dirty; int redo; + SEGSUM *ssp; int um_error; fs = VFSTOULFS(mp)->um_lfs; @@ -678,7 +679,9 @@ lfs_segwrite(struct mount *mp, int flags um_error = error; /* In case writevnodes errored out */ lfs_flush_dirops(fs); - ((SEGSUM *)(sp->segsum))->ss_flags &= ~(SS_CONT); + ssp = (SEGSUM *)(sp->segsum); + lfs_ss_setflags(fs, ssp, + lfs_ss_getflags(fs, ssp) & ~(SS_CONT)); lfs_finalize_fs_seguse(fs); } if (do_ckp && um_error) { @@ -847,6 +850,7 @@ lfs_writefile(struct lfs *fs, struct seg { struct inode *ip; int i, frag; + SEGSUM *ssp; int error; ASSERT_SEGLOCK(fs); @@ -855,8 +859,11 @@ lfs_writefile(struct lfs *fs, struct seg lfs_acquire_finfo(fs, ip->i_number, ip->i_gen); - if (vp->v_uflag & VU_DIROP) - ((SEGSUM *)(sp->segsum))->ss_flags |= (SS_DIROP|SS_CONT); + if (vp->v_uflag & VU_DIROP) { + ssp = (SEGSUM *)sp->segsum; + lfs_ss_setflags(fs, ssp, + lfs_ss_getflags(fs, ssp) | (SS_DIROP|SS_CONT)); + } if (sp->seg_flags & SEGM_CLEAN) { lfs_gather(fs, sp, vp, lfs_match_fake); @@ -1051,6 +1058,7 @@ lfs_writeinode(struct lfs *fs, struct se int redo_ifile = 0; int gotblk = 0; int count; + SEGSUM *ssp; ASSERT_SEGLOCK(fs); if (!(ip->i_flag & IN_ALLMOD) && !(vp->v_uflag & VU_DIROP)) @@ -1133,8 +1141,11 @@ lfs_writeinode(struct lfs *fs, struct se } /* Check VU_DIROP in case there is a new file with no data blocks */ - if (vp->v_uflag & VU_DIROP) - ((SEGSUM *)(sp->segsum))->ss_flags |= (SS_DIROP|SS_CONT); + if (vp->v_uflag & VU_DIROP) { + ssp = (SEGSUM *)sp->segsum; + lfs_ss_setflags(fs, ssp, + lfs_ss_getflags(fs, ssp) | (SS_DIROP|SS_CONT)); + } /* Update the inode times and copy the inode onto the inode page. */ /* XXX kludge --- don't redirty the ifile just to put times on it */ @@ -1283,7 +1294,9 @@ lfs_writeinode(struct lfs *fs, struct se } /* Increment inode count in segment summary block. */ - ++((SEGSUM *)(sp->segsum))->ss_ninos; + + ssp = (SEGSUM *)sp->segsum; + lfs_ss_setninos(fs, ssp, lfs_ss_getninos(fs, ssp) + 1); /* If this page is full, set flag to allocate a new page. */ if (++sp->ninodes % LFS_INOPB(fs) == 0) @@ -1830,12 +1843,13 @@ lfs_initseg(struct lfs *fs) /* Set point to SEGSUM, initialize it. */ ssp = sp->segsum = sbp->b_data; memset(ssp, 0, lfs_sb_getsumsize(fs)); - ssp->ss_next = lfs_sb_getnextseg(fs); - ssp->ss_nfinfo = ssp->ss_ninos = 0; - ssp->ss_magic = SS_MAGIC; + lfs_ss_setnext(fs, ssp, lfs_sb_getnextseg(fs)); + lfs_ss_setnfinfo(fs, ssp, 0); + lfs_ss_setninos(fs, ssp, 0); + lfs_ss_setmagic(fs, ssp, SS_MAGIC); /* Set pointer to first FINFO, initialize it. */ - sp->fip = (struct finfo *)((char *)sp->segsum + SEGSUM_SIZE(fs)); + sp->fip = SEGSUM_FINFOBASE(fs, sp->segsum); sp->fip->fi_nblocks = 0; sp->start_lbp = &sp->fip->fi_blocks[0]; sp->fip->fi_lastlength = 0; @@ -1995,6 +2009,7 @@ lfs_writeseg(struct lfs *fs, struct segm int32_t *daddrp; /* XXX ondisk32 */ int changed; u_int32_t sum; + size_t sumstart; #ifdef DEBUG FINFO *fip; int findex; @@ -2011,18 +2026,18 @@ lfs_writeseg(struct lfs *fs, struct segm * roll-forward agent. */ if ((nblocks = sp->cbpp - sp->bpp) == 1) { - if ((ssp->ss_flags & (SS_DIROP | SS_CONT)) != SS_DIROP) + if ((lfs_ss_getflags(fs, ssp) & (SS_DIROP | SS_CONT)) != SS_DIROP) return 0; } /* Note if partial segment is being written by the cleaner */ if (sp->seg_flags & SEGM_CLEAN) - ssp->ss_flags |= SS_CLEAN; + lfs_ss_setflags(fs, ssp, lfs_ss_getflags(fs, ssp) | SS_CLEAN); /* Note if we are writing to reclaim */ if (sp->seg_flags & SEGM_RECLAIM) { - ssp->ss_flags |= SS_RECLAIM; - ssp->ss_reclino = fs->lfs_reclino; + lfs_ss_setflags(fs, ssp, lfs_ss_getflags(fs, ssp) | SS_RECLAIM); + lfs_ss_setreclino(fs, ssp, fs->lfs_reclino); } devvp = VTOI(fs->lfs_ivnode)->i_devvp; @@ -2044,20 +2059,20 @@ lfs_writeseg(struct lfs *fs, struct segm #ifdef DEBUG /* Check for zero-length and zero-version FINFO entries. */ - fip = (struct finfo *)((char *)ssp + SEGSUM_SIZE(fs)); - for (findex = 0; findex < ssp->ss_nfinfo; findex++) { + fip = SEGSUM_FINFOBASE(fs, ssp); + for (findex = 0; findex < lfs_ss_getnfinfo(fs, ssp); findex++) { KDASSERT(fip->fi_nblocks > 0); KDASSERT(fip->fi_version > 0); - fip = (FINFO *)((char *)fip + FINFOSIZE + - sizeof(int32_t) * fip->fi_nblocks); + fip = NEXT_FINFO(fs, fip); } #endif /* DEBUG */ - ninos = (ssp->ss_ninos + LFS_INOPB(fs) - 1) / LFS_INOPB(fs); + ninos = (lfs_ss_getninos(fs, ssp) + LFS_INOPB(fs) - 1) / LFS_INOPB(fs); DLOG((DLOG_SU, "seg %d += %d for %d inodes\n", - sp->seg_number, ssp->ss_ninos * sizeof (struct ulfs1_dinode), - ssp->ss_ninos)); - sup->su_nbytes += ssp->ss_ninos * sizeof (struct ulfs1_dinode); + sp->seg_number, + lfs_ss_getninos(fs, ssp) * sizeof (struct ulfs1_dinode), + lfs_ss_getninos(fs, ssp))); + sup->su_nbytes += lfs_ss_getninos(fs, ssp) * sizeof (struct ulfs1_dinode); /* sup->su_nbytes += lfs_sb_getsumsize(fs); */ if (lfs_sb_getversion(fs) == 1) sup->su_olastmod = time_second; @@ -2202,16 +2217,17 @@ lfs_writeseg(struct lfs *fs, struct segm } } if (lfs_sb_getversion(fs) == 1) - ssp->ss_ocreate = time_second; + lfs_ss_setocreate(fs, ssp, time_second); else { - ssp->ss_create = time_second; + lfs_ss_setcreate(fs, ssp, time_second); lfs_sb_addserial(fs, 1); - ssp->ss_serial = lfs_sb_getserial(fs); - ssp->ss_ident = lfs_sb_getident(fs); + lfs_ss_setserial(fs, ssp, lfs_sb_getserial(fs)); + lfs_ss_setident(fs, ssp, lfs_sb_getident(fs)); } - ssp->ss_datasum = lfs_cksum_fold(sum); - ssp->ss_sumsum = cksum(&ssp->ss_datasum, - lfs_sb_getsumsize(fs) - sizeof(ssp->ss_sumsum)); + lfs_ss_setdatasum(fs, ssp, lfs_cksum_fold(sum)); + sumstart = lfs_ss_getsumstart(fs); + lfs_ss_setsumsum(fs, ssp, cksum((char *)ssp + sumstart, + lfs_sb_getsumsize(fs) - sumstart)); mutex_enter(&lfs_lock); lfs_sb_subbfree(fs, (lfs_btofsb(fs, ninos * lfs_sb_getibsize(fs)) + @@ -2766,6 +2782,7 @@ void lfs_acquire_finfo(struct lfs *fs, ino_t ino, int vers) { struct segment *sp = fs->lfs_sp; + SEGSUM *ssp; KASSERT(vers > 0); @@ -2774,7 +2791,8 @@ lfs_acquire_finfo(struct lfs *fs, ino_t (void) lfs_writeseg(fs, fs->lfs_sp); sp->sum_bytes_left -= FINFOSIZE; - ++((SEGSUM *)(sp->segsum))->ss_nfinfo; + ssp = (SEGSUM *)sp->segsum; + lfs_ss_setnfinfo(fs, ssp, lfs_ss_getnfinfo(fs, ssp) + 1); sp->fip->fi_nblocks = 0; sp->fip->fi_ino = ino; sp->fip->fi_version = vers; @@ -2788,13 +2806,14 @@ void lfs_release_finfo(struct lfs *fs) { struct segment *sp = fs->lfs_sp; + SEGSUM *ssp; if (sp->fip->fi_nblocks != 0) { - sp->fip = (FINFO*)((char *)sp->fip + FINFOSIZE + - sizeof(int32_t) * sp->fip->fi_nblocks); + sp->fip = NEXT_FINFO(fs, sp->fip); sp->start_lbp = &sp->fip->fi_blocks[0]; } else { sp->sum_bytes_left += FINFOSIZE; - --((SEGSUM *)(sp->segsum))->ss_nfinfo; + ssp = (SEGSUM *)sp->segsum; + lfs_ss_setnfinfo(fs, ssp, lfs_ss_getnfinfo(fs, ssp) - 1); } } Index: src/sys/ufs/lfs/lfs_vfsops.c diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.337 src/sys/ufs/lfs/lfs_vfsops.c:1.338 --- src/sys/ufs/lfs/lfs_vfsops.c:1.337 Wed Aug 12 18:25:52 2015 +++ src/sys/ufs/lfs/lfs_vfsops.c Wed Aug 12 18:26:27 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vfsops.c,v 1.337 2015/08/12 18:25:52 dholland Exp $ */ +/* $NetBSD: lfs_vfsops.c,v 1.338 2015/08/12 18:26:27 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007 @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.337 2015/08/12 18:25:52 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.338 2015/08/12 18:26:27 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_lfs.h" @@ -1878,6 +1878,7 @@ lfs_gop_write(struct vnode *vp, struct v struct inode *ip = VTOI(vp); struct lfs *fs = ip->i_lfs; struct segment *sp = fs->lfs_sp; + SEGSUM *ssp; UVMHIST_FUNC("lfs_gop_write"); UVMHIST_CALLED(ubchist); const char * failreason = NULL; @@ -1991,13 +1992,14 @@ lfs_gop_write(struct vnode *vp, struct v * If we would, write what we have and try again. If we don't * have anything to write, we'll have to sleep. */ + ssp = (SEGSUM *)sp->segsum; if ((kva = uvm_pagermapin(pgs, npages, UVMPAGER_MAPIN_WRITE | - (((SEGSUM *)(sp->segsum))->ss_nfinfo < 1 ? + (lfs_ss_getnfinfo(fs, ssp) < 1 ? UVMPAGER_MAPIN_WAITOK : 0))) == 0x0) { DLOG((DLOG_PAGE, "lfs_gop_write: forcing write\n")); #if 0 " with nfinfo=%d at offset 0x%jx\n", - (int)((SEGSUM *)(sp->segsum))->ss_nfinfo, + (int)lfs_ss_getnfinfo(fs, ssp), (uintmax_t)lfs_sb_getoffset(fs))); #endif lfs_updatemeta(sp); Index: src/sys/ufs/lfs/lfs_vnops.c diff -u src/sys/ufs/lfs/lfs_vnops.c:1.284 src/sys/ufs/lfs/lfs_vnops.c:1.285 --- src/sys/ufs/lfs/lfs_vnops.c:1.284 Wed Aug 12 18:25:04 2015 +++ src/sys/ufs/lfs/lfs_vnops.c Wed Aug 12 18:26:27 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vnops.c,v 1.284 2015/08/12 18:25:04 dholland Exp $ */ +/* $NetBSD: lfs_vnops.c,v 1.285 2015/08/12 18:26:27 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -125,7 +125,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.284 2015/08/12 18:25:04 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.285 2015/08/12 18:26:27 dholland Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -1504,8 +1504,9 @@ lfs_flush_dirops(struct lfs *fs) { struct inode *ip, *nip; struct vnode *vp; - extern int lfs_dostats; + extern int lfs_dostats; /* XXX this does not belong here */ struct segment *sp; + SEGSUM *ssp; int flags = 0; int error = 0; @@ -1605,7 +1606,8 @@ lfs_flush_dirops(struct lfs *fs) } mutex_exit(&lfs_lock); /* We've written all the dirops there are */ - ((SEGSUM *)(sp->segsum))->ss_flags &= ~(SS_CONT); + ssp = (SEGSUM *)sp->segsum; + lfs_ss_setflags(fs, ssp, lfs_ss_getflags(fs, ssp) & ~(SS_CONT)); lfs_finalize_fs_seguse(fs); (void) lfs_writeseg(fs, sp); lfs_segunlock(fs); Index: src/usr.sbin/dumplfs/dumplfs.c diff -u src/usr.sbin/dumplfs/dumplfs.c:1.51 src/usr.sbin/dumplfs/dumplfs.c:1.52 --- src/usr.sbin/dumplfs/dumplfs.c:1.51 Wed Aug 12 18:25:52 2015 +++ src/usr.sbin/dumplfs/dumplfs.c Wed Aug 12 18:26:27 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dumplfs.c,v 1.51 2015/08/12 18:25:52 dholland Exp $ */ +/* $NetBSD: dumplfs.c,v 1.52 2015/08/12 18:26:27 dholland Exp $ */ /*- * Copyright (c) 1991, 1993 @@ -40,7 +40,7 @@ __COPYRIGHT("@(#) Copyright (c) 1991, 19 #if 0 static char sccsid[] = "@(#)dumplfs.c 8.5 (Berkeley) 5/24/95"; #else -__RCSID("$NetBSD: dumplfs.c,v 1.51 2015/08/12 18:25:52 dholland Exp $"); +__RCSID("$NetBSD: dumplfs.c,v 1.52 2015/08/12 18:26:27 dholland Exp $"); #endif #endif /* not lint */ @@ -505,12 +505,15 @@ dump_sum(int fd, struct lfs *lfsp, SEGSU struct ulfs1_dinode *inop; size_t el_size; u_int32_t datasum; + u_int32_t ssflags; time_t t; char *buf; + size_t sumstart; - if (sp->ss_magic != SS_MAGIC || - sp->ss_sumsum != (ck = cksum(&sp->ss_datasum, - lfs_sb_getsumsize(lfsp) - sizeof(sp->ss_sumsum)))) { + sumstart = lfs_ss_getsumstart(lfsp); + if (lfs_ss_getmagic(lfsp, sp) != SS_MAGIC || + lfs_ss_getsumsum(lfsp, sp) != (ck = cksum((char *)sp + sumstart, + lfs_sb_getsumsize(lfsp) - sumstart))) { /* Don't print "corrupt" if we're just too close to the edge */ if (lfs_dtosn(lfsp, addr + LFS_FSBTODB(lfsp, 1)) == lfs_dtosn(lfsp, addr)) @@ -519,7 +522,7 @@ dump_sum(int fd, struct lfs *lfsp, SEGSU (long long)addr); return -1; } - if (lfs_sb_getversion(lfsp) > 1 && sp->ss_ident != lfs_sb_getident(lfsp)) { + if (lfs_sb_getversion(lfsp) > 1 && lfs_ss_getident(lfsp, sp) != lfs_sb_getident(lfsp)) { (void)printf("dumplfs: %s %d address 0x%llx\n", "summary from a former life; segment", segnum, (long long)addr); @@ -527,39 +530,42 @@ dump_sum(int fd, struct lfs *lfsp, SEGSU } (void)printf("Segment Summary Info at 0x%llx\n", (long long)addr); - (void)printf(" %s0x%x\t%s%d\t%s%d\t%s%c%c%c%c\n %s0x%x\t%s0x%x", - "next ", sp->ss_next, - "nfinfo ", sp->ss_nfinfo, - "ninos ", sp->ss_ninos, - "flags ", (sp->ss_flags & SS_DIROP) ? 'D' : '-', - (sp->ss_flags & SS_CONT) ? 'C' : '-', - (sp->ss_flags & SS_CLEAN) ? 'L' : '-', - (sp->ss_flags & SS_RFW) ? 'R' : '-', - "sumsum ", sp->ss_sumsum, - "datasum ", sp->ss_datasum ); + ssflags = lfs_ss_getflags(lfsp, sp); + (void)printf(" %s0x%jx\t%s%d\t%s%d\t%s%c%c%c%c\n %s0x%x\t%s0x%x", + "next ", (intmax_t)lfs_ss_getnext(lfsp, sp), + "nfinfo ", lfs_ss_getnfinfo(lfsp, sp), + "ninos ", lfs_ss_getninos(lfsp, sp), + "flags ", (ssflags & SS_DIROP) ? 'D' : '-', + (ssflags & SS_CONT) ? 'C' : '-', + (ssflags & SS_CLEAN) ? 'L' : '-', + (ssflags & SS_RFW) ? 'R' : '-', + "sumsum ", lfs_ss_getsumsum(lfsp, sp), + "datasum ", lfs_ss_getdatasum(lfsp, sp)); if (lfs_sb_getversion(lfsp) == 1) { - t = sp->ss_ocreate; + t = lfs_ss_getocreate(lfsp, sp); (void)printf("\tcreate %s\n", ctime(&t)); } else { - t = sp->ss_create; + t = lfs_ss_getcreate(lfsp, sp); (void)printf("\tcreate %s", ctime(&t)); - (void)printf(" roll_id %-8x", sp->ss_ident); - (void)printf(" serial %lld\n", (long long)sp->ss_serial); + (void)printf(" roll_id %-8x", lfs_ss_getident(lfsp, sp)); + (void)printf(" serial %lld\n", + (long long)lfs_ss_getserial(lfsp, sp)); } /* Dump out inode disk addresses */ + /* XXX ondisk32 */ dp = (int32_t *)sp; dp += lfs_sb_getsumsize(lfsp) / sizeof(int32_t); inop = malloc(lfs_sb_getbsize(lfsp)); printf(" Inode addresses:"); numbytes = 0; numblocks = 0; - for (dp--, i = 0; i < sp->ss_ninos; dp--) { + for (dp--, i = 0; i < lfs_ss_getninos(lfsp, sp); dp--) { ++numblocks; numbytes += lfs_sb_getibsize(lfsp); /* add bytes for inode block */ printf("\t0x%x {", *dp); get(fd, fsbtobyte(lfsp, *dp), inop, lfs_sb_getibsize(lfsp)); - for (j = 0; i < sp->ss_ninos && j < LFS_INOPB(lfsp); j++, i++) { + for (j = 0; i < lfs_ss_getninos(lfsp, sp) && j < LFS_INOPB(lfsp); j++, i++) { if (j > 0) (void)printf(", "); (void)printf("%dv%d", inop[j].di_inumber, inop[j].di_gen); @@ -572,11 +578,8 @@ dump_sum(int fd, struct lfs *lfsp, SEGSU printf("\n"); - if (lfs_sb_getversion(lfsp) == 1) - fp = (FINFO *)((SEGSUM_V1 *)sp + 1); - else - fp = (FINFO *)(sp + 1); - for (i = 0; i < sp->ss_nfinfo; i++) { + fp = SEGSUM_FINFOBASE(lfsp, sp); + for (i = 0; i < lfs_ss_getnfinfo(lfsp, sp); i++) { (void)printf(" FINFO for inode: %d version %d nblocks %d lastlength %d\n", fp->fi_ino, fp->fi_version, fp->fi_nblocks, fp->fi_lastlength); @@ -619,7 +622,7 @@ dump_sum(int fd, struct lfs *lfsp, SEGSU acc = 0; addr += lfs_btofsb(lfsp, lfs_sb_getsumsize(lfsp)); buf = malloc(lfs_sb_getbsize(lfsp)); - for (i = 0; i < sp->ss_nfinfo; i++) { + for (i = 0; i < lfs_ss_getnfinfo(lfsp, sp); i++) { while (addr == *idp) { get(fd, fsbtobyte(lfsp, addr), buf, lfs_sb_getibsize(lfsp)); memcpy(datap + acc * el_size, buf, el_size); @@ -650,8 +653,8 @@ dump_sum(int fd, struct lfs *lfsp, SEGSU printf("** counted %d blocks but should have been %d\n", acc, numblocks); datasum = cksum(datap, numblocks * el_size); - if (datasum != sp->ss_datasum) - printf("** computed datasum 0x%lx does not match given datasum 0x%lx\n", (unsigned long)datasum, (unsigned long)sp->ss_datasum); + if (datasum != lfs_ss_getdatasum(lfsp, sp)) + printf("** computed datasum 0x%lx does not match given datasum 0x%lx\n", (unsigned long)datasum, (unsigned long)lfs_ss_getdatasum(lfsp, sp)); free(datap); return (numbytes); @@ -662,6 +665,7 @@ dump_segment(int fd, int segnum, daddr_t { struct lfs lfs_sb, *sbp; SEGSUM *sump; + size_t sumstart; char *sumblock; int did_one, nbytes, sb; off_t sum_offset; @@ -688,10 +692,12 @@ dump_segment(int fd, int segnum, daddr_t do { get(fd, sum_offset, sumblock, lfs_sb_getsumsize(lfsp)); sump = (SEGSUM *)sumblock; + sumstart = lfs_ss_getsumstart(lfsp); if ((lfs_sb_getversion(lfsp) > 1 && - sump->ss_ident != lfs_sb_getident(lfsp)) || - sump->ss_sumsum != cksum (&sump->ss_datasum, - lfs_sb_getsumsize(lfsp) - sizeof(sump->ss_sumsum))) { + lfs_ss_getident(lfsp, sump) != lfs_sb_getident(lfsp)) || + lfs_ss_getsumsum(lfsp, sump) != + cksum((char *)sump + sumstart, + lfs_sb_getsumsize(lfsp) - sumstart)) { sbp = (struct lfs *)sump; if ((sb = (sbp->lfs_dlfs_u.u_32.dlfs_magic == LFS_MAGIC))) { printf("Superblock at 0x%x\n",