Module Name: src Committed By: dholland Date: Tue Sep 1 06:08:37 UTC 2015
Modified Files: src/sbin/fsck_lfs: dir.c inode.c lfs.c pass6.c segwrite.c setup.c src/sys/ufs/lfs: lfs_accessors.h lfs_alloc.c lfs_balloc.c lfs_inode.c lfs_inode.h lfs_itimes.c lfs_rfw.c lfs_segment.c lfs_syscalls.c lfs_vfsops.c lfs_vnops.c ulfs_bmap.c ulfs_inode.h ulfs_vnops.c Log Message: Use the lfs dinode accessors in place of the ufs-derived ones. (Mostly.) The ufs-derived ones are fake structure member macros, which are gross and not very safe. Also, it seems that a lot of places in the lfs code were using the ffsv1 branch of them unconditionally, and this way it's guaranteed all those places have been updated. Found while doing this: for non-devices, have getattr produce NODEV in the rdev field instead of leaking the address of the first direct block. To generate a diff of this commit: cvs rdiff -u -r1.36 -r1.37 src/sbin/fsck_lfs/dir.c cvs rdiff -u -r1.60 -r1.61 src/sbin/fsck_lfs/inode.c cvs rdiff -u -r1.57 -r1.58 src/sbin/fsck_lfs/lfs.c cvs rdiff -u -r1.43 -r1.44 src/sbin/fsck_lfs/pass6.c cvs rdiff -u -r1.42 -r1.43 src/sbin/fsck_lfs/segwrite.c cvs rdiff -u -r1.55 -r1.56 src/sbin/fsck_lfs/setup.c cvs rdiff -u -r1.15 -r1.16 src/sys/ufs/lfs/lfs_accessors.h \ src/sys/ufs/lfs/ulfs_inode.h cvs rdiff -u -r1.128 -r1.129 src/sys/ufs/lfs/lfs_alloc.c cvs rdiff -u -r1.86 -r1.87 src/sys/ufs/lfs/lfs_balloc.c cvs rdiff -u -r1.145 -r1.146 src/sys/ufs/lfs/lfs_inode.c cvs rdiff -u -r1.10 -r1.11 src/sys/ufs/lfs/lfs_inode.h cvs rdiff -u -r1.18 -r1.19 src/sys/ufs/lfs/lfs_itimes.c cvs rdiff -u -r1.30 -r1.31 src/sys/ufs/lfs/lfs_rfw.c cvs rdiff -u -r1.258 -r1.259 src/sys/ufs/lfs/lfs_segment.c cvs rdiff -u -r1.169 -r1.170 src/sys/ufs/lfs/lfs_syscalls.c cvs rdiff -u -r1.341 -r1.342 src/sys/ufs/lfs/lfs_vfsops.c cvs rdiff -u -r1.287 -r1.288 src/sys/ufs/lfs/lfs_vnops.c cvs rdiff -u -r1.6 -r1.7 src/sys/ufs/lfs/ulfs_bmap.c cvs rdiff -u -r1.26 -r1.27 src/sys/ufs/lfs/ulfs_vnops.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sbin/fsck_lfs/dir.c diff -u src/sbin/fsck_lfs/dir.c:1.36 src/sbin/fsck_lfs/dir.c:1.37 --- src/sbin/fsck_lfs/dir.c:1.36 Wed Aug 12 18:28:00 2015 +++ src/sbin/fsck_lfs/dir.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dir.c,v 1.36 2015/08/12 18:28:00 dholland Exp $ */ +/* $NetBSD: dir.c,v 1.37 2015/09/01 06:08:37 dholland Exp $ */ /* * Copyright (c) 1980, 1986, 1993 @@ -316,7 +316,7 @@ fileerror(ino_t cwd, ino_t ino, const ch else { if (ftypeok(VTOD(vp))) pfatal("%s=%s\n", - (VTOI(vp)->i_ffs1_mode & LFS_IFMT) == LFS_IFDIR ? + (lfs_dino_getmode(fs, VTOI(vp)->i_din) & LFS_IFMT) == LFS_IFDIR ? "DIR" : "FILE", pathbuf); else pfatal("NAME=%s\n", pathbuf); @@ -492,7 +492,8 @@ linkup(ino_t orphan, ino_t parentdir) parentdir != (ino_t) - 1) (void) makeentry(orphan, lfdir, ".."); vp = vget(fs, lfdir); - VTOI(vp)->i_ffs1_nlink++; + lfs_dino_setnlink(fs, VTOI(vp)->i_din, + lfs_dino_getnlink(fs, VTOI(vp)->i_din) + 1); inodirty(VTOI(vp)); lncntp[lfdir]++; pwarn("DIR I=%llu CONNECTED. ", (unsigned long long)orphan); @@ -688,7 +689,8 @@ freedir(ino_t ino, ino_t parent) if (ino != parent) { vp = vget(fs, parent); - VTOI(vp)->i_ffs1_nlink--; + lfs_dino_setnlink(fs, VTOI(vp)->i_din, + lfs_dino_getnlink(fs, VTOI(vp)->i_din) - 1); inodirty(VTOI(vp)); } freeino(ino); Index: src/sbin/fsck_lfs/inode.c diff -u src/sbin/fsck_lfs/inode.c:1.60 src/sbin/fsck_lfs/inode.c:1.61 --- src/sbin/fsck_lfs/inode.c:1.60 Wed Aug 19 20:33:29 2015 +++ src/sbin/fsck_lfs/inode.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: inode.c,v 1.60 2015/08/19 20:33:29 dholland Exp $ */ +/* $NetBSD: inode.c,v 1.61 2015/09/01 06:08:37 dholland Exp $ */ /*- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. @@ -305,7 +305,10 @@ iblock(struct inodesc *idesc, long ileve pathbuf, (long long)idesc->id_number); if (reply("ADJUST LENGTH") == 1) { vp = vget(fs, idesc->id_number); - VTOI(vp)->i_ffs1_size -= isize; + lfs_dino_setsize(fs, VTOI(vp)->i_din, + lfs_dino_getsize(fs, + VTOI(vp)->i_din) + - isize); isize = 0; printf( "YOU MUST RERUN FSCK AFTERWARDS\n"); @@ -444,7 +447,7 @@ clri(struct inodesc * idesc, const char vp = vget(fs, idesc->id_number); if (flag & 0x1) { pwarn("%s %s", type, - (VTOI(vp)->i_ffs1_mode & LFS_IFMT) == LFS_IFDIR ? "DIR" : "FILE"); + (lfs_dino_getmode(fs, VTOI(vp)->i_din) & LFS_IFMT) == LFS_IFDIR ? "DIR" : "FILE"); pinode(idesc->id_number); } if ((flag & 0x2) || preen || reply("CLEAR") == 1) { Index: src/sbin/fsck_lfs/lfs.c diff -u src/sbin/fsck_lfs/lfs.c:1.57 src/sbin/fsck_lfs/lfs.c:1.58 --- src/sbin/fsck_lfs/lfs.c:1.57 Wed Aug 19 20:33:29 2015 +++ src/sbin/fsck_lfs/lfs.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs.c,v 1.57 2015/08/19 20:33:29 dholland Exp $ */ +/* $NetBSD: lfs.c,v 1.58 2015/09/01 06:08:37 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. * All rights reserved. @@ -173,7 +173,7 @@ ulfs_bmaparray(struct lfs * fs, struct u if (bn >= 0 && bn < ULFS_NDADDR) { if (nump != NULL) *nump = 0; - *bnp = LFS_FSBTODB(fs, ip->i_ffs1_db[bn]); + *bnp = LFS_FSBTODB(fs, lfs_dino_getdb(fs, ip->i_din, bn)); if (*bnp == 0) *bnp = -1; return (0); @@ -187,7 +187,7 @@ ulfs_bmaparray(struct lfs * fs, struct u num = *nump; /* Get disk address out of indirect block array */ - daddr = ip->i_ffs1_ib[xap->in_off]; + daddr = lfs_dino_getib(fs, ip->i_din, xap->in_off); for (bp = NULL, ++xap; --num; ++xap) { /* Exit the loop if there is no disk address assigned yet and @@ -228,7 +228,7 @@ ulfs_bmaparray(struct lfs * fs, struct u * contains the logical block number of the appropriate single, double or * triple indirect block and the offset into the inode indirect block array. * Note, the logical block number of the inode single/double/triple indirect - * block appears twice in the array, once with the offset into the i_ffs1_ib and + * block appears twice in the array, once with the offset into di_ib and * once with the offset into the page itself. */ int @@ -386,18 +386,18 @@ lfs_raw_vget(struct lfs * fs, ino_t ino, /* ip->i_devvp = fs->lfs_devvp; */ ip->i_lfs = fs; - ip->i_lfs_effnblks = ip->i_ffs1_blocks; - ip->i_lfs_osize = ip->i_ffs1_size; + ip->i_lfs_effnblks = lfs_dino_getblocks(fs, ip->i_din); + ip->i_lfs_osize = lfs_dino_getsize(fs, ip->i_din); #if 0 - if (fs->lfs_version > 1) { - ip->i_ffs1_atime = ts.tv_sec; - ip->i_ffs1_atimensec = ts.tv_nsec; + if (lfs_sb_getversion(fs) > 1) { + lfs_dino_setatime(fs, ip->i_din, ts.tv_sec); + lfs_dino_setatimensec(fs, ip->i_din, ts.tv_nsec); } #endif memset(ip->i_lfs_fragsize, 0, ULFS_NDADDR * sizeof(*ip->i_lfs_fragsize)); for (i = 0; i < ULFS_NDADDR; i++) - if (ip->i_ffs1_db[i] != 0) + if (lfs_dino_getdb(fs, ip->i_din, i) != 0) ip->i_lfs_fragsize[i] = lfs_blksize(fs, ip, i); ++nvnodes; @@ -925,10 +925,11 @@ extend_ifile(struct lfs *fs) vp = fs->lfs_ivnode; ip = VTOI(vp); - blkno = lfs_lblkno(fs, ip->i_ffs1_size); + blkno = lfs_lblkno(fs, lfs_dino_getsize(fs, ip->i_din)); - lfs_balloc(vp, ip->i_ffs1_size, lfs_sb_getbsize(fs), &bp); - ip->i_ffs1_size += lfs_sb_getbsize(fs); + lfs_balloc(vp, lfs_dino_getsize(fs, ip->i_din), lfs_sb_getbsize(fs), &bp); + lfs_dino_setsize(fs, ip->i_din, + lfs_dino_getsize(fs, ip->i_din) + lfs_sb_getbsize(fs)); ip->i_flag |= IN_MODIFIED; i = (blkno - lfs_sb_getsegtabsz(fs) - lfs_sb_getcleansz(fs)) * @@ -968,7 +969,7 @@ extend_ifile(struct lfs *fs) LFS_BWRITE_LOG(bp); #ifdef IN_FSCK_LFS - reset_maxino(((ip->i_ffs1_size >> lfs_sb_getbshift(fs)) + reset_maxino(((lfs_dino_getsize(fs, ip->i_din) >> lfs_sb_getbshift(fs)) - lfs_sb_getsegtabsz(fs) - lfs_sb_getcleansz(fs)) * lfs_sb_getifpb(fs)); #endif @@ -1026,7 +1027,7 @@ lfs_balloc(struct uvnode *vp, off_t star *bpp = NULL; /* Check for block beyond end of file and fragment extension needed. */ - lastblock = lfs_lblkno(fs, ip->i_ffs1_size); + lastblock = lfs_lblkno(fs, lfs_dino_getsize(fs, ip->i_din)); if (lastblock < ULFS_NDADDR && lastblock < lbn) { osize = lfs_blksize(fs, ip, lastblock); if (osize < lfs_sb_getbsize(fs) && osize > 0) { @@ -1034,7 +1035,7 @@ lfs_balloc(struct uvnode *vp, off_t star lastblock, (bpp ? &bp : NULL)))) return (error); - ip->i_ffs1_size = (lastblock + 1) * lfs_sb_getbsize(fs); + lfs_dino_setsize(fs, ip->i_din, (lastblock + 1) * lfs_sb_getbsize(fs)); ip->i_flag |= IN_CHANGE | IN_UPDATE; if (bpp) (void) VOP_BWRITE(bp); @@ -1049,10 +1050,10 @@ lfs_balloc(struct uvnode *vp, off_t star * size or it already exists and contains some fragments and * may need to extend it. */ - if (lbn < ULFS_NDADDR && lfs_lblkno(fs, ip->i_ffs1_size) <= lbn) { + if (lbn < ULFS_NDADDR && lfs_lblkno(fs, lfs_dino_getsize(fs, ip->i_din)) <= lbn) { osize = lfs_blksize(fs, ip, lbn); nsize = lfs_fragroundup(fs, offset + iosize); - if (lfs_lblktosize(fs, lbn) >= ip->i_ffs1_size) { + if (lfs_lblktosize(fs, lbn) >= lfs_dino_getsize(fs, ip->i_din)) { /* Brand new block or fragment */ frags = lfs_numfrags(fs, nsize); if (bpp) { @@ -1061,7 +1062,7 @@ lfs_balloc(struct uvnode *vp, off_t star } ip->i_lfs_effnblks += frags; lfs_sb_subbfree(fs, frags); - ip->i_ffs1_db[lbn] = UNWRITTEN; + lfs_dino_setdb(fs, ip->i_din, lbn, UNWRITTEN); } else { if (nsize <= osize) { /* No need to extend */ @@ -1105,15 +1106,16 @@ lfs_balloc(struct uvnode *vp, off_t star ip->i_lfs_effnblks += bcount; if (daddr == UNASSIGNED) { - if (num > 0 && ip->i_ffs1_ib[indirs[0].in_off] == 0) { - ip->i_ffs1_ib[indirs[0].in_off] = UNWRITTEN; + if (num > 0 && lfs_dino_getib(fs, ip->i_din, indirs[0].in_off) == 0) { + lfs_dino_setib(fs, ip->i_din, indirs[0].in_off, + UNWRITTEN); } /* * Create new indirect blocks if necessary */ if (num > 1) { - idaddr = ip->i_ffs1_ib[indirs[0].in_off]; + idaddr = lfs_dino_getib(fs, ip->i_din, indirs[0].in_off); for (i = 1; i < num; ++i) { ibp = getblk(vp, indirs[i].in_lbn, lfs_sb_getbsize(fs)); @@ -1165,10 +1167,11 @@ lfs_balloc(struct uvnode *vp, off_t star switch (num) { case 0: - ip->i_ffs1_db[lbn] = UNWRITTEN; + lfs_dino_setdb(fs, ip->i_din, lbn, UNWRITTEN); break; case 1: - ip->i_ffs1_ib[indirs[0].in_off] = UNWRITTEN; + lfs_dino_setib(fs, ip->i_din, indirs[0].in_off, + UNWRITTEN); break; default: idp = &indirs[num - 1]; @@ -1176,7 +1179,8 @@ lfs_balloc(struct uvnode *vp, off_t star panic("lfs_balloc: bread bno %lld", (long long)idp->in_lbn); /* XXX ondisk32 */ - ((int32_t *)ibp->b_data)[idp->in_off] = UNWRITTEN; + lfs_iblock_set(fs, ibp->b_data, idp->in_off, + UNWRITTEN); VOP_BWRITE(ibp); } } else if (bpp && !(bp->b_flags & (B_DONE|B_DELWRI))) { Index: src/sbin/fsck_lfs/pass6.c diff -u src/sbin/fsck_lfs/pass6.c:1.43 src/sbin/fsck_lfs/pass6.c:1.44 --- src/sbin/fsck_lfs/pass6.c:1.43 Wed Aug 19 20:33:29 2015 +++ src/sbin/fsck_lfs/pass6.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: pass6.c,v 1.43 2015/08/19 20:33:29 dholland Exp $ */ +/* $NetBSD: pass6.c,v 1.44 2015/09/01 06:08:37 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -103,21 +103,24 @@ rfw_update_single(struct uvnode *vp, dad frags = lfs_numfrags(fs, size); switch (num) { case 0: - ooff = ip->i_ffs1_db[lbn]; + ooff = lfs_dino_getdb(fs, ip->i_din, lbn); if (ooff <= 0) - ip->i_ffs1_blocks += frags; + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + frags); else { /* possible fragment truncation or extension */ ofrags = lfs_numfrags(fs, ip->i_lfs_fragsize[lbn]); - ip->i_ffs1_blocks += (frags - ofrags); + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + (frags - ofrags)); } - ip->i_ffs1_db[lbn] = ndaddr; + lfs_dino_setdb(fs, ip->i_din, lbn, ndaddr); break; case 1: - ooff = ip->i_ffs1_ib[a[0].in_off]; + ooff = lfs_dino_getib(fs, ip->i_din, a[0].in_off); if (ooff <= 0) - ip->i_ffs1_blocks += frags; - ip->i_ffs1_ib[a[0].in_off] = ndaddr; + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + frags); + lfs_dino_setib(fs, ip->i_din, a[0].in_off, ndaddr); break; default: ap = &a[num - 1]; @@ -125,10 +128,11 @@ rfw_update_single(struct uvnode *vp, dad errx(1, "lfs_updatemeta: bread bno %" PRId64, ap->in_lbn); - ooff = ((ulfs_daddr_t *) bp->b_data)[ap->in_off]; + ooff = lfs_iblock_get(fs, bp->b_data, ap->in_off); if (ooff <= 0) - ip->i_ffs1_blocks += frags; - ((ulfs_daddr_t *) bp->b_data)[ap->in_off] = ndaddr; + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + frags); + lfs_iblock_set(fs, bp->b_data, ap->in_off, ndaddr); (void) VOP_BWRITE(bp); } @@ -153,8 +157,8 @@ rfw_update_single(struct uvnode *vp, dad } /* If block is beyond EOF, update size */ - if (lbn >= 0 && ip->i_ffs1_size <= (lbn << lfs_sb_getbshift(fs))) { - ip->i_ffs1_size = (lbn << lfs_sb_getbshift(fs)) + 1; + if (lbn >= 0 && lfs_dino_getsize(fs, ip->i_din) <= (lbn << lfs_sb_getbshift(fs))) { + lfs_dino_setsize(fs, ip->i_din, (lbn << lfs_sb_getbshift(fs)) + 1); } /* If block frag size is too large for old EOF, update size */ @@ -163,8 +167,8 @@ rfw_update_single(struct uvnode *vp, dad minsize = (lbn << lfs_sb_getbshift(fs)); minsize += (size - lfs_sb_getfsize(fs)) + 1; - if (ip->i_ffs1_size < minsize) - ip->i_ffs1_size = minsize; + if (lfs_dino_getsize(fs, ip->i_din) < minsize) + lfs_dino_setsize(fs, ip->i_din, minsize); } /* Count for the user */ @@ -264,7 +268,7 @@ pass6harvest(ulfs_daddr_t daddr, FINFO * vp = vget(fs, lfs_fi_getino(fs, fip)); if (vp && vp != fs->lfs_ivnode && - VTOI(vp)->i_ffs1_gen == lfs_fi_getversion(fs, fip)) { + lfs_dino_getgen(fs, VTOI(vp)->i_din) == lfs_fi_getversion(fs, fip)) { for (i = 0; i < lfs_fi_getnblocks(fs, fip); i++) { size = (i == lfs_fi_getnblocks(fs, fip) - 1 ? lfs_fi_getlastlength(fs, fip) : lfs_sb_getbsize(fs)); @@ -388,7 +392,7 @@ account_block_changes(union lfs_dinode * /* Check direct block holdings between existing and new */ for (i = 0; i < ULFS_NDADDR; i++) { - odaddr = (ip ? ip->i_ffs1_db[i] : 0x0); + odaddr = (ip ? lfs_dino_getdb(fs, ip->i_din, i) : 0x0); if (lfs_dino_getdb(fs, dp, i) > 0 && lfs_dino_getdb(fs, dp, i) != odaddr) rfw_update_single(vp, i, lfs_dino_getdb(fs, dp, i), lfs_dblksize(fs, dp, i)); @@ -397,7 +401,7 @@ account_block_changes(union lfs_dinode * /* Check indirect block holdings between existing and new */ off = 0; for (i = 0; i < ULFS_NIADDR; i++) { - odaddr = (ip ? ip->i_ffs1_ib[i] : 0x0); + odaddr = (ip ? lfs_dino_getib(fs, ip->i_din, i) : 0x0); if (lfs_dino_getib(fs, dp, i) > 0 && lfs_dino_getib(fs, dp, i) != odaddr) { lbn = -(ULFS_NDADDR + off + i); rfw_update_single(vp, i, lfs_dino_getib(fs, dp, i), lfs_sb_getbsize(fs)); @@ -711,11 +715,9 @@ pass6(void) * allocated inode. Delete old file * and proceed as in (2). */ - if (vp && ( - fs->lfs_is64 ? - VTOI(vp)->i_ffs2_gen : - VTOI(vp)->i_ffs1_gen - ) < lfs_dino_getgen(fs, dp)) { + if (vp && + lfs_dino_getgen(fs, VTOI(vp)->i_din) + < lfs_dino_getgen(fs, dp)) { remove_ino(vp, lfs_dino_getinumber(fs, dp)); if (!(lfs_ss_getflags(fs, sp) & SS_DIROP)) pfatal("NEW FILE VERSION IN NON-DIROP PARTIAL SEGMENT"); @@ -733,11 +735,9 @@ pass6(void) * only. We'll pick up any new * blocks when we do the block pass. */ - if (vp && ( - fs->lfs_is64 ? - VTOI(vp)->i_ffs2_gen : - VTOI(vp)->i_ffs1_gen - ) == lfs_dino_getgen(fs, dp)) { + if (vp && + lfs_dino_getgen(fs, VTOI(vp)->i_din) + == lfs_dino_getgen(fs, dp)) { nmvfiles++; readdress_inode(dp, ibdaddr); Index: src/sbin/fsck_lfs/segwrite.c diff -u src/sbin/fsck_lfs/segwrite.c:1.42 src/sbin/fsck_lfs/segwrite.c:1.43 --- src/sbin/fsck_lfs/segwrite.c:1.42 Wed Aug 19 20:33:29 2015 +++ src/sbin/fsck_lfs/segwrite.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: segwrite.c,v 1.42 2015/08/19 20:33:29 dholland Exp $ */ +/* $NetBSD: segwrite.c,v 1.43 2015/09/01 06:08:37 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. * All rights reserved. @@ -311,7 +311,7 @@ lfs_writeinode(struct lfs * fs, struct s */ if (ip->i_number == LFS_IFILE_INUM && sp->idp) { lfs_copy_dinode(fs, sp->idp, ip->i_din); - ip->i_lfs_osize = ip->i_ffs1_size; + ip->i_lfs_osize = lfs_dino_getsize(fs, ip->i_din); return 0; } bp = sp->ibp; @@ -319,7 +319,7 @@ lfs_writeinode(struct lfs * fs, struct s lfs_copy_dinode(fs, cdp, ip->i_din); /* If all blocks are goig to disk, update the "size on disk" */ - ip->i_lfs_osize = ip->i_ffs1_size; + ip->i_lfs_osize = lfs_dino_getsize(fs, ip->i_din); if (ip->i_number == LFS_IFILE_INUM) /* We know sp->idp == NULL */ sp->idp = DINO_IN_BLOCK(fs, bp->b_data, sp->ninodes % LFS_INOPB(fs)); @@ -478,21 +478,24 @@ lfs_update_single(struct lfs * fs, struc frags = lfs_numfrags(fs, size); switch (num) { case 0: - ooff = ip->i_ffs1_db[lbn]; + ooff = lfs_dino_getdb(fs, ip->i_din, lbn); if (ooff == UNWRITTEN) - ip->i_ffs1_blocks += frags; + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + frags); else { /* possible fragment truncation or extension */ ofrags = lfs_btofsb(fs, ip->i_lfs_fragsize[lbn]); - ip->i_ffs1_blocks += (frags - ofrags); + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + (frags - ofrags)); } - ip->i_ffs1_db[lbn] = ndaddr; + lfs_dino_setdb(fs, ip->i_din, lbn, ndaddr); break; case 1: - ooff = ip->i_ffs1_ib[a[0].in_off]; + ooff = lfs_dino_getib(fs, ip->i_din, a[0].in_off); if (ooff == UNWRITTEN) - ip->i_ffs1_blocks += frags; - ip->i_ffs1_ib[a[0].in_off] = ndaddr; + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + frags); + lfs_dino_setib(fs, ip->i_din, a[0].in_off, ndaddr); break; default: ap = &a[num - 1]; @@ -500,10 +503,11 @@ lfs_update_single(struct lfs * fs, struc errx(EXIT_FAILURE, "%s: bread bno %" PRId64, __func__, ap->in_lbn); - ooff = ((ulfs_daddr_t *) bp->b_data)[ap->in_off]; + ooff = lfs_iblock_get(fs, bp->b_data, ap->in_off); if (ooff == UNWRITTEN) - ip->i_ffs1_blocks += frags; - ((ulfs_daddr_t *) bp->b_data)[ap->in_off] = ndaddr; + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + frags); + lfs_iblock_set(fs, bp->b_data, ap->in_off, ndaddr); (void) VOP_BWRITE(bp); } Index: src/sbin/fsck_lfs/setup.c diff -u src/sbin/fsck_lfs/setup.c:1.55 src/sbin/fsck_lfs/setup.c:1.56 --- src/sbin/fsck_lfs/setup.c:1.55 Wed Aug 12 18:28:00 2015 +++ src/sbin/fsck_lfs/setup.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: setup.c,v 1.55 2015/08/12 18:28:00 dholland Exp $ */ +/* $NetBSD: setup.c,v 1.56 2015/09/01 06:08:37 dholland Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -413,11 +413,11 @@ setup(const char *dev) * XXX dirty while we do the rest. */ ivp = fs->lfs_ivnode; - maxino = ((VTOI(ivp)->i_ffs1_size - (lfs_sb_getcleansz(fs) + lfs_sb_getsegtabsz(fs)) + maxino = ((lfs_dino_getsize(fs, VTOI(ivp)->i_din) - (lfs_sb_getcleansz(fs) + lfs_sb_getsegtabsz(fs)) * lfs_sb_getbsize(fs)) / lfs_sb_getbsize(fs)) * lfs_sb_getifpb(fs); if (debug) pwarn("maxino = %llu\n", (unsigned long long)maxino); - for (i = 0; i < VTOI(ivp)->i_ffs1_size; i += lfs_sb_getbsize(fs)) { + for (i = 0; i < lfs_dino_getsize(fs, VTOI(ivp)->i_din); i += lfs_sb_getbsize(fs)) { bread(ivp, i >> lfs_sb_getbshift(fs), lfs_sb_getbsize(fs), 0, &bp); /* XXX check B_ERROR */ brelse(bp, 0); Index: src/sys/ufs/lfs/lfs_accessors.h diff -u src/sys/ufs/lfs/lfs_accessors.h:1.15 src/sys/ufs/lfs/lfs_accessors.h:1.16 --- src/sys/ufs/lfs/lfs_accessors.h:1.15 Sat Aug 29 21:04:22 2015 +++ src/sys/ufs/lfs/lfs_accessors.h Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_accessors.h,v 1.15 2015/08/29 21:04:22 mlelstv Exp $ */ +/* $NetBSD: lfs_accessors.h,v 1.16 2015/09/01 06:08:37 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 */ @@ -236,6 +236,9 @@ LFS_DEF_DINO_ACCESSOR(int32_t, int32_t, LFS_DEF_DINO_ACCESSOR(uint32_t, uint32_t, uid); LFS_DEF_DINO_ACCESSOR(uint32_t, uint32_t, gid); +/* XXX this should be done differently (it's a fake field) */ +LFS_DEF_DINO_ACCESSOR(uint64_t, int32_t, rdev); + static __unused inline daddr_t lfs_dino_getdb(STRUCT_LFS *fs, union lfs_dinode *dip, unsigned ix) { @@ -280,6 +283,49 @@ lfs_dino_setib(STRUCT_LFS *fs, union lfs } } +/* birthtime is present only in the 64-bit inode */ +static __unused inline void +lfs_dino_setbirthtime(STRUCT_LFS *fs, union lfs_dinode *dip, + const struct timespec *ts) +{ + if (fs->lfs_is64) { + dip->u_64.di_birthtime = ts->tv_sec; + dip->u_64.di_birthnsec = ts->tv_nsec; + } else { + /* drop it on the floor */ + } +} + +/* + * indirect blocks + */ + +static __unused inline daddr_t +lfs_iblock_get(STRUCT_LFS *fs, void *block, unsigned ix) +{ + if (fs->lfs_is64) { + // XXX re-enable these asserts after reorging this file + //KASSERT(ix < lfs_sb_getbsize(fs) / sizeof(int64_t)); + return (daddr_t)(((int64_t *)block)[ix]); + } else { + //KASSERT(ix < lfs_sb_getbsize(fs) / sizeof(int32_t)); + /* must sign-extend or UNWRITTEN gets trashed */ + return (daddr_t)(int64_t)(((int32_t *)block)[ix]); + } +} + +static __unused inline void +lfs_iblock_set(STRUCT_LFS *fs, void *block, unsigned ix, daddr_t val) +{ + if (fs->lfs_is64) { + //KASSERT(ix < lfs_sb_getbsize(fs) / sizeof(int64_t)); + ((int64_t *)block)[ix] = val; + } else { + //KASSERT(ix < lfs_sb_getbsize(fs) / sizeof(int32_t)); + ((int32_t *)block)[ix] = val; + } +} + /* * "struct buf" associated definitions */ @@ -1032,10 +1078,10 @@ lfs_btofsb(STRUCT_LFS *fs, uint64_t b) static __unused inline uint32_t lfs_blksize(STRUCT_LFS *fs, struct inode *ip, uint64_t lbn) { - if (lbn >= ULFS_NDADDR || ip->i_ffs1_size >= (lbn + 1) << lfs_sb_getbshift(fs)) { + if (lbn >= ULFS_NDADDR || lfs_dino_getsize(fs, ip->i_din) >= (lbn + 1) << lfs_sb_getbshift(fs)) { return lfs_sb_getbsize(fs); } else { - return lfs_fragroundup(fs, lfs_blkoff(fs, ip->i_ffs1_size)); + return lfs_fragroundup(fs, lfs_blkoff(fs, lfs_dino_getsize(fs, ip->i_din))); } } #endif Index: src/sys/ufs/lfs/ulfs_inode.h diff -u src/sys/ufs/lfs/ulfs_inode.h:1.15 src/sys/ufs/lfs/ulfs_inode.h:1.16 --- src/sys/ufs/lfs/ulfs_inode.h:1.15 Wed Aug 12 18:28:01 2015 +++ src/sys/ufs/lfs/ulfs_inode.h Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ulfs_inode.h,v 1.15 2015/08/12 18:28:01 dholland Exp $ */ +/* $NetBSD: ulfs_inode.h,v 1.16 2015/09/01 06:08:37 dholland Exp $ */ /* from NetBSD: inode.h,v 1.64 2012/11/19 00:36:21 jakllsch Exp */ /* @@ -189,27 +189,28 @@ struct lfid { */ #define DIP(ip, field) \ (((ip)->i_ump->um_fstype == ULFS1) ? \ - (ip)->i_ffs1_##field : (ip)->i_ffs2_##field) + (ip)->i_din->u_32.di_##field : (ip)->i_din->u_64.di_##field) #define DIP_ASSIGN(ip, field, value) \ do { \ if ((ip)->i_ump->um_fstype == ULFS1) \ - (ip)->i_ffs1_##field = (value); \ + (ip)->i_din->u_32.di_##field = (value); \ else \ - (ip)->i_ffs2_##field = (value); \ + (ip)->i_din->u_64.di_##field = (value); \ } while(0) #define DIP_ADD(ip, field, value) \ do { \ if ((ip)->i_ump->um_fstype == ULFS1) \ - (ip)->i_ffs1_##field += (value); \ + (ip)->i_din->u_32.di_##field += (value); \ else \ - (ip)->i_ffs2_##field += (value); \ + (ip)->i_din->u_64.di_##field += (value); \ } while(0) +/* XXX rework this better */ #define SHORTLINK(ip) \ (((ip)->i_ump->um_fstype == ULFS1) ? \ - (void *)(ip)->i_ffs1_db : (void *)(ip)->i_ffs2_db) + (void *)(ip)->i_din->u_32.di_db : (void *)(ip)->i_din->u_64.di_db) /* Index: src/sys/ufs/lfs/lfs_alloc.c diff -u src/sys/ufs/lfs/lfs_alloc.c:1.128 src/sys/ufs/lfs/lfs_alloc.c:1.129 --- src/sys/ufs/lfs/lfs_alloc.c:1.128 Sat Aug 29 21:04:22 2015 +++ src/sys/ufs/lfs/lfs_alloc.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_alloc.c,v 1.128 2015/08/29 21:04:22 mlelstv Exp $ */ +/* $NetBSD: lfs_alloc.c,v 1.129 2015/09/01 06:08:37 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.128 2015/08/29 21:04:22 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_alloc.c,v 1.129 2015/09/01 06:08:37 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_quota.h" @@ -135,7 +135,7 @@ lfs_extend_ifile(struct lfs *fs, kauth_c return (error); } ip->i_size += lfs_sb_getbsize(fs); - ip->i_ffs1_size = ip->i_size; + lfs_dino_setsize(fs, ip->i_din, ip->i_size); uvm_vnp_setsize(vp, ip->i_size); maxino = ((ip->i_size >> lfs_sb_getbshift(fs)) - lfs_sb_getcleansz(fs) - Index: src/sys/ufs/lfs/lfs_balloc.c diff -u src/sys/ufs/lfs/lfs_balloc.c:1.86 src/sys/ufs/lfs/lfs_balloc.c:1.87 --- src/sys/ufs/lfs/lfs_balloc.c:1.86 Sun Aug 2 18:18:46 2015 +++ src/sys/ufs/lfs/lfs_balloc.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_balloc.c,v 1.86 2015/08/02 18:18:46 dholland Exp $ */ +/* $NetBSD: lfs_balloc.c,v 1.87 2015/09/01 06:08:37 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_balloc.c,v 1.86 2015/08/02 18:18:46 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_balloc.c,v 1.87 2015/09/01 06:08:37 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_quota.h" @@ -160,8 +160,8 @@ lfs_balloc(struct vnode *vp, off_t start lastblock, (bpp ? &bp : NULL), cred))) return (error); - ip->i_ffs1_size = ip->i_size = - (lastblock + 1) * lfs_sb_getbsize(fs); + ip->i_size = (lastblock + 1) * lfs_sb_getbsize(fs); + lfs_dino_setsize(fs, ip->i_din, ip->i_size); uvm_vnp_setsize(vp, ip->i_size); ip->i_flag |= IN_CHANGE | IN_UPDATE; if (bpp) @@ -195,7 +195,7 @@ lfs_balloc(struct vnode *vp, off_t start mutex_enter(&lfs_lock); lfs_sb_subbfree(fs, frags); mutex_exit(&lfs_lock); - ip->i_ffs1_db[lbn] = UNWRITTEN; + lfs_dino_setdb(fs, ip->i_din, lbn, UNWRITTEN); } else { if (nsize <= osize) { /* No need to extend */ @@ -245,15 +245,15 @@ lfs_balloc(struct vnode *vp, off_t start } if (daddr == UNASSIGNED) { - if (num > 0 && ip->i_ffs1_ib[indirs[0].in_off] == 0) { - ip->i_ffs1_ib[indirs[0].in_off] = UNWRITTEN; + if (num > 0 && lfs_dino_getib(fs, ip->i_din, indirs[0].in_off) == 0) { + lfs_dino_setib(fs, ip->i_din, indirs[0].in_off, UNWRITTEN); } /* * Create new indirect blocks if necessary */ if (num > 1) { - idaddr = ip->i_ffs1_ib[indirs[0].in_off]; + idaddr = lfs_dino_getib(fs, ip->i_din, indirs[0].in_off); for (i = 1; i < num; ++i) { ibp = getblk(vp, indirs[i].in_lbn, lfs_sb_getbsize(fs), 0,0); @@ -322,10 +322,10 @@ lfs_balloc(struct vnode *vp, off_t start switch (num) { case 0: - ip->i_ffs1_db[lbn] = UNWRITTEN; + lfs_dino_setdb(fs, ip->i_din, lbn, UNWRITTEN); break; case 1: - ip->i_ffs1_ib[indirs[0].in_off] = UNWRITTEN; + lfs_dino_setib(fs, ip->i_din, indirs[0].in_off, UNWRITTEN); break; default: idp = &indirs[num - 1]; Index: src/sys/ufs/lfs/lfs_inode.c diff -u src/sys/ufs/lfs/lfs_inode.c:1.145 src/sys/ufs/lfs/lfs_inode.c:1.146 --- src/sys/ufs/lfs/lfs_inode.c:1.145 Wed Aug 19 20:33:29 2015 +++ src/sys/ufs/lfs/lfs_inode.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_inode.c,v 1.145 2015/08/19 20:33:29 dholland Exp $ */ +/* $NetBSD: lfs_inode.c,v 1.146 2015/09/01 06:08:37 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_inode.c,v 1.145 2015/08/19 20:33:29 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.146 2015/09/01 06:08:37 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_quota.h" @@ -204,8 +204,8 @@ lfs_truncate(struct vnode *ovp, off_t le daddr_t lastblock; struct inode *oip = VTOI(ovp); daddr_t bn, lbn, lastiblock[ULFS_NIADDR], indir_lbn[ULFS_NIADDR]; - /* XXX ondisk32 */ - int32_t newblks[ULFS_NDADDR + ULFS_NIADDR]; + /* note: newblks is set but only actually used if DIAGNOSTIC */ + daddr_t newblks[ULFS_NDADDR + ULFS_NIADDR] __diagused; struct lfs *fs; struct buf *bp; int offset, size, level; @@ -242,13 +242,14 @@ lfs_truncate(struct vnode *ovp, off_t le if (ovp->v_type == VLNK && (oip->i_size < fs->um_maxsymlinklen || (fs->um_maxsymlinklen == 0 && - oip->i_ffs1_blocks == 0))) { + lfs_dino_getblocks(fs, oip->i_din) == 0))) { #ifdef DIAGNOSTIC if (length != 0) panic("lfs_truncate: partial truncate of symlink"); #endif memset((char *)SHORTLINK(oip), 0, (u_int)oip->i_size); - oip->i_size = oip->i_ffs1_size = 0; + oip->i_size = 0; + lfs_dino_setsize(fs, oip->i_din, 0); oip->i_flag |= IN_CHANGE | IN_UPDATE; return (lfs_update(ovp, NULL, NULL, 0)); } @@ -319,7 +320,8 @@ lfs_truncate(struct vnode *ovp, off_t le -lfs_btofsb(fs, (ULFS_NIADDR + 2) << lfs_sb_getbshift(fs))); if (error) return (error); - oip->i_ffs1_size = oip->i_size = length; + oip->i_size = length; + lfs_dino_setsize(fs, oip->i_din, oip->i_size); uvm_vnp_setsize(ovp, length); (void) VOP_BWRITE(bp->b_vp, bp); oip->i_flag |= IN_CHANGE | IN_UPDATE; @@ -347,7 +349,8 @@ lfs_truncate(struct vnode *ovp, off_t le if (ovp != fs->lfs_ivnode) lfs_seglock(fs, SEGM_PROT); if (offset == 0) { - oip->i_size = oip->i_ffs1_size = length; + oip->i_size = length; + lfs_dino_setsize(fs, oip->i_din, oip->i_size); } else if (!usepc) { lbn = lfs_lblkno(fs, length); aflags = B_CLRBUF; @@ -361,7 +364,8 @@ lfs_truncate(struct vnode *ovp, off_t le } obufsize = bp->b_bufsize; odb = lfs_btofsb(fs, bp->b_bcount); - oip->i_size = oip->i_ffs1_size = length; + oip->i_size = length; + lfs_dino_setsize(fs, oip->i_din, oip->i_size); size = lfs_blksize(fs, oip, lbn); if (ovp->v_type != VDIR) memset((char *)bp->b_data + offset, 0, @@ -420,7 +424,8 @@ lfs_truncate(struct vnode *ovp, off_t le genfs_node_wrlock(ovp); - oip->i_size = oip->i_ffs1_size = length; + oip->i_size = length; + lfs_dino_setsize(fs, oip->i_din, oip->i_size); uvm_vnp_setsize(ovp, length); /* @@ -443,7 +448,12 @@ lfs_truncate(struct vnode *ovp, off_t le * freeing blocks. lastiblock values are also normalized to -1 * for calls to lfs_indirtrunc below. */ - memcpy((void *)newblks, (void *)&oip->i_ffs1_db[0], sizeof newblks); + for (i=0; i<ULFS_NDADDR; i++) { + newblks[i] = lfs_dino_getdb(fs, oip->i_din, i); + } + for (i=0; i<ULFS_NIADDR; i++) { + newblks[ULFS_NDADDR + i] = lfs_dino_getib(fs, oip->i_din, i); + } for (level = TRIPLE; level >= SINGLE; level--) if (lastiblock[level] < 0) { newblks[ULFS_NDADDR+level] = 0; @@ -452,7 +462,8 @@ lfs_truncate(struct vnode *ovp, off_t le for (i = ULFS_NDADDR - 1; i > lastblock; i--) newblks[i] = 0; - oip->i_size = oip->i_ffs1_size = osize; + oip->i_size = osize; + lfs_dino_setsize(fs, oip->i_din, oip->i_size); error = lfs_vtruncbuf(ovp, lastblock + 1, false, 0); if (error && !allerror) allerror = error; @@ -464,7 +475,7 @@ lfs_truncate(struct vnode *ovp, off_t le indir_lbn[DOUBLE] = indir_lbn[SINGLE] - LFS_NINDIR(fs) - 1; indir_lbn[TRIPLE] = indir_lbn[DOUBLE] - LFS_NINDIR(fs) * LFS_NINDIR(fs) - 1; for (level = TRIPLE; level >= SINGLE; level--) { - bn = oip->i_ffs1_ib[level]; + bn = lfs_dino_getib(fs, oip->i_din, level); if (bn != 0) { error = lfs_indirtrunc(oip, indir_lbn[level], bn, lastiblock[level], @@ -475,10 +486,10 @@ lfs_truncate(struct vnode *ovp, off_t le real_released += rcount; blocksreleased += count; if (lastiblock[level] < 0) { - if (oip->i_ffs1_ib[level] > 0) + if (lfs_dino_getib(fs, oip->i_din, level) > 0) real_released += nblocks; blocksreleased += nblocks; - oip->i_ffs1_ib[level] = 0; + lfs_dino_setib(fs, oip->i_din, level, 0); lfs_blkfree(fs, oip, bn, lfs_sb_getbsize(fs), &lastseg, &bc); lfs_deregister_block(ovp, bn); @@ -494,11 +505,11 @@ lfs_truncate(struct vnode *ovp, off_t le for (i = ULFS_NDADDR - 1; i > lastblock; i--) { long bsize, obsize; - bn = oip->i_ffs1_db[i]; + bn = lfs_dino_getdb(fs, oip->i_din, i); if (bn == 0) continue; bsize = lfs_blksize(fs, oip, i); - if (oip->i_ffs1_db[i] > 0) { + if (lfs_dino_getdb(fs, oip->i_din, i) > 0) { /* Check for fragment size changes */ obsize = oip->i_lfs_fragsize[i]; real_released += lfs_btofsb(fs, obsize); @@ -506,7 +517,7 @@ lfs_truncate(struct vnode *ovp, off_t le } else obsize = 0; blocksreleased += lfs_btofsb(fs, bsize); - oip->i_ffs1_db[i] = 0; + lfs_dino_setdb(fs, oip->i_din, i, 0); lfs_blkfree(fs, oip, bn, obsize, &lastseg, &bc); lfs_deregister_block(ovp, bn); } @@ -517,7 +528,7 @@ lfs_truncate(struct vnode *ovp, off_t le * Finally, look for a change in size of the * last direct block; release any frags. */ - bn = oip->i_ffs1_db[lastblock]; + bn = lfs_dino_getdb(fs, oip->i_din, lastblock); if (bn != 0) { long oldspace, newspace; #if 0 @@ -533,7 +544,8 @@ lfs_truncate(struct vnode *ovp, off_t le olddspace = oip->i_lfs_fragsize[lastblock]; #endif - oip->i_size = oip->i_ffs1_size = length; + oip->i_size = length; + lfs_dino_setsize(fs, oip->i_din, oip->i_size); newspace = lfs_blksize(fs, oip, lastblock); if (newspace == 0) panic("itrunc: newspace"); @@ -554,11 +566,12 @@ done: #ifdef DIAGNOSTIC for (level = SINGLE; level <= TRIPLE; level++) if ((newblks[ULFS_NDADDR + level] == 0) != - ((oip->i_ffs1_ib[level]) == 0)) { + (lfs_dino_getib(fs, oip->i_din, level) == 0)) { panic("lfs itrunc1"); } for (i = 0; i < ULFS_NDADDR; i++) - if ((newblks[i] == 0) != (oip->i_ffs1_db[i] == 0)) { + if ((newblks[i] == 0) != + (lfs_dino_getdb(fs, oip->i_din, i) == 0)) { panic("lfs itrunc2"); } if (length == 0 && @@ -568,17 +581,20 @@ done: /* * Put back the real size. */ - oip->i_size = oip->i_ffs1_size = length; + oip->i_size = length; + lfs_dino_setsize(fs, oip->i_din, oip->i_size); oip->i_lfs_effnblks -= blocksreleased; - oip->i_ffs1_blocks -= real_released; + lfs_dino_setblocks(fs, oip->i_din, + lfs_dino_getblocks(fs, oip->i_din) - real_released); mutex_enter(&lfs_lock); lfs_sb_addbfree(fs, blocksreleased); mutex_exit(&lfs_lock); #ifdef DIAGNOSTIC if (oip->i_size == 0 && - (oip->i_ffs1_blocks != 0 || oip->i_lfs_effnblks != 0)) { - printf("lfs_truncate: truncate to 0 but %d blks/%jd effblks\n", - oip->i_ffs1_blocks, (intmax_t)oip->i_lfs_effnblks); + (lfs_dino_getblocks(fs, oip->i_din) != 0 || oip->i_lfs_effnblks != 0)) { + printf("lfs_truncate: truncate to 0 but %jd blks/%jd effblks\n", + (intmax_t)lfs_dino_getblocks(fs, oip->i_din), + (intmax_t)oip->i_lfs_effnblks); panic("lfs_truncate: persistent blocks"); } #endif Index: src/sys/ufs/lfs/lfs_inode.h diff -u src/sys/ufs/lfs/lfs_inode.h:1.10 src/sys/ufs/lfs/lfs_inode.h:1.11 --- src/sys/ufs/lfs/lfs_inode.h:1.10 Wed Aug 19 20:33:29 2015 +++ src/sys/ufs/lfs/lfs_inode.h Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_inode.h,v 1.10 2015/08/19 20:33:29 dholland Exp $ */ +/* $NetBSD: lfs_inode.h,v 1.11 2015/09/01 06:08:37 dholland Exp $ */ /* from NetBSD: ulfs_inode.h,v 1.5 2013/06/06 00:51:50 dholland Exp */ /* from NetBSD: inode.h,v 1.64 2012/11/19 00:36:21 jakllsch Exp */ @@ -155,51 +155,6 @@ struct inode { union lfs_dinode *i_din; }; -#define i_ffs1_atime i_din->u_32.di_atime -#define i_ffs1_atimensec i_din->u_32.di_atimensec -#define i_ffs1_blocks i_din->u_32.di_blocks -#define i_ffs1_ctime i_din->u_32.di_ctime -#define i_ffs1_ctimensec i_din->u_32.di_ctimensec -#define i_ffs1_db i_din->u_32.di_db -#define i_ffs1_flags i_din->u_32.di_flags -#define i_ffs1_gen i_din->u_32.di_gen -#define i_ffs1_gid i_din->u_32.di_gid -#define i_ffs1_ib i_din->u_32.di_ib -#define i_ffs1_mode i_din->u_32.di_mode -#define i_ffs1_mtime i_din->u_32.di_mtime -#define i_ffs1_mtimensec i_din->u_32.di_mtimensec -#define i_ffs1_nlink i_din->u_32.di_nlink -#define i_ffs1_rdev i_din->u_32.di_rdev -#define i_ffs1_size i_din->u_32.di_size -#define i_ffs1_uid i_din->u_32.di_uid -#define i_ffs1_modrev i_din->u_32.di_modrev - -#define i_ffs2_atime i_din->u_64.di_atime -#define i_ffs2_atimensec i_din->u_64.di_atimensec -#define i_ffs2_birthtime i_din->u_64.di_birthtime -#define i_ffs2_birthnsec i_din->u_64.di_birthnsec -#define i_ffs2_blocks i_din->u_64.di_blocks -#define i_ffs2_blksize i_din->u_64.di_blksize -#define i_ffs2_ctime i_din->u_64.di_ctime -#define i_ffs2_ctimensec i_din->u_64.di_ctimensec -#define i_ffs2_db i_din->u_64.di_db -#define i_ffs2_flags i_din->u_64.di_flags -#define i_ffs2_gen i_din->u_64.di_gen -#define i_ffs2_gid i_din->u_64.di_gid -#define i_ffs2_ib i_din->u_64.di_ib -#define i_ffs2_mode i_din->u_64.di_mode -#define i_ffs2_mtime i_din->u_64.di_mtime -#define i_ffs2_mtimensec i_din->u_64.di_mtimensec -#define i_ffs2_nlink i_din->u_64.di_nlink -#define i_ffs2_rdev i_din->u_64.di_rdev -#define i_ffs2_size i_din->u_64.di_size -#define i_ffs2_uid i_din->u_64.di_uid -#define i_ffs2_kernflags i_din->u_64.di_kernflags -#define i_ffs2_extsize i_din->u_64.di_extsize -#define i_ffs2_extb i_din->u_64.di_extb -#define i_ffs2_inumber i_din->u_64.di_inumber -#define i_ffs2_modrev i_din->u_64.di_modrev - /* These flags are kept in i_flag. */ #define IN_ACCESS 0x0001 /* Access time update request. */ #define IN_CHANGE 0x0002 /* Inode change time update request. */ Index: src/sys/ufs/lfs/lfs_itimes.c diff -u src/sys/ufs/lfs/lfs_itimes.c:1.18 src/sys/ufs/lfs/lfs_itimes.c:1.19 --- src/sys/ufs/lfs/lfs_itimes.c:1.18 Wed Aug 12 18:25:52 2015 +++ src/sys/ufs/lfs/lfs_itimes.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_itimes.c,v 1.18 2015/08/12 18:25:52 dholland Exp $ */ +/* $NetBSD: lfs_itimes.c,v 1.19 2015/09/01 06:08:37 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.18 2015/08/12 18:25:52 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_itimes.c,v 1.19 2015/09/01 06:08:37 dholland Exp $"); #include <sys/param.h> #include <sys/time.h> @@ -57,6 +57,7 @@ void lfs_itimes(struct inode *ip, const struct timespec *acc, const struct timespec *mod, const struct timespec *cre) { + struct lfs *fs = ip->i_lfs; #ifdef _KERNEL struct timespec now; @@ -70,14 +71,13 @@ lfs_itimes(struct inode *ip, const struc if (acc == NULL) acc = &now; #endif - ip->i_ffs1_atime = acc->tv_sec; - ip->i_ffs1_atimensec = acc->tv_nsec; - if (ip->i_lfs->lfs_is64 || lfs_sb_getversion(ip->i_lfs) > 1) { - struct lfs *fs = ip->i_lfs; + lfs_dino_setatime(fs, ip->i_din, acc->tv_sec); + lfs_dino_setatimensec(fs, ip->i_din, acc->tv_nsec); + if (fs->lfs_is64 || lfs_sb_getversion(fs) > 1) { struct buf *ibp; IFILE *ifp; - LFS_IENTRY(ifp, ip->i_lfs, ip->i_number, ibp); + LFS_IENTRY(ifp, fs, ip->i_number, ibp); lfs_if_setatime_sec(fs, ifp, acc->tv_sec); lfs_if_setatime_nsec(fs, ifp, acc->tv_nsec); LFS_BWRITE_LOG(ibp); @@ -96,8 +96,8 @@ lfs_itimes(struct inode *ip, const struc if (mod == NULL) mod = &now; #endif - ip->i_ffs1_mtime = mod->tv_sec; - ip->i_ffs1_mtimensec = mod->tv_nsec; + lfs_dino_setmtime(fs, ip->i_din, mod->tv_sec); + lfs_dino_setmtimensec(fs, ip->i_din, mod->tv_nsec); ip->i_modrev++; } if (ip->i_flag & (IN_CHANGE | IN_MODIFY)) { @@ -105,8 +105,8 @@ lfs_itimes(struct inode *ip, const struc if (cre == NULL) cre = &now; #endif - ip->i_ffs1_ctime = cre->tv_sec; - ip->i_ffs1_ctimensec = cre->tv_nsec; + lfs_dino_setctime(fs, ip->i_din, cre->tv_sec); + lfs_dino_setctimensec(fs, ip->i_din, cre->tv_nsec); } mutex_enter(&lfs_lock); if (ip->i_flag & (IN_CHANGE | IN_UPDATE)) Index: src/sys/ufs/lfs/lfs_rfw.c diff -u src/sys/ufs/lfs/lfs_rfw.c:1.30 src/sys/ufs/lfs/lfs_rfw.c:1.31 --- src/sys/ufs/lfs/lfs_rfw.c:1.30 Wed Aug 19 20:33:29 2015 +++ src/sys/ufs/lfs/lfs_rfw.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_rfw.c,v 1.30 2015/08/19 20:33:29 dholland Exp $ */ +/* $NetBSD: lfs_rfw.c,v 1.31 2015/09/01 06:08:37 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.30 2015/08/19 20:33:29 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_rfw.c,v 1.31 2015/09/01 06:08:37 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_quota.h" @@ -124,12 +124,13 @@ lfs_rf_valloc(struct lfs *fs, ino_t ino, return 0; else if (ip->i_gen < vers) { lfs_truncate(vp, (off_t)0, 0, NOCRED); - ip->i_gen = ip->i_ffs1_gen = vers; + ip->i_gen = vers; + lfs_dino_setgen(fs, ip->i_din, vers); LFS_SET_UINO(ip, IN_CHANGE | IN_UPDATE); return 0; } else { DLOG((DLOG_RF, "ino %d: sought version %d, got %d\n", - ino, vers, ip->i_ffs1_gen)); + ino, vers, lfs_dino_getgen(fs, ip->i_din))); vput(vp); *vpp = NULLVP; return EEXIST; @@ -152,7 +153,8 @@ lfs_rf_valloc(struct lfs *fs, ino_t ino, return error; } ip = VTOI(vp); - ip->i_nlink = ip->i_ffs1_nlink = 1; + ip->i_nlink = 1; + lfs_dino_setnlink(fs, ip->i_din, 1); *vpp = vp; return 0; } @@ -208,11 +210,13 @@ update_meta(struct lfs *fs, ino_t ino, i if (ip->i_size <= (lbn << lfs_sb_getbshift(fs))) { u_int64_t newsize; - if (lbn < ULFS_NDADDR) - newsize = ip->i_ffs1_size = (lbn << lfs_sb_getbshift(fs)) + + if (lbn < ULFS_NDADDR) { + newsize = (lbn << lfs_sb_getbshift(fs)) + (size - lfs_sb_getfsize(fs)) + 1; - else - newsize = ip->i_ffs1_size = (lbn << lfs_sb_getbshift(fs)) + 1; + } else { + newsize = (lbn << lfs_sb_getbshift(fs)) + 1; + } + lfs_dino_setsize(fs, ip->i_din, newsize); if (ip->i_size < newsize) { ip->i_size = newsize; @@ -232,8 +236,8 @@ update_meta(struct lfs *fs, ino_t ino, i /* differences here should be due to UNWRITTEN indirect blocks. */ KASSERT((lfs_lblkno(fs, ip->i_size) > ULFS_NDADDR && - ip->i_lfs_effnblks == ip->i_ffs1_blocks) || - ip->i_lfs_effnblks >= ip->i_ffs1_blocks); + ip->i_lfs_effnblks == lfs_dino_getblocks(fs, ip->i_din)) || + ip->i_lfs_effnblks >= lfs_dino_getblocks(fs, ip->i_din)); #ifdef DEBUG /* Now look again to make sure it worked */ Index: src/sys/ufs/lfs/lfs_segment.c diff -u src/sys/ufs/lfs/lfs_segment.c:1.258 src/sys/ufs/lfs/lfs_segment.c:1.259 --- src/sys/ufs/lfs/lfs_segment.c:1.258 Fri Aug 21 07:35:56 2015 +++ src/sys/ufs/lfs/lfs_segment.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_segment.c,v 1.258 2015/08/21 07:35:56 hannken Exp $ */ +/* $NetBSD: lfs_segment.c,v 1.259 2015/09/01 06:08:37 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.258 2015/08/21 07:35:56 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.259 2015/09/01 06:08:37 dholland Exp $"); #ifdef DEBUG # define vndebug(vp, str) do { \ @@ -175,8 +175,8 @@ lfs_imtime(struct lfs *fs) ASSERT_MAYBE_SEGLOCK(fs); vfs_timestamp(&ts); ip = VTOI(fs->lfs_ivnode); - ip->i_ffs1_mtime = ts.tv_sec; - ip->i_ffs1_mtimensec = ts.tv_nsec; + lfs_dino_setmtime(fs, ip->i_din, ts.tv_sec); + lfs_dino_setmtimensec(fs, ip->i_din, ts.tv_nsec); } /* @@ -1200,17 +1200,17 @@ lfs_writeinode(struct lfs *fs, struct se */ /* Check file size based on highest allocated block */ - if (((ip->i_ffs1_mode & LFS_IFMT) == LFS_IFREG || - (ip->i_ffs1_mode & LFS_IFMT) == LFS_IFDIR) && + if (((lfs_dino_getmode(fs, ip->i_din) & LFS_IFMT) == LFS_IFREG || + (lfs_dino_getmode(fs, ip->i_din) & LFS_IFMT) == LFS_IFDIR) && ip->i_size > ((ip->i_lfs_hiblk + 1) << lfs_sb_getbshift(fs))) { lfs_dino_setsize(fs, cdp, (ip->i_lfs_hiblk + 1) << lfs_sb_getbshift(fs)); DLOG((DLOG_SEG, "lfs_writeinode: ino %d size %" PRId64 " -> %" PRId64 "\n", (int)ip->i_number, ip->i_size, lfs_dino_getsize(fs, cdp))); } - if (ip->i_lfs_effnblks != ip->i_ffs1_blocks) { + if (ip->i_lfs_effnblks != lfs_dino_getblocks(fs, ip->i_din)) { DLOG((DLOG_SEG, "lfs_writeinode: cleansing ino %d eff %jd != nblk %d)" " at %jx\n", ip->i_number, (intmax_t)ip->i_lfs_effnblks, - ip->i_ffs1_blocks, (uintmax_t)lfs_sb_getoffset(fs))); + lfs_dino_getblocks(fs, ip->i_din), (uintmax_t)lfs_sb_getoffset(fs))); for (i=0; i<ULFS_NDADDR; i++) { if (lfs_dino_getdb(fs, cdp, i) == UNWRITTEN) { DLOG((DLOG_SEG, "lfs_writeinode: wiping UNWRITTEN\n")); @@ -1253,12 +1253,12 @@ lfs_writeinode(struct lfs *fs, struct se /* XXX IN_ALLMOD */ LFS_CLR_UINO(ip, IN_ACCESSED | IN_ACCESS | IN_CHANGE | IN_UPDATE | IN_MODIFY); - if (ip->i_lfs_effnblks == ip->i_ffs1_blocks) + if (ip->i_lfs_effnblks == lfs_dino_getblocks(fs, ip->i_din)) LFS_CLR_UINO(ip, IN_MODIFIED); else { DLOG((DLOG_VNODE, "lfs_writeinode: ino %d: real " "blks=%d, eff=%jd\n", ip->i_number, - ip->i_ffs1_blocks, (intmax_t)ip->i_lfs_effnblks)); + lfs_dino_getblocks(fs, ip->i_din), (intmax_t)ip->i_lfs_effnblks)); } } @@ -1483,23 +1483,26 @@ lfs_update_single(struct lfs *fs, struct bb = lfs_numfrags(fs, size); switch (num) { case 0: - ooff = ip->i_ffs1_db[lbn]; + ooff = lfs_dino_getdb(fs, ip->i_din, lbn); DEBUG_OOFF(0); if (ooff == UNWRITTEN) - ip->i_ffs1_blocks += bb; + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + bb); else { /* possible fragment truncation or extension */ obb = lfs_btofsb(fs, ip->i_lfs_fragsize[lbn]); - ip->i_ffs1_blocks += (bb - obb); + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + (bb-obb)); } - ip->i_ffs1_db[lbn] = ndaddr; + lfs_dino_setdb(fs, ip->i_din, lbn, ndaddr); break; case 1: - ooff = ip->i_ffs1_ib[a[0].in_off]; + ooff = lfs_dino_getib(fs, ip->i_din, a[0].in_off); DEBUG_OOFF(1); if (ooff == UNWRITTEN) - ip->i_ffs1_blocks += bb; - ip->i_ffs1_ib[a[0].in_off] = ndaddr; + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + bb); + lfs_dino_setib(fs, ip->i_din, a[0].in_off, ndaddr); break; default: ap = &a[num - 1]; @@ -1508,13 +1511,12 @@ lfs_update_single(struct lfs *fs, struct panic("lfs_updatemeta: bread bno %" PRId64, ap->in_lbn); - /* XXX ondisk32 */ - ooff = ((int32_t *)bp->b_data)[ap->in_off]; + ooff = lfs_iblock_get(fs, bp->b_data, ap->in_off); DEBUG_OOFF(num); if (ooff == UNWRITTEN) - ip->i_ffs1_blocks += bb; - /* XXX ondisk32 */ - ((int32_t *)bp->b_data)[ap->in_off] = ndaddr; + lfs_dino_setblocks(fs, ip->i_din, + lfs_dino_getblocks(fs, ip->i_din) + bb); + lfs_iblock_set(fs, bp->b_data, ap->in_off, ndaddr); (void) VOP_BWRITE(bp->b_vp, bp); } @@ -2145,12 +2147,12 @@ lfs_writeseg(struct lfs *fs, struct segm * XXX See comment in lfs_writefile. */ if (bp->b_lblkno < 0 && bp->b_vp != devvp && bp->b_vp && - VTOI(bp->b_vp)->i_ffs1_blocks != + lfs_dino_getblocks(fs, VTOI(bp->b_vp)->i_din) != VTOI(bp->b_vp)->i_lfs_effnblks) { DLOG((DLOG_VNODE, "lfs_writeseg: cleansing ino %d (%jd != %d)\n", VTOI(bp->b_vp)->i_number, (intmax_t)VTOI(bp->b_vp)->i_lfs_effnblks, - VTOI(bp->b_vp)->i_ffs1_blocks)); + lfs_dino_getblocks(fs, VTOI(bp->b_vp)->i_din))); /* Make a copy we'll make changes to */ newbp = lfs_newbuf(fs, bp->b_vp, bp->b_lblkno, bp->b_bcount, LFS_NB_IBLOCK); Index: src/sys/ufs/lfs/lfs_syscalls.c diff -u src/sys/ufs/lfs/lfs_syscalls.c:1.169 src/sys/ufs/lfs/lfs_syscalls.c:1.170 --- src/sys/ufs/lfs/lfs_syscalls.c:1.169 Wed Aug 12 18:28:01 2015 +++ src/sys/ufs/lfs/lfs_syscalls.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_syscalls.c,v 1.169 2015/08/12 18:28:01 dholland Exp $ */ +/* $NetBSD: lfs_syscalls.c,v 1.170 2015/09/01 06:08:37 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.169 2015/08/12 18:28:01 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_syscalls.c,v 1.170 2015/09/01 06:08:37 dholland Exp $"); #ifndef LFS # define LFS /* for prototypes in syscallargs.h */ @@ -248,7 +248,7 @@ lfs_markv(struct lwp *l, fsid_t *fsidp, if (fs->lfs_ronly) return EROFS; - maxino = (lfs_fragstoblks(fs, VTOI(fs->lfs_ivnode)->i_ffs1_blocks) - + maxino = (lfs_fragstoblks(fs, lfs_dino_getblocks(fs, VTOI(fs->lfs_ivnode)->i_din)) - lfs_sb_getcleansz(fs) - lfs_sb_getsegtabsz(fs)) * lfs_sb_getifpb(fs); cnt = blkcnt; Index: src/sys/ufs/lfs/lfs_vfsops.c diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.341 src/sys/ufs/lfs/lfs_vfsops.c:1.342 --- src/sys/ufs/lfs/lfs_vfsops.c:1.341 Wed Aug 19 20:33:29 2015 +++ src/sys/ufs/lfs/lfs_vfsops.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vfsops.c,v 1.341 2015/08/19 20:33:29 dholland Exp $ */ +/* $NetBSD: lfs_vfsops.c,v 1.342 2015/09/01 06:08:37 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.341 2015/08/19 20:33:29 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.342 2015/09/01 06:08:37 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_lfs.h" @@ -1661,8 +1661,8 @@ again: out: if (lfs_sb_getversion(fs) > 1) { - ip->i_ffs1_atime = ts.tv_sec; - ip->i_ffs1_atimensec = ts.tv_nsec; + lfs_dino_setatime(fs, ip->i_din, ts.tv_sec); + lfs_dino_setatimensec(fs, ip->i_din, ts.tv_nsec); } lfs_vinit(mp, &vp); @@ -1721,7 +1721,7 @@ lfs_newvnode(struct mount *mp, struct vn /* Set a new generation number for this inode. */ ip->i_gen = gen; - ip->i_ffs1_gen = gen; + lfs_dino_setgen(fs, ip->i_din, gen); memset(ip->i_lfs_fragsize, 0, ULFS_NDADDR * sizeof(*ip->i_lfs_fragsize)); @@ -1757,11 +1757,12 @@ lfs_newvnode(struct mount *mp, struct vn * Want to be able to use this to make badblock * inodes, so don't truncate the dev number. */ + // XXX clean this up if (ump->um_fstype == ULFS1) - ip->i_ffs1_rdev = ulfs_rw32(vap->va_rdev, + ip->i_din->u_32.di_rdev = ulfs_rw32(vap->va_rdev, ULFS_MPNEEDSWAP(fs)); else - ip->i_ffs2_rdev = ulfs_rw64(vap->va_rdev, + ip->i_din->u_64.di_rdev = ulfs_rw64(vap->va_rdev, ULFS_MPNEEDSWAP(fs)); } lfs_vinit(mp, &vp); @@ -1791,7 +1792,7 @@ lfs_fhtovp(struct mount *mp, struct fid return ESTALE; if (lfh.lfid_ino > - ((VTOI(fs->lfs_ivnode)->i_ffs1_size >> lfs_sb_getbshift(fs)) - + ((lfs_dino_getsize(fs, VTOI(fs->lfs_ivnode)->i_din) >> lfs_sb_getbshift(fs)) - lfs_sb_getcleansz(fs) - lfs_sb_getsegtabsz(fs)) * lfs_sb_getifpb(fs)) return ESTALE; @@ -2203,16 +2204,16 @@ lfs_vinit(struct mount *mp, struct vnode struct lfs *fs = ump->um_lfs; int i; - ip->i_mode = ip->i_ffs1_mode; - ip->i_nlink = ip->i_ffs1_nlink; - ip->i_lfs_osize = ip->i_size = ip->i_ffs1_size; - ip->i_flags = ip->i_ffs1_flags; - ip->i_gen = ip->i_ffs1_gen; - ip->i_uid = ip->i_ffs1_uid; - ip->i_gid = ip->i_ffs1_gid; + ip->i_mode = lfs_dino_getmode(fs, ip->i_din); + ip->i_nlink = lfs_dino_getnlink(fs, ip->i_din); + ip->i_lfs_osize = ip->i_size = lfs_dino_getsize(fs, ip->i_din); + ip->i_flags = lfs_dino_getflags(fs, ip->i_din); + ip->i_gen = lfs_dino_getgen(fs, ip->i_din); + ip->i_uid = lfs_dino_getuid(fs, ip->i_din); + ip->i_gid = lfs_dino_getgid(fs, ip->i_din); - ip->i_lfs_effnblks = ip->i_ffs1_blocks; - ip->i_lfs_odnlink = ip->i_ffs1_nlink; + ip->i_lfs_effnblks = lfs_dino_getblocks(fs, ip->i_din); + ip->i_lfs_odnlink = lfs_dino_getnlink(fs, ip->i_din); /* * Initialize the vnode from the inode, check for aliases. In all @@ -2229,20 +2230,20 @@ lfs_vinit(struct mount *mp, struct vnode if ((vp->v_type == VBLK || vp->v_type == VCHR) && i == 0) continue; - if (ip->i_ffs1_db[i] != 0) { + if (lfs_dino_getdb(fs, ip->i_din, i) != 0) { lfs_dump_dinode(fs, ip->i_din); panic("inconsistent inode (direct)"); } } for ( ; i < ULFS_NDADDR + ULFS_NIADDR; i++) { - if (ip->i_ffs1_ib[i - ULFS_NDADDR] != 0) { + if (lfs_dino_getib(fs, ip->i_din, i - ULFS_NDADDR) != 0) { lfs_dump_dinode(fs, ip->i_din); panic("inconsistent inode (indirect)"); } } #endif /* DEBUG */ for (i = 0; i < ULFS_NDADDR; i++) - if (ip->i_ffs1_db[i] != 0) + if (lfs_dino_getdb(fs, ip->i_din, i) != 0) ip->i_lfs_fragsize[i] = lfs_blksize(fs, ip, i); } @@ -2367,7 +2368,7 @@ lfs_resize_fs(struct lfs *fs, int newnse /* Register new ifile size */ ip->i_size += noff * lfs_sb_getbsize(fs); - ip->i_ffs1_size = ip->i_size; + lfs_dino_setsize(fs, ip->i_din, ip->i_size); uvm_vnp_setsize(ivp, ip->i_size); /* Copy the inode table to its new position */ Index: src/sys/ufs/lfs/lfs_vnops.c diff -u src/sys/ufs/lfs/lfs_vnops.c:1.287 src/sys/ufs/lfs/lfs_vnops.c:1.288 --- src/sys/ufs/lfs/lfs_vnops.c:1.287 Wed Aug 19 20:33:29 2015 +++ src/sys/ufs/lfs/lfs_vnops.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: lfs_vnops.c,v 1.287 2015/08/19 20:33:29 dholland Exp $ */ +/* $NetBSD: lfs_vnops.c,v 1.288 2015/09/01 06:08:37 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.287 2015/08/19 20:33:29 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.288 2015/09/01 06:08:37 dholland Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -1150,14 +1150,22 @@ lfs_getattr(void *v) vap->va_nlink = ip->i_nlink; vap->va_uid = ip->i_uid; vap->va_gid = ip->i_gid; - vap->va_rdev = (dev_t)ip->i_ffs1_rdev; + switch (vp->v_type) { + case VBLK: + case VCHR: + vap->va_rdev = (dev_t)lfs_dino_getrdev(fs, ip->i_din); + break; + default: + vap->va_rdev = NODEV; + break; + } vap->va_size = vp->v_size; - vap->va_atime.tv_sec = ip->i_ffs1_atime; - vap->va_atime.tv_nsec = ip->i_ffs1_atimensec; - vap->va_mtime.tv_sec = ip->i_ffs1_mtime; - vap->va_mtime.tv_nsec = ip->i_ffs1_mtimensec; - vap->va_ctime.tv_sec = ip->i_ffs1_ctime; - vap->va_ctime.tv_nsec = ip->i_ffs1_ctimensec; + vap->va_atime.tv_sec = lfs_dino_getatime(fs, ip->i_din); + vap->va_atime.tv_nsec = lfs_dino_getatimensec(fs, ip->i_din); + vap->va_mtime.tv_sec = lfs_dino_getmtime(fs, ip->i_din); + vap->va_mtime.tv_nsec = lfs_dino_getmtimensec(fs, ip->i_din); + vap->va_ctime.tv_sec = lfs_dino_getctime(fs, ip->i_din); + vap->va_ctime.tv_nsec = lfs_dino_getctimensec(fs, ip->i_din); vap->va_flags = ip->i_flags; vap->va_gen = ip->i_gen; /* this doesn't belong here */ Index: src/sys/ufs/lfs/ulfs_bmap.c diff -u src/sys/ufs/lfs/ulfs_bmap.c:1.6 src/sys/ufs/lfs/ulfs_bmap.c:1.7 --- src/sys/ufs/lfs/ulfs_bmap.c:1.6 Sun Aug 2 18:18:46 2015 +++ src/sys/ufs/lfs/ulfs_bmap.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ulfs_bmap.c,v 1.6 2015/08/02 18:18:46 dholland Exp $ */ +/* $NetBSD: ulfs_bmap.c,v 1.7 2015/09/01 06:08:37 dholland Exp $ */ /* from NetBSD: ufs_bmap.c,v 1.50 2013/01/22 09:39:18 dholland Exp */ /* @@ -38,7 +38,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ulfs_bmap.c,v 1.6 2015/08/02 18:18:46 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ulfs_bmap.c,v 1.7 2015/09/01 06:08:37 dholland Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -172,10 +172,10 @@ ulfs_bmaparray(struct vnode *vp, daddr_t if (nump != NULL) *nump = 0; if (ump->um_fstype == ULFS1) - daddr = ulfs_fix_unwritten(ulfs_rw32(ip->i_ffs1_db[bn], + daddr = ulfs_fix_unwritten(ulfs_rw32(ip->i_din->u_32.di_db[bn], ULFS_MPNEEDSWAP(fs))); else - daddr = ulfs_rw64(ip->i_ffs2_db[bn], + daddr = ulfs_rw64(ip->i_din->u_64.di_db[bn], ULFS_MPNEEDSWAP(fs)); *bnp = blkptrtodb(fs, daddr); /* @@ -201,17 +201,17 @@ ulfs_bmaparray(struct vnode *vp, daddr_t if (ump->um_fstype == ULFS1) { for (++bn; bn < ULFS_NDADDR && *runp < maxrun && is_sequential(fs, - ulfs_fix_unwritten(ulfs_rw32(ip->i_ffs1_db[bn - 1], + ulfs_fix_unwritten(ulfs_rw32(ip->i_din->u_32.di_db[bn - 1], ULFS_MPNEEDSWAP(fs))), - ulfs_fix_unwritten(ulfs_rw32(ip->i_ffs1_db[bn], + ulfs_fix_unwritten(ulfs_rw32(ip->i_din->u_32.di_db[bn], ULFS_MPNEEDSWAP(fs)))); ++bn, ++*runp); } else { for (++bn; bn < ULFS_NDADDR && *runp < maxrun && is_sequential(fs, - ulfs_rw64(ip->i_ffs2_db[bn - 1], + ulfs_rw64(ip->i_din->u_64.di_db[bn - 1], ULFS_MPNEEDSWAP(fs)), - ulfs_rw64(ip->i_ffs2_db[bn], + ulfs_rw64(ip->i_din->u_64.di_db[bn], ULFS_MPNEEDSWAP(fs))); ++bn, ++*runp); } @@ -228,11 +228,12 @@ ulfs_bmaparray(struct vnode *vp, daddr_t num = *nump; /* Get disk address out of indirect block array */ + // XXX clean this up if (ump->um_fstype == ULFS1) - daddr = ulfs_fix_unwritten(ulfs_rw32(ip->i_ffs1_ib[xap->in_off], + daddr = ulfs_fix_unwritten(ulfs_rw32(ip->i_din->u_32.di_ib[xap->in_off], ULFS_MPNEEDSWAP(fs))); else - daddr = ulfs_rw64(ip->i_ffs2_ib[xap->in_off], + daddr = ulfs_rw64(ip->i_din->u_64.di_ib[xap->in_off], ULFS_MPNEEDSWAP(fs)); for (bp = NULL, ++xap; --num; ++xap) { Index: src/sys/ufs/lfs/ulfs_vnops.c diff -u src/sys/ufs/lfs/ulfs_vnops.c:1.26 src/sys/ufs/lfs/ulfs_vnops.c:1.27 --- src/sys/ufs/lfs/ulfs_vnops.c:1.26 Sun May 31 15:48:03 2015 +++ src/sys/ufs/lfs/ulfs_vnops.c Tue Sep 1 06:08:37 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: ulfs_vnops.c,v 1.26 2015/05/31 15:48:03 hannken Exp $ */ +/* $NetBSD: ulfs_vnops.c,v 1.27 2015/09/01 06:08:37 dholland Exp $ */ /* from NetBSD: ufs_vnops.c,v 1.213 2013/06/08 05:47:02 kardel Exp */ /*- @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.26 2015/05/31 15:48:03 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c,v 1.27 2015/09/01 06:08:37 dholland Exp $"); #if defined(_KERNEL_OPT) #include "opt_lfs.h" @@ -106,6 +106,7 @@ __KERNEL_RCSID(0, "$NetBSD: ulfs_vnops.c #endif #include <ufs/lfs/lfs_extern.h> #include <ufs/lfs/lfs.h> +#include <ufs/lfs/lfs_accessors.h> #include <uvm/uvm.h> @@ -236,6 +237,7 @@ ulfs_setattr(void *v) struct vattr *vap; struct vnode *vp; struct inode *ip; + struct lfs *fs; kauth_cred_t cred; struct lwp *l; int error; @@ -245,6 +247,7 @@ ulfs_setattr(void *v) vap = ap->a_vap; vp = ap->a_vp; ip = VTOI(vp); + fs = ip->i_lfs; cred = ap->a_cred; l = curlwp; action = KAUTH_VNODE_WRITE_FLAGS; @@ -375,10 +378,9 @@ ulfs_setattr(void *v) if (vp->v_mount->mnt_flag & MNT_RELATIME) ip->i_flag |= IN_ACCESS; } - if (vap->va_birthtime.tv_sec != VNOVAL && - ip->i_ump->um_fstype == ULFS2) { - ip->i_ffs2_birthtime = vap->va_birthtime.tv_sec; - ip->i_ffs2_birthnsec = vap->va_birthtime.tv_nsec; + if (vap->va_birthtime.tv_sec != VNOVAL) { + lfs_dino_setbirthtime(fs, ip->i_din, + &vap->va_birthtime); } error = lfs_update(vp, &vap->va_atime, &vap->va_mtime, 0); if (error) @@ -1140,11 +1142,12 @@ ulfs_vinit(struct mount *mntp, int (**sp case VBLK: vp->v_op = specops; ump = ip->i_ump; + // XXX clean this up if (ump->um_fstype == ULFS1) - rdev = (dev_t)ulfs_rw32(ip->i_ffs1_rdev, + rdev = (dev_t)ulfs_rw32(ip->i_din->u_32.di_rdev, ULFS_MPNEEDSWAP(ump->um_lfs)); else - rdev = (dev_t)ulfs_rw64(ip->i_ffs2_rdev, + rdev = (dev_t)ulfs_rw64(ip->i_din->u_64.di_rdev, ULFS_MPNEEDSWAP(ump->um_lfs)); spec_node_init(vp, rdev); break;