Module Name: src Committed By: dholland Date: Wed Aug 12 18:25:52 UTC 2015
Modified Files: src/libexec/lfs_cleanerd: coalesce.c lfs_cleanerd.c src/sbin/dump_lfs: lfs_inode.c src/sbin/fsck_lfs: inode.c lfs.c pass0.c pass1.c pass6.c segwrite.c src/sbin/newfs_lfs: make_lfs.c src/sys/lib/libsa: lfsv1.c lfsv2.c ufs.c src/sys/ufs/lfs: lfs.h lfs_accessors.h lfs_alloc.c lfs_itimes.c lfs_rfw.c lfs_segment.c lfs_syscalls.c lfs_vfsops.c src/usr.sbin/dumplfs: dumplfs.c Log Message: Add IFILE32 and IFILE64 structures for the on-disk ifile entries. Add and use accessors. There are also a bunch of places that cast and I hope I've found them all... To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/libexec/lfs_cleanerd/coalesce.c cvs rdiff -u -r1.46 -r1.47 src/libexec/lfs_cleanerd/lfs_cleanerd.c cvs rdiff -u -r1.23 -r1.24 src/sbin/dump_lfs/lfs_inode.c cvs rdiff -u -r1.57 -r1.58 src/sbin/fsck_lfs/inode.c cvs rdiff -u -r1.52 -r1.53 src/sbin/fsck_lfs/lfs.c cvs rdiff -u -r1.38 -r1.39 src/sbin/fsck_lfs/pass0.c \ src/sbin/fsck_lfs/pass6.c cvs rdiff -u -r1.40 -r1.41 src/sbin/fsck_lfs/pass1.c cvs rdiff -u -r1.37 -r1.38 src/sbin/fsck_lfs/segwrite.c cvs rdiff -u -r1.41 -r1.42 src/sbin/newfs_lfs/make_lfs.c cvs rdiff -u -r1.12 -r1.13 src/sys/lib/libsa/lfsv1.c \ src/sys/lib/libsa/lfsv2.c cvs rdiff -u -r1.70 -r1.71 src/sys/lib/libsa/ufs.c cvs rdiff -u -r1.175 -r1.176 src/sys/ufs/lfs/lfs.h cvs rdiff -u -r1.9 -r1.10 src/sys/ufs/lfs/lfs_accessors.h cvs rdiff -u -r1.125 -r1.126 src/sys/ufs/lfs/lfs_alloc.c cvs rdiff -u -r1.17 -r1.18 src/sys/ufs/lfs/lfs_itimes.c cvs rdiff -u -r1.25 -r1.26 src/sys/ufs/lfs/lfs_rfw.c cvs rdiff -u -r1.252 -r1.253 src/sys/ufs/lfs/lfs_segment.c cvs rdiff -u -r1.167 -r1.168 src/sys/ufs/lfs/lfs_syscalls.c cvs rdiff -u -r1.336 -r1.337 src/sys/ufs/lfs/lfs_vfsops.c cvs rdiff -u -r1.50 -r1.51 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/coalesce.c diff -u src/libexec/lfs_cleanerd/coalesce.c:1.30 src/libexec/lfs_cleanerd/coalesce.c:1.31 --- src/libexec/lfs_cleanerd/coalesce.c:1.30 Wed Aug 12 18:25:03 2015 +++ src/libexec/lfs_cleanerd/coalesce.c Wed Aug 12 18:25:51 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: coalesce.c,v 1.30 2015/08/12 18:25:03 dholland Exp $ */ +/* $NetBSD: coalesce.c,v 1.31 2015/08/12 18:25:51 dholland Exp $ */ /*- * Copyright (c) 2002, 2005 The NetBSD Foundation, Inc. @@ -118,7 +118,7 @@ get_dinode(struct clfs *fs, ino_t ino) struct ulfs1_dinode *dip, *r; lfs_ientry(&ifp, fs, ino, &bp); - daddr = ifp->if_daddr; + daddr = lfs_if_getdaddr(fs, ifp); brelse(bp, 0); if (daddr == 0x0) Index: src/libexec/lfs_cleanerd/lfs_cleanerd.c diff -u src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.46 src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.47 --- src/libexec/lfs_cleanerd/lfs_cleanerd.c:1.46 Wed Aug 12 18:25:03 2015 +++ src/libexec/lfs_cleanerd/lfs_cleanerd.c Wed Aug 12 18:25:51 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_cleanerd.c,v 1.46 2015/08/12 18:25:03 dholland Exp $ */ +/* $NetBSD: lfs_cleanerd.c,v 1.47 2015/08/12 18:25:51 dholland Exp $ */ /*- * Copyright (c) 2005 The NetBSD Foundation, Inc. @@ -342,10 +342,15 @@ reload_ifile(struct clfs *fs) * Get IFILE entry for the given inode, store in ifpp. The buffer * which contains that data is returned in bpp, and must be brelse()d * by the caller. + * + * XXX this is cutpaste of LFS_IENTRY from lfs.h; unify the two. */ void lfs_ientry(IFILE **ifpp, struct clfs *fs, ino_t ino, struct ubuf **bpp) { + IFILE64 *ifp64; + IFILE32 *ifp32; + IFILE_V1 *ifp_v1; int error; error = bread(fs->lfs_ivnode, @@ -354,7 +359,19 @@ lfs_ientry(IFILE **ifpp, struct clfs *fs if (error) syslog(LOG_ERR, "%s: ientry failed for ino %d", lfs_sb_getfsmnt(fs), (int)ino); - *ifpp = (IFILE *)(*bpp)->b_data + ino % lfs_sb_getifpb(fs); + if (fs->lfs_is64) { + ifp64 = (IFILE64 *)(*bpp)->b_data; + ifp64 += ino % lfs_sb_getifpb(fs); + *ifpp = (IFILE *)ifp64; + } else if (lfs_sb_getversion(fs) > 1) { + ifp32 = (IFILE32 *)(*bpp)->b_data; + ifp32 += ino % lfs_sb_getifpb(fs); + *ifpp = (IFILE *)ifp32; + } else { + ifp_v1 = (IFILE_V1 *)(*bpp)->b_data; + ifp_v1 += ino % lfs_sb_getifpb(fs); + *ifpp = (IFILE *)ifp_v1; + } return; } @@ -480,7 +497,7 @@ parse_pseg(struct clfs *fs, daddr_t dadd */ #ifndef REPAIR_ZERO_FINFO lfs_ientry(&ifp, fs, dip[i].di_inumber, &ifbp); - idaddr = ifp->if_daddr; + idaddr = lfs_if_getdaddr(fs, ifp); brelse(ifbp, 0); if (idaddr != daddr) #endif @@ -554,7 +571,7 @@ parse_pseg(struct clfs *fs, daddr_t dadd vers = -1; #else lfs_ientry(&ifp, fs, fip->fi_ino, &ifbp); - vers = ifp->if_version; + vers = lfs_if_getversion(fs, ifp); brelse(ifbp, 0); #endif if (vers != fip->fi_version) { @@ -1416,15 +1433,13 @@ lfs_cleaner_main(int argc, char **argv) char *cp, *pidname; #endif -#ifdef RESCUEDIR +#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ == 8 && \ + defined(__OPTIMIZE_SIZE__) /* * XXX: Work around apparent bug with gcc 4.8 and -Os: it * claims that ci.clean is uninitialized in clean_fs (at one * of the several uses of it, which is neither the first nor - * last use) -- this is conditionalized on RESCUEDIR because - * it comes up for building the cleaner for /rescue. It - * doesn't happen with plain -O2, and the value is clearly - * always initialized. + * last use) -- this doesn't happen with plain -O2. * * Hopefully in the future further rearrangements will allow * removing this hack. Index: src/sbin/dump_lfs/lfs_inode.c diff -u src/sbin/dump_lfs/lfs_inode.c:1.23 src/sbin/dump_lfs/lfs_inode.c:1.24 --- src/sbin/dump_lfs/lfs_inode.c:1.23 Sun Aug 2 18:18:09 2015 +++ src/sbin/dump_lfs/lfs_inode.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_inode.c,v 1.23 2015/08/02 18:18:09 dholland Exp $ */ +/* $NetBSD: lfs_inode.c,v 1.24 2015/08/12 18:25:52 dholland Exp $ */ /*- * Copyright (c) 1980, 1991, 1993, 1994 @@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 19 #if 0 static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 5/1/95"; #else -__RCSID("$NetBSD: lfs_inode.c,v 1.23 2015/08/02 18:18:09 dholland Exp $"); +__RCSID("$NetBSD: lfs_inode.c,v 1.24 2015/08/12 18:25:52 dholland Exp $"); #endif #endif /* not lint */ @@ -59,8 +59,6 @@ __RCSID("$NetBSD: lfs_inode.c,v 1.23 201 #include "dump.h" #undef di_inumber -#define MAXIFPB (MAXBSIZE / sizeof(IFILE)) - #define HASDUMPEDFILE 0x1 #define HASSUBDIRS 0x2 @@ -278,15 +276,16 @@ lfs_bmap(struct lfs *fs, struct ulfs1_di return (daddr_t)((int32_t *)bp)[off]; } -static struct ifile * +static IFILE * lfs_ientry(ino_t ino) { - static struct ifile ifileblock[MAXIFPB]; + static char ifileblock[MAXBSIZE]; static daddr_t ifblkno; daddr_t lbn; daddr_t blkno; union dinode *dp; struct ulfs1_dinode *ldp; + unsigned index; lbn = ino/lfs_sb_getifpb(sblock) + lfs_sb_getcleansz(sblock) + lfs_sb_getsegtabsz(sblock); dp = getino(lfs_sb_getifile(sblock)); @@ -294,9 +293,16 @@ lfs_ientry(ino_t ino) ldp = (struct ulfs1_dinode *)dp; blkno = lfs_bmap(sblock, ldp ,lbn); if (blkno != ifblkno) - bread(LFS_FSBTODB(sblock, blkno), (char *)ifileblock, + bread(LFS_FSBTODB(sblock, blkno), ifileblock, lfs_sb_getbsize(sblock)); - return ifileblock + (ino % lfs_sb_getifpb(sblock)); + index = ino % lfs_sb_getifpb(sblock); + if (sblock->lfs_is64) { + return (IFILE *) &((IFILE64 *)ifileblock)[index]; + } else if (lfs_sb_getversion(sblock) > 1) { + return (IFILE *) &((IFILE32 *)ifileblock)[index]; + } else { + return (IFILE *) &((IFILE_V1 *)ifileblock)[index]; + } } /* Search a block for a specific dinode. */ @@ -334,7 +340,7 @@ getino(ino_t inum) } curino = inum; - blkno = lfs_ientry(inum)->if_daddr; + blkno = lfs_if_getdaddr(sblock, lfs_ientry(inum)); if(blkno == LFS_UNUSED_DADDR) return &empty_dinode; Index: src/sbin/fsck_lfs/inode.c diff -u src/sbin/fsck_lfs/inode.c:1.57 src/sbin/fsck_lfs/inode.c:1.58 --- src/sbin/fsck_lfs/inode.c:1.57 Tue Jul 28 05:09:34 2015 +++ src/sbin/fsck_lfs/inode.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: inode.c,v 1.57 2015/07/28 05:09:34 dholland Exp $ */ +/* $NetBSD: inode.c,v 1.58 2015/08/12 18:25:52 dholland Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -104,6 +104,8 @@ ginode(ino_t ino) struct uvnode *vp; struct ubuf *bp; IFILE *ifp; + daddr_t daddr; + unsigned segno; vp = vget(fs, ino); if (vp == NULL) @@ -111,8 +113,10 @@ ginode(ino_t ino) if (din_table[ino] == 0x0) { LFS_IENTRY(ifp, fs, ino, bp); - din_table[ino] = ifp->if_daddr; - seg_table[lfs_dtosn(fs, ifp->if_daddr)].su_nbytes += LFS_DINODE1_SIZE; + daddr = lfs_if_getdaddr(fs, ifp); + segno = lfs_dtosn(fs, daddr); + din_table[ino] = daddr; + seg_table[segno].su_nbytes += LFS_DINODE1_SIZE; brelse(bp, 0); } return (VTOI(vp)->i_din.ffs1_din); @@ -458,13 +462,13 @@ clearinode(ino_t inumber) /* Send cleared inode to the free list */ LFS_IENTRY(ifp, fs, inumber, bp); - daddr = ifp->if_daddr; + daddr = lfs_if_getdaddr(fs, ifp); if (daddr == LFS_UNUSED_DADDR) { brelse(bp, 0); return; } - ifp->if_daddr = LFS_UNUSED_DADDR; - ifp->if_nextfree = lfs_sb_getfreehd(fs); + lfs_if_setdaddr(fs, ifp, LFS_UNUSED_DADDR); + lfs_if_setnextfree(fs, ifp, lfs_sb_getfreehd(fs)); lfs_sb_setfreehd(fs, inumber); sbdirty(); VOP_BWRITE(bp); Index: src/sbin/fsck_lfs/lfs.c diff -u src/sbin/fsck_lfs/lfs.c:1.52 src/sbin/fsck_lfs/lfs.c:1.53 --- src/sbin/fsck_lfs/lfs.c:1.52 Sun Aug 2 18:18:09 2015 +++ src/sbin/fsck_lfs/lfs.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs.c,v 1.52 2015/08/02 18:18:09 dholland Exp $ */ +/* $NetBSD: lfs.c,v 1.53 2015/08/12 18:25:52 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. * All rights reserved. @@ -415,7 +415,7 @@ lfs_vget(void *vfs, ino_t ino) IFILE *ifp; LFS_IENTRY(ifp, fs, ino, bp); - daddr = ifp->if_daddr; + daddr = lfs_if_getdaddr(fs, ifp); brelse(bp, 0); if (daddr <= 0 || lfs_dtosn(fs, daddr) >= lfs_sb_getnseg(fs)) return NULL; @@ -864,7 +864,7 @@ struct uvnode * lfs_valloc(struct lfs *fs, ino_t ino) { struct ubuf *bp, *cbp; - struct ifile *ifp; + IFILE *ifp; ino_t new_ino; int error; CLEANERINFO *cip; @@ -877,9 +877,9 @@ lfs_valloc(struct lfs *fs, ino_t ino) * of the free list into the superblock. */ LFS_IENTRY(ifp, fs, new_ino, bp); - if (ifp->if_daddr != LFS_UNUSED_DADDR) + if (lfs_if_getdaddr(fs, ifp) != LFS_UNUSED_DADDR) panic("lfs_valloc: inuse inode %d on the free list", new_ino); - LFS_PUT_HEADFREE(fs, cip, cbp, ifp->if_nextfree); + LFS_PUT_HEADFREE(fs, cip, cbp, lfs_if_getnextfree(fs, ifp)); brelse(bp, 0); @@ -910,7 +910,8 @@ extend_ifile(struct lfs *fs) { struct uvnode *vp; struct inode *ip; - IFILE *ifp; + IFILE64 *ifp64; + IFILE32 *ifp32; IFILE_V1 *ifp_v1; struct ubuf *bp, *cbp; daddr_t i, blkno, max; @@ -932,7 +933,23 @@ extend_ifile(struct lfs *fs) max = i + lfs_sb_getifpb(fs); lfs_sb_subbfree(fs, lfs_btofsb(fs, lfs_sb_getbsize(fs))); - if (lfs_sb_getversion(fs) == 1) { + if (fs->lfs_is64) { + for (ifp64 = (IFILE64 *)bp->b_data; i < max; ++ifp64) { + ifp64->if_version = 1; + ifp64->if_daddr = LFS_UNUSED_DADDR; + ifp64->if_nextfree = ++i; + } + ifp64--; + ifp64->if_nextfree = oldlast; + } else if (lfs_sb_getversion(fs) > 1) { + for (ifp32 = (IFILE32 *)bp->b_data; i < max; ++ifp32) { + ifp32->if_version = 1; + ifp32->if_daddr = LFS_UNUSED_DADDR; + ifp32->if_nextfree = ++i; + } + ifp32--; + ifp32->if_nextfree = oldlast; + } else { for (ifp_v1 = (IFILE_V1 *)bp->b_data; i < max; ++ifp_v1) { ifp_v1->if_version = 1; ifp_v1->if_daddr = LFS_UNUSED_DADDR; @@ -940,14 +957,6 @@ extend_ifile(struct lfs *fs) } ifp_v1--; ifp_v1->if_nextfree = oldlast; - } else { - for (ifp = (IFILE *)bp->b_data; i < max; ++ifp) { - ifp->if_version = 1; - ifp->if_daddr = LFS_UNUSED_DADDR; - ifp->if_nextfree = ++i; - } - ifp--; - ifp->if_nextfree = oldlast; } LFS_PUT_TAILFREE(fs, cip, cbp, max - 1); Index: src/sbin/fsck_lfs/pass0.c diff -u src/sbin/fsck_lfs/pass0.c:1.38 src/sbin/fsck_lfs/pass0.c:1.39 --- src/sbin/fsck_lfs/pass0.c:1.38 Wed Aug 12 18:25:03 2015 +++ src/sbin/fsck_lfs/pass0.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: pass0.c,v 1.38 2015/08/12 18:25:03 dholland Exp $ */ +/* $NetBSD: pass0.c,v 1.39 2015/08/12 18:25:52 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -133,15 +133,15 @@ pass0(void) if (preen || reply("FIX") == 1) { /* plastino can't be zero */ LFS_IENTRY(ifp, fs, plastino, bp); - ifp->if_nextfree = 0; + lfs_if_setnextfree(fs, ifp, 0); VOP_BWRITE(bp); } break; } visited[ino] = 1; LFS_IENTRY(ifp, fs, ino, bp); - nextino = ifp->if_nextfree; - daddr = ifp->if_daddr; + nextino = lfs_if_getnextfree(fs, ifp); + daddr = lfs_if_getdaddr(fs, ifp); brelse(bp, 0); if (daddr) { pwarn("INO %llu WITH DADDR 0x%llx ON FREE LIST\n", @@ -152,7 +152,7 @@ pass0(void) sbdirty(); } else { LFS_IENTRY(ifp, fs, plastino, bp); - ifp->if_nextfree = nextino; + lfs_if_setnextfree(fs, ifp, nextino); VOP_BWRITE(bp); } ino = nextino; @@ -172,7 +172,7 @@ pass0(void) continue; LFS_IENTRY(ifp, fs, ino, bp); - if (ifp->if_daddr) { + if (lfs_if_getdaddr(fs, ifp)) { brelse(bp, 0); continue; } @@ -180,7 +180,7 @@ pass0(void) (unsigned long long)ino); if (preen || reply("FIX") == 1) { assert(ino != freehd); - ifp->if_nextfree = freehd; + lfs_if_setnextfree(fs, ifp, freehd); VOP_BWRITE(bp); freehd = ino; Index: src/sbin/fsck_lfs/pass6.c diff -u src/sbin/fsck_lfs/pass6.c:1.38 src/sbin/fsck_lfs/pass6.c:1.39 --- src/sbin/fsck_lfs/pass6.c:1.38 Sun Aug 2 18:08:12 2015 +++ src/sbin/fsck_lfs/pass6.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: pass6.c,v 1.38 2015/08/02 18:08:12 dholland Exp $ */ +/* $NetBSD: pass6.c,v 1.39 2015/08/12 18:25:52 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -210,6 +210,7 @@ static void remove_ino(struct uvnode *vp, ino_t ino) { IFILE *ifp; + ino_t nextfree; SEGUSE *sup; CLEANERINFO *cip; struct ubuf *bp, *sbp, *cbp; @@ -220,11 +221,12 @@ remove_ino(struct uvnode *vp, ino_t ino) pwarn("remove ino %d\n", (int)ino); LFS_IENTRY(ifp, fs, ino, bp); - daddr = ifp->if_daddr; + daddr = lfs_if_getdaddr(fs, ifp); if (daddr > 0) { - ifp->if_daddr = 0x0; + lfs_if_setdaddr(fs, ifp, 0); - LFS_GET_HEADFREE(fs, cip, cbp, &(ifp->if_nextfree)); + LFS_GET_HEADFREE(fs, cip, cbp, &nextfree); + lfs_if_setnextfree(fs, ifp, nextfree); VOP_BWRITE(bp); LFS_PUT_HEADFREE(fs, cip, cbp, ino); sbdirty(); @@ -431,9 +433,9 @@ readdress_inode(struct ulfs1_dinode *dp, /* Move ifile pointer to this location */ LFS_IENTRY(ifp, fs, thisino, bp); - odaddr = ifp->if_daddr; + odaddr = lfs_if_getdaddr(fs, ifp); assert(odaddr != 0); - ifp->if_daddr = daddr; + lfs_if_setdaddr(fs, ifp, daddr); VOP_BWRITE(bp); if (debug) @@ -481,13 +483,13 @@ alloc_inode(ino_t thisino, ulfs_daddr_t } LFS_IENTRY(ifp, fs, thisino, bp); - if (ifp->if_daddr != 0) { + if (lfs_if_getdaddr(fs, ifp) != 0) { pwarn("allocated inode %lld already allocated\n", (long long)thisino); } - nextfree = ifp->if_nextfree; - ifp->if_nextfree = 0; - ifp->if_daddr = daddr; + nextfree = lfs_if_getnextfree(fs, ifp); + lfs_if_setnextfree(fs, ifp, 0); + lfs_if_setdaddr(fs, ifp, daddr); VOP_BWRITE(bp); LFS_GET_HEADFREE(fs, cip, cbp, &oldhead); @@ -502,15 +504,15 @@ alloc_inode(ino_t thisino, ulfs_daddr_t ino = oldhead; while (ino) { LFS_IENTRY(ifp, fs, ino, bp); - assert(ifp->if_nextfree != ino); - if (ifp->if_nextfree == thisino) { - ifp->if_nextfree = nextfree; + assert(lfs_if_getnextfree(fs, ifp) != ino); + if (lfs_if_getnextfree(fs, ifp) == thisino) { + lfs_if_setnextfree(fs, ifp, nextfree); VOP_BWRITE(bp); if (nextfree == 0) LFS_PUT_TAILFREE(fs, cip, cbp, ino); break; } else - ino = ifp->if_nextfree; + ino = lfs_if_getnextfree(fs, ifp); brelse(bp, 0); } } Index: src/sbin/fsck_lfs/pass1.c diff -u src/sbin/fsck_lfs/pass1.c:1.40 src/sbin/fsck_lfs/pass1.c:1.41 --- src/sbin/fsck_lfs/pass1.c:1.40 Tue Jul 28 05:09:34 2015 +++ src/sbin/fsck_lfs/pass1.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: pass1.c,v 1.40 2015/07/28 05:09:34 dholland Exp $ */ +/* $NetBSD: pass1.c,v 1.41 2015/08/12 18:25:52 dholland Exp $ */ /* * Copyright (c) 1980, 1986, 1993 @@ -91,7 +91,7 @@ pass1(void) int i; struct inodesc idesc; struct ulfs1_dinode *tinode; - struct ifile *ifp; + IFILE *ifp; struct ubuf *bp; struct ino_daddr **dins; @@ -116,7 +116,7 @@ pass1(void) dins[i]->daddr = lfs_sb_getidaddr(fs); else { LFS_IENTRY(ifp, fs, i, bp); - dins[i]->daddr = ifp->if_daddr; + dins[i]->daddr = lfs_if_getdaddr(fs, ifp); brelse(bp, 0); } } @@ -281,7 +281,7 @@ checkinode(ino_t inumber, struct inodesc */ if (dp->di_nlink <= 0) { LFS_IENTRY(ifp, fs, inumber, bp); - if (ifp->if_nextfree == LFS_ORPHAN_NEXTFREE) { + if (lfs_if_getnextfree(fs, ifp) == LFS_ORPHAN_NEXTFREE) { statemap[inumber] = (mode == LFS_IFDIR ? DCLEAR : FCLEAR); /* Add this to our list of orphans */ zlnp = emalloc(sizeof *zlnp); Index: src/sbin/fsck_lfs/segwrite.c diff -u src/sbin/fsck_lfs/segwrite.c:1.37 src/sbin/fsck_lfs/segwrite.c:1.38 --- src/sbin/fsck_lfs/segwrite.c:1.37 Wed Aug 12 18:25:03 2015 +++ src/sbin/fsck_lfs/segwrite.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: segwrite.c,v 1.37 2015/08/12 18:25:03 dholland Exp $ */ +/* $NetBSD: segwrite.c,v 1.38 2015/08/12 18:25:52 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. * All rights reserved. @@ -216,7 +216,7 @@ lfs_writefile(struct lfs * fs, struct se fip->fi_nblocks = 0; fip->fi_ino = ip->i_number; LFS_IENTRY(ifp, fs, fip->fi_ino, bp); - fip->fi_version = ifp->if_version; + fip->fi_version = lfs_if_getversion(fs, ifp); brelse(bp, 0); lfs_gather(fs, sp, vp, lfs_match_data); @@ -323,7 +323,7 @@ lfs_writeinode(struct lfs * fs, struct s /* * If updating the ifile, update the super-block. Update the disk - * address and access times for this inode in the ifile. + * address for this inode in the ifile. */ ino = ip->i_number; if (ino == LFS_IFILE_INUM) { @@ -332,8 +332,8 @@ lfs_writeinode(struct lfs * fs, struct s sbdirty(); } else { LFS_IENTRY(ifp, fs, ino, ibp); - daddr = ifp->if_daddr; - ifp->if_daddr = LFS_DBTOFSB(fs, bp->b_blkno) + fsb; + daddr = lfs_if_getdaddr(fs, ifp); + lfs_if_setdaddr(fs, ifp, LFS_DBTOFSB(fs, bp->b_blkno) + fsb); (void)LFS_BWRITE_LOG(ibp); /* Ifile */ } Index: src/sbin/newfs_lfs/make_lfs.c diff -u src/sbin/newfs_lfs/make_lfs.c:1.41 src/sbin/newfs_lfs/make_lfs.c:1.42 --- src/sbin/newfs_lfs/make_lfs.c:1.41 Wed Aug 12 18:25:03 2015 +++ src/sbin/newfs_lfs/make_lfs.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: make_lfs.c,v 1.41 2015/08/12 18:25:03 dholland Exp $ */ +/* $NetBSD: make_lfs.c,v 1.42 2015/08/12 18:25:52 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -62,7 +62,7 @@ #if 0 static char sccsid[] = "@(#)lfs.c 8.5 (Berkeley) 5/24/95"; #else -__RCSID("$NetBSD: make_lfs.c,v 1.41 2015/08/12 18:25:03 dholland Exp $"); +__RCSID("$NetBSD: make_lfs.c,v 1.42 2015/08/12 18:25:52 dholland Exp $"); #endif #endif /* not lint */ @@ -135,7 +135,7 @@ static const struct dlfs dlfs32_default .dlfs_maxfilesize = 0, .dlfs_fsbpseg = 0, .dlfs_inopb = DFL_LFSBLOCK/sizeof(struct ulfs1_dinode), - .dlfs_ifpb = DFL_LFSBLOCK/sizeof(IFILE), + .dlfs_ifpb = DFL_LFSBLOCK/sizeof(IFILE32), .dlfs_sepb = DFL_LFSBLOCK/sizeof(SEGUSE), /* XXX ondisk32 */ .dlfs_nindir = DFL_LFSBLOCK/sizeof(int32_t), @@ -201,7 +201,7 @@ static const struct dlfs64 dlfs64_defaul .dlfs_maxfilesize = 0, .dlfs_fsbpseg = 0, .dlfs_inopb = DFL_LFSBLOCK/sizeof(struct ulfs1_dinode), - .dlfs_ifpb = DFL_LFSBLOCK/sizeof(IFILE), + .dlfs_ifpb = DFL_LFSBLOCK/sizeof(IFILE64), .dlfs_sepb = DFL_LFSBLOCK/sizeof(SEGUSE), .dlfs_nindir = DFL_LFSBLOCK/sizeof(int64_t), .dlfs_nseg = 0, @@ -365,7 +365,9 @@ make_lfs(int devfd, uint secsize, struct { struct ulfs1_dinode *dip; /* Pointer to a disk inode */ CLEANERINFO *cip; /* Segment cleaner information table */ - IFILE *ip; /* Pointer to array of ifile structures */ + IFILE *ipall; /* Pointer to array of ifile structures */ + IFILE64 *ip64 = NULL; + IFILE32 *ip32 = NULL; IFILE_V1 *ip_v1 = NULL; struct lfs *fs; /* Superblock */ SEGUSE *segp; /* Segment usage table */ @@ -803,25 +805,52 @@ make_lfs(int devfd, uint secsize, struct #endif /* MAKE_LF_DIR */ /* Set their IFILE entry version numbers to 1 */ - LFS_IENTRY(ip, fs, 1, bp); - if (version == 1) { - ip_v1 = (IFILE_V1 *)ip; + LFS_IENTRY(ipall, fs, 1, bp); + if (is64) { + ip64 = &ipall->u_64; + for (i = LFS_IFILE_INUM; i <= HIGHEST_USED_INO; i++) { + ip64->if_version = 1; + ip64->if_daddr = 0x0; + ip64->if_nextfree = 0; + ++ip64; + } + } else if (version > 1) { + ip32 = &ipall->u_32; + for (i = LFS_IFILE_INUM; i <= HIGHEST_USED_INO; i++) { + ip32->if_version = 1; + ip32->if_daddr = 0x0; + ip32->if_nextfree = 0; + ++ip32; + } + } else { + ip_v1 = &ipall->u_v1; for (i = LFS_IFILE_INUM; i <= HIGHEST_USED_INO; i++) { ip_v1->if_version = 1; ip_v1->if_daddr = 0x0; ip_v1->if_nextfree = 0; ++ip_v1; } - } else { - for (i = LFS_IFILE_INUM; i <= HIGHEST_USED_INO; i++) { - ip->if_version = 1; - ip->if_daddr = 0x0; - ip->if_nextfree = 0; - ++ip; - } } /* Link remaining IFILE entries in free list */ - if (version == 1) { + if (is64) { + for (; + i < lfs_sb_getifpb(fs); ++ip64) { + ip64->if_version = 1; + ip64->if_daddr = LFS_UNUSED_DADDR; + ip64->if_nextfree = ++i; + } + --ip64; + ip64->if_nextfree = LFS_UNUSED_INUM; + } else if (version > 1) { + for (; + i < lfs_sb_getifpb(fs); ++ip32) { + ip32->if_version = 1; + ip32->if_daddr = LFS_UNUSED_DADDR; + ip32->if_nextfree = ++i; + } + --ip32; + ip32->if_nextfree = LFS_UNUSED_INUM; + } else { for (; i < lfs_sb_getifpb(fs); ++ip_v1) { ip_v1->if_version = 1; @@ -830,15 +859,6 @@ make_lfs(int devfd, uint secsize, struct } --ip_v1; ip_v1->if_nextfree = LFS_UNUSED_INUM; - } else { - for (; - i < lfs_sb_getifpb(fs); ++ip) { - ip->if_version = 1; - ip->if_daddr = LFS_UNUSED_DADDR; - ip->if_nextfree = ++i; - } - --ip; - ip->if_nextfree = LFS_UNUSED_INUM; } VOP_BWRITE(bp); Index: src/sys/lib/libsa/lfsv1.c diff -u src/sys/lib/libsa/lfsv1.c:1.12 src/sys/lib/libsa/lfsv1.c:1.13 --- src/sys/lib/libsa/lfsv1.c:1.12 Sun Aug 2 18:18:09 2015 +++ src/sys/lib/libsa/lfsv1.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfsv1.c,v 1.12 2015/08/02 18:18:09 dholland Exp $ */ +/* $NetBSD: lfsv1.c,v 1.13 2015/08/12 18:25:52 dholland Exp $ */ #define LIBSA_LFS #define REQUIRED_LFS_VERSION 1 @@ -16,7 +16,6 @@ #define ufs_dinode ulfs1_dinode #define fs_bsize lfs_dlfs_u.u_32.dlfs_ibsize -#define IFILE_Vx IFILE_V1 #define INOPBx(fs) LFS_INOPB(fs) Index: src/sys/lib/libsa/lfsv2.c diff -u src/sys/lib/libsa/lfsv2.c:1.12 src/sys/lib/libsa/lfsv2.c:1.13 --- src/sys/lib/libsa/lfsv2.c:1.12 Sun Aug 2 18:18:09 2015 +++ src/sys/lib/libsa/lfsv2.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfsv2.c,v 1.12 2015/08/02 18:18:09 dholland Exp $ */ +/* $NetBSD: lfsv2.c,v 1.13 2015/08/12 18:25:52 dholland Exp $ */ #define LIBSA_LFS #define REQUIRED_LFS_VERSION 2 @@ -16,7 +16,6 @@ #define ufs_dinode ulfs1_dinode #define fs_bsize lfs_dlfs_u.u_32.dlfs_bsize -#define IFILE_Vx IFILE #ifdef LFS_IFILE_FRAG_ADDRESSING /* XXX see sys/ufs/lfs/ -- not tested */ #define INOPBx(fs) LFS_INOPF(fs) Index: src/sys/lib/libsa/ufs.c diff -u src/sys/lib/libsa/ufs.c:1.70 src/sys/lib/libsa/ufs.c:1.71 --- src/sys/lib/libsa/ufs.c:1.70 Sun Aug 2 18:18:09 2015 +++ src/sys/lib/libsa/ufs.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ufs.c,v 1.70 2015/08/02 18:18:09 dholland Exp $ */ +/* $NetBSD: ufs.c,v 1.71 2015/08/12 18:25:52 dholland Exp $ */ /*- * Copyright (c) 1993 @@ -212,24 +212,27 @@ find_inode_sector(ino32_t inumber, struc daddr_t ifileent_blkno; char *ent_in_buf; size_t buf_after_ent; + size_t entsize; int rc; rc = read_inode(lfs_sb_getifile(fs), f); if (rc) return rc; + entsize = fs->lfs_is64 ? sizeof(IFILE64) : + (lfs_sb_getversion(fs) > 1 ? sizeof(IFILE32) : sizeof(IFILE_V1)); ifileent_blkno = (inumber / lfs_sb_getifpb(fs)) + lfs_sb_getcleansz(fs) + lfs_sb_getsegtabsz(fs); fp->f_seekp = (off_t)ifileent_blkno * lfs_sb_getbsize(fs) + - (inumber % lfs_sb_getifpb(fs)) * sizeof (IFILE_Vx); + (inumber % lfs_sb_getifpb(fs)) * entsize; rc = buf_read_file(f, &ent_in_buf, &buf_after_ent); if (rc) return rc; /* make sure something's not badly wrong, but don't panic. */ - if (buf_after_ent < sizeof (IFILE_Vx)) + if (buf_after_ent < entsize) return EINVAL; - *isp = FSBTODB(fs, ((IFILE_Vx *)ent_in_buf)->if_daddr); + *isp = FSBTODB(fs, lfs_if_getdaddr(fs, (IFILE *)ent_in_buf)); if (*isp == LFS_UNUSED_DADDR) /* again, something badly wrong */ return EINVAL; return 0; Index: src/sys/ufs/lfs/lfs.h diff -u src/sys/ufs/lfs/lfs.h:1.175 src/sys/ufs/lfs/lfs.h:1.176 --- src/sys/ufs/lfs/lfs.h:1.175 Wed Aug 12 18:25:04 2015 +++ src/sys/ufs/lfs/lfs.h Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs.h,v 1.175 2015/08/12 18:25:04 dholland Exp $ */ +/* $NetBSD: lfs.h,v 1.176 2015/08/12 18:25:52 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 */ @@ -486,12 +486,26 @@ struct finfo { /* * Index file inode entries. */ -typedef struct ifile IFILE; -struct ifile { - u_int32_t if_version; /* inode version number */ + +/* magic value for daddrs */ #define LFS_UNUSED_DADDR 0 /* out-of-band daddr */ - int32_t if_daddr; /* inode disk address */ +/* magic value for if_nextfree */ #define LFS_ORPHAN_NEXTFREE (~(u_int32_t)0) /* indicate orphaned file */ + +typedef struct ifile64 IFILE64; +struct ifile64 { + u_int32_t if_version; /* inode version number */ + u_int32_t if_pad; /* 64-bit alignment padding */ + int64_t if_daddr; /* inode disk address */ + u_int64_t if_nextfree; /* next-unallocated inode */ + u_int32_t if_atime_sec; /* Last access time, seconds */ + u_int32_t if_atime_nsec; /* and nanoseconds */ +}; + +typedef struct ifile32 IFILE32; +struct ifile32 { + u_int32_t if_version; /* inode version number */ + int32_t if_daddr; /* inode disk address */ u_int32_t if_nextfree; /* next-unallocated inode */ u_int32_t if_atime_sec; /* Last access time, seconds */ u_int32_t if_atime_nsec; /* and nanoseconds */ @@ -503,11 +517,23 @@ struct ifile_v1 { int32_t if_daddr; /* inode disk address */ u_int32_t if_nextfree; /* next-unallocated inode */ #if LFS_ATIME_IFILE +#error "this cannot work" struct timespec if_atime; /* Last access time */ #endif }; /* + * Note: struct ifile_v1 is often handled by accessing the first three + * fields of struct ifile32. (XXX: Blah. This should be cleaned up as + * it may in some cases violate the strict-aliasing rules.) + */ +typedef union ifile { + struct ifile64 u_64; + struct ifile32 u_32; + struct ifile_v1 u_v1; +} IFILE; + +/* * Cleaner information structure. This resides in the ifile and is used * to pass information from the kernel to the cleaner. */ Index: src/sys/ufs/lfs/lfs_accessors.h diff -u src/sys/ufs/lfs/lfs_accessors.h:1.9 src/sys/ufs/lfs/lfs_accessors.h:1.10 --- src/sys/ufs/lfs/lfs_accessors.h:1.9 Wed Aug 12 18:25:04 2015 +++ src/sys/ufs/lfs/lfs_accessors.h Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_accessors.h,v 1.9 2015/08/12 18:25:04 dholland Exp $ */ +/* $NetBSD: lfs_accessors.h,v 1.10 2015/08/12 18:25:52 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 */ @@ -289,14 +289,49 @@ (IN) / lfs_sb_getifpb(F) + lfs_sb_getcleansz(F) + lfs_sb_getsegtabsz(F), \ lfs_sb_getbsize(F), 0, &(BP))) != 0) \ panic("lfs: ifile ino %d read %d", (int)(IN), _e); \ - if (lfs_sb_getversion(F) == 1) \ + if ((F)->lfs_is64) { \ + (IP) = (IFILE *)((IFILE64 *)(BP)->b_data + \ + (IN) % lfs_sb_getifpb(F)); \ + } else if (lfs_sb_getversion(F) > 1) { \ + (IP) = (IFILE *)((IFILE32 *)(BP)->b_data + \ + (IN) % lfs_sb_getifpb(F)); \ + } else { \ (IP) = (IFILE *)((IFILE_V1 *)(BP)->b_data + \ (IN) % lfs_sb_getifpb(F)); \ - else \ - (IP) = (IFILE *)(BP)->b_data + (IN) % lfs_sb_getifpb(F); \ + } \ UNSHARE_IFLOCK(F); \ } while (0) +#define LFS_DEF_IF_ACCESSOR(type, type32, field) \ + static __unused inline type \ + lfs_if_get##field(STRUCT_LFS *fs, IFILE *ifp) \ + { \ + if (fs->lfs_is64) { \ + return ifp->u_64.if_##field; \ + } else { \ + return ifp->u_32.if_##field; \ + } \ + } \ + static __unused inline void \ + lfs_if_set##field(STRUCT_LFS *fs, IFILE *ifp, type val) \ + { \ + if (fs->lfs_is64) { \ + type *p = &ifp->u_64.if_##field; \ + (void)p; \ + ifp->u_64.if_##field = val; \ + } else { \ + type32 *p = &ifp->u_32.if_##field; \ + (void)p; \ + ifp->u_32.if_##field = val; \ + } \ + } \ + +LFS_DEF_IF_ACCESSOR(u_int32_t, u_int32_t, version); +LFS_DEF_IF_ACCESSOR(int64_t, int32_t, daddr); +LFS_DEF_IF_ACCESSOR(u_int64_t, u_int32_t, nextfree); +LFS_DEF_IF_ACCESSOR(u_int32_t, u_int32_t, atime_sec); +LFS_DEF_IF_ACCESSOR(u_int32_t, u_int32_t, atime_nsec); + /* * Cleaner information structure. This resides in the ifile and is used * to pass information from the kernel to the cleaner. Index: src/sys/ufs/lfs/lfs_alloc.c diff -u src/sys/ufs/lfs/lfs_alloc.c:1.125 src/sys/ufs/lfs/lfs_alloc.c:1.126 --- src/sys/ufs/lfs/lfs_alloc.c:1.125 Sun Aug 2 18:14:16 2015 +++ src/sys/ufs/lfs/lfs_alloc.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_alloc.c,v 1.125 2015/08/02 18:14:16 dholland Exp $ */ +/* $NetBSD: lfs_alloc.c,v 1.126 2015/08/12 18:25:52 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_alloc.c,v 1.125 2015/08/02 18:14:16 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_alloc.c,v 1.126 2015/08/12 18:25:52 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_quota.h" @@ -116,7 +116,8 @@ lfs_extend_ifile(struct lfs *fs, kauth_c { struct vnode *vp; struct inode *ip; - IFILE *ifp; + IFILE64 *ifp64; + IFILE32 *ifp32; IFILE_V1 *ifp_v1; struct buf *bp, *cbp; int error; @@ -161,7 +162,25 @@ lfs_extend_ifile(struct lfs *fs, kauth_c #endif /* DIAGNOSTIC */ xmax = i + lfs_sb_getifpb(fs); - if (lfs_sb_getversion(fs) == 1) { + if (fs->lfs_is64) { + for (ifp64 = (IFILE64 *)bp->b_data; i < xmax; ++ifp64) { + SET_BITMAP_FREE(fs, i); + ifp64->if_version = 1; + ifp64->if_daddr = LFS_UNUSED_DADDR; + ifp64->if_nextfree = ++i; + } + ifp64--; + ifp64->if_nextfree = oldlast; + } else if (lfs_sb_getversion(fs) > 1) { + for (ifp32 = (IFILE32 *)bp->b_data; i < xmax; ++ifp32) { + SET_BITMAP_FREE(fs, i); + ifp32->if_version = 1; + ifp32->if_daddr = LFS_UNUSED_DADDR; + ifp32->if_nextfree = ++i; + } + ifp32--; + ifp32->if_nextfree = oldlast; + } else { for (ifp_v1 = (IFILE_V1 *)bp->b_data; i < xmax; ++ifp_v1) { SET_BITMAP_FREE(fs, i); ifp_v1->if_version = 1; @@ -170,15 +189,6 @@ lfs_extend_ifile(struct lfs *fs, kauth_c } ifp_v1--; ifp_v1->if_nextfree = oldlast; - } else { - for (ifp = (IFILE *)bp->b_data; i < xmax; ++ifp) { - SET_BITMAP_FREE(fs, i); - ifp->if_version = 1; - ifp->if_daddr = LFS_UNUSED_DADDR; - ifp->if_nextfree = ++i; - } - ifp--; - ifp->if_nextfree = oldlast; } LFS_PUT_TAILFREE(fs, cip, cbp, xmax - 1); @@ -196,7 +206,7 @@ lfs_valloc(struct vnode *pvp, int mode, { struct lfs *fs; struct buf *bp, *cbp; - struct ifile *ifp; + IFILE *ifp; int error; CLEANERINFO *cip; @@ -221,14 +231,15 @@ lfs_valloc(struct vnode *pvp, int mode, */ CLR_BITMAP_FREE(fs, *ino); LFS_IENTRY(ifp, fs, *ino, bp); - if (ifp->if_daddr != LFS_UNUSED_DADDR) + if (lfs_if_getdaddr(fs, ifp) != LFS_UNUSED_DADDR) panic("lfs_valloc: inuse inode %" PRId64 " on the free list", *ino); - LFS_PUT_HEADFREE(fs, cip, cbp, ifp->if_nextfree); - DLOG((DLOG_ALLOC, "lfs_valloc: headfree %" PRId64 " -> %u\n", - *ino, ifp->if_nextfree)); + LFS_PUT_HEADFREE(fs, cip, cbp, lfs_if_getnextfree(fs, ifp)); + DLOG((DLOG_ALLOC, "lfs_valloc: headfree %" PRId64 " -> %ju\n", + *ino, (uintmax_t)lfs_if_getnextfree(fs, ifp))); - *gen = ifp->if_version; /* version was updated by vfree */ + /* version was updated by vfree */ + *gen = lfs_if_getversion(fs, ifp); brelse(bp, 0); /* Extend IFILE so that the next lfs_valloc will succeed. */ @@ -274,28 +285,31 @@ lfs_valloc_fixed(struct lfs *fs, ino_t i } LFS_IENTRY(ifp, fs, ino, bp); - oldnext = ifp->if_nextfree; - ifp->if_version = vers; + oldnext = lfs_if_getnextfree(fs, ifp); + lfs_if_setversion(fs, ifp, vers); brelse(bp, 0); LFS_GET_HEADFREE(fs, cip, cbp, &ino); if (ino) { LFS_PUT_HEADFREE(fs, cip, cbp, oldnext); } else { + ino_t nextfree; + tino = ino; while (1) { LFS_IENTRY(ifp, fs, tino, bp); - if (ifp->if_nextfree == ino || - ifp->if_nextfree == LFS_UNUSED_INUM) + nextfree = lfs_if_getnextfree(fs, ifp); + if (nextfree == ino || + nextfree == LFS_UNUSED_INUM) break; - tino = ifp->if_nextfree; + tino = nextfree; brelse(bp, 0); } - if (ifp->if_nextfree == LFS_UNUSED_INUM) { + if (nextfree == LFS_UNUSED_INUM) { brelse(bp, 0); return ENOENT; } - ifp->if_nextfree = oldnext; + lfs_if_setnextfree(fs, ifp, oldnext); LFS_BWRITE_LOG(bp); } @@ -375,7 +389,7 @@ lfs_vfree(struct vnode *vp, ino_t ino, i SEGUSE *sup; CLEANERINFO *cip; struct buf *cbp, *bp; - struct ifile *ifp; + IFILE *ifp; struct inode *ip; struct lfs *fs; daddr_t old_iaddr; @@ -444,27 +458,33 @@ lfs_vfree(struct vnode *vp, ino_t ino, i */ SET_BITMAP_FREE(fs, ino); LFS_IENTRY(ifp, fs, ino, bp); - old_iaddr = ifp->if_daddr; - ifp->if_daddr = LFS_UNUSED_DADDR; - ++ifp->if_version; + old_iaddr = lfs_if_getdaddr(fs, ifp); + lfs_if_setdaddr(fs, ifp, LFS_UNUSED_DADDR); + lfs_if_setversion(fs, ifp, lfs_if_getversion(fs, ifp) + 1); if (lfs_sb_getversion(fs) == 1) { - LFS_GET_HEADFREE(fs, cip, cbp, &(ifp->if_nextfree)); + ino_t nextfree; + + LFS_GET_HEADFREE(fs, cip, cbp, &nextfree); + lfs_if_setnextfree(fs, ifp, nextfree); LFS_PUT_HEADFREE(fs, cip, cbp, ino); (void) LFS_BWRITE_LOG(bp); /* Ifile */ } else { ino_t tino, onf; - ifp->if_nextfree = LFS_UNUSED_INUM; + lfs_if_setnextfree(fs, ifp, LFS_UNUSED_INUM); (void) LFS_BWRITE_LOG(bp); /* Ifile */ tino = lfs_freelist_prev(fs, ino); if (tino == LFS_UNUSED_INUM) { + ino_t nextfree; + /* Nothing free below us, put us on the head */ LFS_IENTRY(ifp, fs, ino, bp); - LFS_GET_HEADFREE(fs, cip, cbp, &(ifp->if_nextfree)); + LFS_GET_HEADFREE(fs, cip, cbp, &nextfree); + lfs_if_setnextfree(fs, ifp, nextfree); LFS_PUT_HEADFREE(fs, cip, cbp, ino); DLOG((DLOG_ALLOC, "lfs_vfree: headfree %lld -> %lld\n", - (long long)ifp->if_nextfree, (long long)ino)); + (long long)nextfree, (long long)ino)); LFS_BWRITE_LOG(bp); /* Ifile */ /* If the list was empty, set tail too */ @@ -485,12 +505,12 @@ lfs_vfree(struct vnode *vp, ino_t ino, i " after %lld\n", ino, tino)); LFS_IENTRY(ifp, fs, tino, bp); - onf = ifp->if_nextfree; - ifp->if_nextfree = ino; + onf = lfs_if_getnextfree(fs, ifp); + lfs_if_setnextfree(fs, ifp, ino); LFS_BWRITE_LOG(bp); /* Ifile */ LFS_IENTRY(ifp, fs, ino, bp); - ifp->if_nextfree = onf; + lfs_if_setnextfree(fs, ifp, onf); LFS_BWRITE_LOG(bp); /* Ifile */ /* If we're last, put us on the tail */ @@ -574,30 +594,33 @@ lfs_order_freelist(struct lfs *fs) #ifdef notyet /* Address orphaned files */ - if (ifp->if_nextfree == LFS_ORPHAN_NEXTFREE && + if (lfs_if_getnextfree(fs, ifp) == LFS_ORPHAN_NEXTFREE && VFS_VGET(fs->lfs_ivnode->v_mount, ino, &vp) == 0) { + unsigned segno; + + segno = lfs_dtosn(fs, lfs_if_getdaddr(fs, ifp)); lfs_truncate(vp, 0, 0, NOCRED); vput(vp); - LFS_SEGENTRY(sup, fs, lfs_dtosn(fs, ifp->if_daddr), bp); - KASSERT(sup->su_nbytes >= DINODE1_SIZE); - sup->su_nbytes -= DINODE1_SIZE; - LFS_WRITESEGENTRY(sup, fs, lfs_dtosn(fs, ifp->if_daddr), bp); + LFS_SEGENTRY(sup, fs, segno, bp); + KASSERT(sup->su_nbytes >= LFS_DINODE1_SIZE); + sup->su_nbytes -= LFS_DINODE1_SIZE; + LFS_WRITESEGENTRY(sup, fs, segno, bp); /* Set up to fall through to next section */ - ifp->if_daddr = LFS_UNUSED_DADDR; + lfs_if_setdaddr(fs, ifp, LFS_UNUSED_DADDR); LFS_BWRITE_LOG(bp); LFS_IENTRY(ifp, fs, ino, bp); } #endif - if (ifp->if_daddr == LFS_UNUSED_DADDR) { + if (lfs_if_getdaddr(fs, ifp) == LFS_UNUSED_DADDR) { if (firstino == LFS_UNUSED_INUM) firstino = ino; else { brelse(bp, 0); LFS_IENTRY(ifp, fs, lastino, bp); - ifp->if_nextfree = ino; + lfs_if_setnextfree(fs, ifp, ino); LFS_BWRITE_LOG(bp); LFS_IENTRY(ifp, fs, ino, bp); @@ -624,6 +647,6 @@ lfs_orphan(struct lfs *fs, ino_t ino) struct buf *bp; LFS_IENTRY(ifp, fs, ino, bp); - ifp->if_nextfree = LFS_ORPHAN_NEXTFREE; + lfs_if_setnextfree(fs, ifp, LFS_ORPHAN_NEXTFREE); LFS_BWRITE_LOG(bp); } Index: src/sys/ufs/lfs/lfs_itimes.c diff -u src/sys/ufs/lfs/lfs_itimes.c:1.17 src/sys/ufs/lfs/lfs_itimes.c:1.18 --- src/sys/ufs/lfs/lfs_itimes.c:1.17 Sun Aug 2 18:14:16 2015 +++ src/sys/ufs/lfs/lfs_itimes.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_itimes.c,v 1.17 2015/08/02 18:14:16 dholland Exp $ */ +/* $NetBSD: lfs_itimes.c,v 1.18 2015/08/12 18:25:52 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc. @@ -29,7 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_itimes.c,v 1.17 2015/08/02 18:14:16 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_itimes.c,v 1.18 2015/08/12 18:25:52 dholland Exp $"); #include <sys/param.h> #include <sys/time.h> @@ -72,14 +72,14 @@ lfs_itimes(struct inode *ip, const struc #endif ip->i_ffs1_atime = acc->tv_sec; ip->i_ffs1_atimensec = acc->tv_nsec; - if (lfs_sb_getversion(ip->i_lfs) > 1) { + if (ip->i_lfs->lfs_is64 || lfs_sb_getversion(ip->i_lfs) > 1) { struct lfs *fs = ip->i_lfs; struct buf *ibp; IFILE *ifp; LFS_IENTRY(ifp, ip->i_lfs, ip->i_number, ibp); - ifp->if_atime_sec = acc->tv_sec; - ifp->if_atime_nsec = acc->tv_nsec; + lfs_if_setatime_sec(fs, ifp, acc->tv_sec); + lfs_if_setatime_nsec(fs, ifp, acc->tv_nsec); LFS_BWRITE_LOG(ibp); mutex_enter(&lfs_lock); fs->lfs_flags |= LFS_IFDIRTY; Index: src/sys/ufs/lfs/lfs_rfw.c diff -u src/sys/ufs/lfs/lfs_rfw.c:1.25 src/sys/ufs/lfs/lfs_rfw.c:1.26 --- src/sys/ufs/lfs/lfs_rfw.c:1.25 Sun Aug 2 18:14:16 2015 +++ src/sys/ufs/lfs/lfs_rfw.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_rfw.c,v 1.25 2015/08/02 18:14:16 dholland Exp $ */ +/* $NetBSD: lfs_rfw.c,v 1.26 2015/08/12 18:25:52 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.25 2015/08/02 18:14:16 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_rfw.c,v 1.26 2015/08/12 18:25:52 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_quota.h" @@ -311,8 +311,8 @@ update_inoblk(struct lfs *fs, daddr_t of /* Record change in location */ LFS_IENTRY(ifp, fs, dip->di_inumber, ibp); - daddr = ifp->if_daddr; - ifp->if_daddr = LFS_DBTOFSB(fs, dbp->b_blkno); + daddr = lfs_if_getdaddr(fs, ifp); + lfs_if_setdaddr(fs, ifp, LFS_DBTOFSB(fs, dbp->b_blkno)); error = LFS_BWRITE_LOG(ibp); /* Ifile */ /* And do segment accounting */ if (lfs_dtosn(fs, daddr) != lfs_dtosn(fs, LFS_DBTOFSB(fs, dbp->b_blkno))) { Index: src/sys/ufs/lfs/lfs_segment.c diff -u src/sys/ufs/lfs/lfs_segment.c:1.252 src/sys/ufs/lfs/lfs_segment.c:1.253 --- src/sys/ufs/lfs/lfs_segment.c:1.252 Wed Aug 12 18:25:04 2015 +++ src/sys/ufs/lfs/lfs_segment.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_segment.c,v 1.252 2015/08/12 18:25:04 dholland Exp $ */ +/* $NetBSD: lfs_segment.c,v 1.253 2015/08/12 18:25:52 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.252 2015/08/12 18:25:04 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.253 2015/08/12 18:25:52 dholland Exp $"); #define _VFS_VNODE_PRIVATE /* XXX: check for VI_MARKER, this has to go */ @@ -953,8 +953,8 @@ lfs_update_iaddr(struct lfs *fs, struct lfs_sb_setidaddr(fs, LFS_DBTOFSB(fs, ndaddr)); } else { LFS_IENTRY(ifp, fs, ino, bp); - daddr = ifp->if_daddr; - ifp->if_daddr = LFS_DBTOFSB(fs, ndaddr); + daddr = lfs_if_getdaddr(fs, ifp); + lfs_if_setdaddr(fs, ifp, LFS_DBTOFSB(fs, ndaddr)); (void)LFS_BWRITE_LOG(bp); /* Ifile */ } Index: src/sys/ufs/lfs/lfs_syscalls.c diff -u src/sys/ufs/lfs/lfs_syscalls.c:1.167 src/sys/ufs/lfs/lfs_syscalls.c:1.168 --- src/sys/ufs/lfs/lfs_syscalls.c:1.167 Wed Aug 12 18:25:04 2015 +++ src/sys/ufs/lfs/lfs_syscalls.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_syscalls.c,v 1.167 2015/08/12 18:25:04 dholland Exp $ */ +/* $NetBSD: lfs_syscalls.c,v 1.168 2015/08/12 18:25:52 dholland Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2002, 2003, 2007, 2007, 2008 @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.167 2015/08/12 18:25:04 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.168 2015/08/12 18:25:52 dholland Exp $"); #ifndef LFS # define LFS /* for prototypes in syscallargs.h */ @@ -355,7 +355,7 @@ lfs_markv(struct lwp *l, fsid_t *fsidp, /* XXX but only write the inode if it's the right one */ if (blkp->bi_inode != LFS_IFILE_INUM) { LFS_IENTRY(ifp, fs, blkp->bi_inode, bp); - if (ifp->if_daddr == blkp->bi_daddr) { + if (lfs_if_getdaddr(fs, ifp) == blkp->bi_daddr) { mutex_enter(&lfs_lock); LFS_SET_UINO(ip, IN_CLEANING); mutex_exit(&lfs_lock); @@ -697,7 +697,7 @@ lfs_bmapv(struct lwp *l, fsid_t *fsidp, v_daddr = lfs_sb_getidaddr(fs); else { LFS_IENTRY(ifp, fs, blkp->bi_inode, bp); - v_daddr = ifp->if_daddr; + v_daddr = lfs_if_getdaddr(fs, ifp); brelse(bp, 0); } if (v_daddr == LFS_UNUSED_DADDR) { Index: src/sys/ufs/lfs/lfs_vfsops.c diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.336 src/sys/ufs/lfs/lfs_vfsops.c:1.337 --- src/sys/ufs/lfs/lfs_vfsops.c:1.336 Wed Aug 12 18:25:04 2015 +++ src/sys/ufs/lfs/lfs_vfsops.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vfsops.c,v 1.336 2015/08/12 18:25:04 dholland Exp $ */ +/* $NetBSD: lfs_vfsops.c,v 1.337 2015/08/12 18:25:52 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.336 2015/08/12 18:25:04 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.337 2015/08/12 18:25:52 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_lfs.h" @@ -1525,7 +1525,7 @@ lfs_loadvnode(struct mount *mp, struct v struct ulfs1_dinode *dip; struct inode *ip; struct buf *bp; - struct ifile *ifp; + IFILE *ifp; struct ulfsmount *ump; ino_t ino; daddr_t daddr; @@ -1556,10 +1556,10 @@ lfs_loadvnode(struct mount *mp, struct v else { /* XXX bounds-check this too */ LFS_IENTRY(ifp, fs, ino, bp); - daddr = ifp->if_daddr; + daddr = lfs_if_getdaddr(fs, ifp); if (lfs_sb_getversion(fs) > 1) { - ts.tv_sec = ifp->if_atime_sec; - ts.tv_nsec = ifp->if_atime_nsec; + ts.tv_sec = lfs_if_getatime_sec(fs, ifp); + ts.tv_nsec = lfs_if_getatime_nsec(fs, ifp); } brelse(bp, 0); Index: src/usr.sbin/dumplfs/dumplfs.c diff -u src/usr.sbin/dumplfs/dumplfs.c:1.50 src/usr.sbin/dumplfs/dumplfs.c:1.51 --- src/usr.sbin/dumplfs/dumplfs.c:1.50 Wed Aug 12 18:25:04 2015 +++ src/usr.sbin/dumplfs/dumplfs.c Wed Aug 12 18:25:52 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dumplfs.c,v 1.50 2015/08/12 18:25:04 dholland Exp $ */ +/* $NetBSD: dumplfs.c,v 1.51 2015/08/12 18:25:52 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.50 2015/08/12 18:25:04 dholland Exp $"); +__RCSID("$NetBSD: dumplfs.c,v 1.51 2015/08/12 18:25:52 dholland Exp $"); #endif #endif /* not lint */ @@ -115,15 +115,23 @@ print_suentry(int i, SEGUSE *sp, struct (void)printf("inum\tstatus\tversion\tdaddr\t\tfreeptr\n") static inline void -print_ientry(int i, IFILE *ip) +print_ientry(int i, struct lfs *lfsp, IFILE *ip) { - if (ip->if_daddr == LFS_UNUSED_DADDR) - printf("%d\tFREE\t%d\t \t\t%llu\n", i, ip->if_version, - (unsigned long long)ip->if_nextfree); + uint32_t version; + daddr_t daddr; + ino_t nextfree; + + version = lfs_if_getversion(lfsp, ip); + daddr = lfs_if_getdaddr(lfsp, ip); + nextfree = lfs_if_getnextfree(lfsp, ip); + + if (daddr == LFS_UNUSED_DADDR) + printf("%d\tFREE\t%u\t \t\t%ju\n", i, version, + (uintmax_t)nextfree); else - printf("%d\tINUSE\t%d\t%8X\t%s\n", - i, ip->if_version, ip->if_daddr, - (ip->if_nextfree == LFS_ORPHAN_NEXTFREE ? "FFFFFFFF" : "-")); + printf("%d\tINUSE\t%u\t%8jX\t%s\n", + i, version, (intmax_t)daddr, + nextfree == LFS_ORPHAN_NEXTFREE ? "FFFFFFFF" : "-"); } #define fsbtobyte(fs, b) lfs_fsbtob((fs), (off_t)((b))) @@ -410,14 +418,16 @@ dump_ipage_ifile(struct lfs *lfsp, int i char *ip; int cnt, max, entsize; - if (lfs_sb_getversion(lfsp) == 1) - entsize = sizeof(IFILE_V1); + if (lfsp->lfs_is64) + entsize = sizeof(IFILE64); + if (lfs_sb_getversion(lfsp) > 1) + entsize = sizeof(IFILE32); else - entsize = sizeof(IFILE); + entsize = sizeof(IFILE_V1); max = i + tot; for (ip = pp, cnt = i; cnt < max; cnt++, ip += entsize) - print_ientry(cnt, (IFILE *)ip); + print_ientry(cnt, lfsp, (IFILE *)ip); return (max); }