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",