Module Name: src
Committed By: dholland
Date: Wed Aug 19 20:33:29 UTC 2015
Modified Files:
src/sbin/fsck_lfs: inode.c lfs.c lfs_user.h pass6.c segwrite.c vnode.c
src/sbin/newfs_lfs: make_lfs.c
src/sys/ufs/lfs: lfs_accessors.h lfs_inode.c lfs_inode.h lfs_rfw.c
lfs_segment.c lfs_vfsops.c lfs_vnops.c
Log Message:
Part two of dinodes; use the same union everywhere.
(previously the ufs-derived code had things set up slightly different)
Remove a bunch of associated mess.
To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/sbin/fsck_lfs/inode.c
cvs rdiff -u -r1.56 -r1.57 src/sbin/fsck_lfs/lfs.c
cvs rdiff -u -r1.10 -r1.11 src/sbin/fsck_lfs/lfs_user.h
cvs rdiff -u -r1.42 -r1.43 src/sbin/fsck_lfs/pass6.c
cvs rdiff -u -r1.41 -r1.42 src/sbin/fsck_lfs/segwrite.c
cvs rdiff -u -r1.14 -r1.15 src/sbin/fsck_lfs/vnode.c
cvs rdiff -u -r1.43 -r1.44 src/sbin/newfs_lfs/make_lfs.c
cvs rdiff -u -r1.13 -r1.14 src/sys/ufs/lfs/lfs_accessors.h
cvs rdiff -u -r1.144 -r1.145 src/sys/ufs/lfs/lfs_inode.c
cvs rdiff -u -r1.9 -r1.10 src/sys/ufs/lfs/lfs_inode.h
cvs rdiff -u -r1.29 -r1.30 src/sys/ufs/lfs/lfs_rfw.c
cvs rdiff -u -r1.256 -r1.257 src/sys/ufs/lfs/lfs_segment.c
cvs rdiff -u -r1.340 -r1.341 src/sys/ufs/lfs/lfs_vfsops.c
cvs rdiff -u -r1.286 -r1.287 src/sys/ufs/lfs/lfs_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/inode.c
diff -u src/sbin/fsck_lfs/inode.c:1.59 src/sbin/fsck_lfs/inode.c:1.60
--- src/sbin/fsck_lfs/inode.c:1.59 Wed Aug 12 18:28:00 2015
+++ src/sbin/fsck_lfs/inode.c Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: inode.c,v 1.59 2015/08/12 18:28:00 dholland Exp $ */
+/* $NetBSD: inode.c,v 1.60 2015/08/19 20:33:29 dholland Exp $ */
/*-
* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@@ -119,8 +119,7 @@ ginode(ino_t ino)
seg_table[segno].su_nbytes += DINOSIZE(fs);
brelse(bp, 0);
}
- // XXX bogus cast
- return (union lfs_dinode *)(VTOI(vp)->i_din.ffs1_din);
+ return VTOI(vp)->i_din;
}
/*
@@ -621,8 +620,7 @@ allocino(ino_t request, int type)
vp = lfs_valloc(fs, ino);
if (vp == NULL)
return (0);
- // XXX bogus cast
- dp = (union lfs_dinode *)(VTOI(vp)->i_din.ffs1_din);
+ dp = VTOI(vp)->i_din;
bp = getblk(vp, 0, lfs_sb_getfsize(fs));
VOP_BWRITE(bp);
lfs_dino_setmode(fs, dp, type);
Index: src/sbin/fsck_lfs/lfs.c
diff -u src/sbin/fsck_lfs/lfs.c:1.56 src/sbin/fsck_lfs/lfs.c:1.57
--- src/sbin/fsck_lfs/lfs.c:1.56 Wed Aug 12 18:28:00 2015
+++ src/sbin/fsck_lfs/lfs.c Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs.c,v 1.56 2015/08/12 18:28:00 dholland Exp $ */
+/* $NetBSD: lfs.c,v 1.57 2015/08/19 20:33:29 dholland Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -356,9 +356,7 @@ lfs_raw_vget(struct lfs * fs, ino_t ino,
ip = ecalloc(1, sizeof(*ip));
- dip = ecalloc(1, sizeof(*dip));
- // XXX bogus cast
- ip->i_din.ffs1_din = (struct lfs32_dinode *)dip;
+ ip->i_din = dip = ecalloc(1, sizeof(*dip));
/* Initialize the inode -- from lfs_vcreate. */
ip->inode_ext.lfs = ecalloc(1, sizeof(*ip->inode_ext.lfs));
@@ -381,12 +379,7 @@ lfs_raw_vget(struct lfs * fs, ino_t ino,
free(vp);
return NULL;
}
- // XXX this should go away
- if (fs->lfs_is64) {
- memcpy(ip->i_din.ffs2_din, &dip->u_64, sizeof(dip->u_64));
- } else {
- memcpy(ip->i_din.ffs1_din, &dip->u_32, sizeof(dip->u_32));
- }
+ lfs_copy_dinode(fs, ip->i_din, dip);
brelse(bp, 0);
}
ip->i_number = ino;
Index: src/sbin/fsck_lfs/lfs_user.h
diff -u src/sbin/fsck_lfs/lfs_user.h:1.10 src/sbin/fsck_lfs/lfs_user.h:1.11
--- src/sbin/fsck_lfs/lfs_user.h:1.10 Wed Aug 12 18:28:00 2015
+++ src/sbin/fsck_lfs/lfs_user.h Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_user.h,v 1.10 2015/08/12 18:28:00 dholland Exp $ */
+/* $NetBSD: lfs_user.h,v 1.11 2015/08/19 20:33:29 dholland Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -72,8 +72,7 @@ typedef int32_t ulfs_daddr_t;
/* Convert between inode pointers and vnode pointers. */
#define VTOI(vp) ((struct inode *)(vp)->v_data)
-// XXX bogus cast
-#define VTOD(vp) ((union lfs_dinode *)(VTOI(vp)->i_din.ffs1_din))
+#define VTOD(vp) (VTOI(vp)->i_din)
#define sbdirty() ++fsdirty
Index: src/sbin/fsck_lfs/pass6.c
diff -u src/sbin/fsck_lfs/pass6.c:1.42 src/sbin/fsck_lfs/pass6.c:1.43
--- src/sbin/fsck_lfs/pass6.c:1.42 Wed Aug 12 18:28:00 2015
+++ src/sbin/fsck_lfs/pass6.c Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: pass6.c,v 1.42 2015/08/12 18:28:00 dholland Exp $ */
+/* $NetBSD: pass6.c,v 1.43 2015/08/19 20:33:29 dholland Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -448,12 +448,7 @@ readdress_inode(union lfs_dinode *dp, ul
/* Copy over preexisting in-core inode, if any */
vp = vget(fs, thisino);
- /* XXX this is lame */
- if (fs->lfs_is64) {
- memcpy(VTOI(vp)->i_din.ffs2_din, &dp->u_64, sizeof(dp->u_64));
- } else {
- memcpy(VTOI(vp)->i_din.ffs1_din, &dp->u_32, sizeof(dp->u_32));
- }
+ lfs_copy_dinode(fs, VTOI(vp)->i_din, dp);
/* Finally account the inode itself */
sn = lfs_dtosn(fs, odaddr);
Index: src/sbin/fsck_lfs/segwrite.c
diff -u src/sbin/fsck_lfs/segwrite.c:1.41 src/sbin/fsck_lfs/segwrite.c:1.42
--- src/sbin/fsck_lfs/segwrite.c:1.41 Wed Aug 12 18:28:00 2015
+++ src/sbin/fsck_lfs/segwrite.c Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: segwrite.c,v 1.41 2015/08/12 18:28:00 dholland Exp $ */
+/* $NetBSD: segwrite.c,v 1.42 2015/08/19 20:33:29 dholland Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -291,6 +291,7 @@ lfs_writeinode(struct lfs * fs, struct s
sp->sum_bytes_left -= sizeof(ulfs_daddr_t);
ndx = lfs_sb_getsumsize(fs) / sizeof(ulfs_daddr_t) -
sp->ninodes / LFS_INOPB(fs) - 1;
+ /* XXX ondisk32 */
((ulfs_daddr_t *) (sp->segsum))[ndx] = daddr;
}
/* Update the inode times and copy the inode onto the inode page. */
@@ -309,23 +310,13 @@ lfs_writeinode(struct lfs * fs, struct s
* already been gathered.
*/
if (ip->i_number == LFS_IFILE_INUM && sp->idp) {
- // XXX weak
- if (fs->lfs_is64) {
- sp->idp->u_64 = *ip->i_din.ffs2_din;
- } else {
- sp->idp->u_32 = *ip->i_din.ffs1_din;
- }
+ lfs_copy_dinode(fs, sp->idp, ip->i_din);
ip->i_lfs_osize = ip->i_ffs1_size;
return 0;
}
bp = sp->ibp;
cdp = DINO_IN_BLOCK(fs, bp->b_data, sp->ninodes % LFS_INOPB(fs));
- // XXX weak
- if (fs->lfs_is64) {
- cdp->u_64 = *ip->i_din.ffs2_din;
- } else {
- cdp->u_32 = *ip->i_din.ffs1_din;
- }
+ 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;
Index: src/sbin/fsck_lfs/vnode.c
diff -u src/sbin/fsck_lfs/vnode.c:1.14 src/sbin/fsck_lfs/vnode.c:1.15
--- src/sbin/fsck_lfs/vnode.c:1.14 Sat Jun 8 02:16:03 2013
+++ src/sbin/fsck_lfs/vnode.c Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: vnode.c,v 1.14 2013/06/08 02:16:03 dholland Exp $ */
+/* $NetBSD: vnode.c,v 1.15 2015/08/19 20:33:29 dholland Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -141,7 +141,7 @@ vnode_destroy(struct uvnode *tossvp)
buf_destroy(bp);
}
free(VTOI(tossvp)->inode_ext.lfs);
- free(VTOI(tossvp)->i_din.ffs1_din);
+ free(VTOI(tossvp)->i_din);
memset(VTOI(tossvp), 0, sizeof(struct inode));
free(tossvp->v_data);
memset(tossvp, 0, sizeof(*tossvp));
Index: src/sbin/newfs_lfs/make_lfs.c
diff -u src/sbin/newfs_lfs/make_lfs.c:1.43 src/sbin/newfs_lfs/make_lfs.c:1.44
--- src/sbin/newfs_lfs/make_lfs.c:1.43 Wed Aug 12 18:28:01 2015
+++ src/sbin/newfs_lfs/make_lfs.c Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: make_lfs.c,v 1.43 2015/08/12 18:28:01 dholland Exp $ */
+/* $NetBSD: make_lfs.c,v 1.44 2015/08/19 20:33:29 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.43 2015/08/12 18:28:01 dholland Exp $");
+__RCSID("$NetBSD: make_lfs.c,v 1.44 2015/08/19 20:33:29 dholland Exp $");
#endif
#endif /* not lint */
@@ -700,18 +700,17 @@ make_lfs(int devfd, uint secsize, struct
/*
* Initialize the Ifile inode. Do this before we do anything
* with the Ifile or segment tables.
+ *
+ * XXX: is there some reason this allocates a new dinode? we
+ * already have an empty one generated by vget.
*/
dip = malloc(sizeof(*dip));
if (dip == NULL)
err(1, NULL);
- // XXX lame
- if (fs->lfs_is64) {
- VTOI(fs->lfs_ivnode)->i_din.ffs2_din = &dip->u_64;
- } else {
- VTOI(fs->lfs_ivnode)->i_din.ffs1_din = &dip->u_32;
- }
-
memset(dip, 0, sizeof(*dip));
+
+ VTOI(fs->lfs_ivnode)->i_din = dip;
+
lfs_dino_setmode(fs, dip, LFS_IFREG | 0600);
lfs_dino_setflags(fs, dip, SF_IMMUTABLE);
make_dinode(LFS_IFILE_INUM, dip,
@@ -775,8 +774,7 @@ make_lfs(int devfd, uint secsize, struct
/* Initialize root directory */
vp = lfs_raw_vget(fs, ULFS_ROOTINO, devfd, 0x0);
- // XXX bogus cast
- dip = (union lfs_dinode *)VTOI(vp)->i_din.ffs1_din;
+ dip = VTOI(vp)->i_din;
make_dinode(ULFS_ROOTINO, dip, howmany(LFS_DIRBLKSIZ, lfs_sb_getfsize(fs)), fs);
lfs_dino_setmode(fs, dip, LFS_IFDIR | UMASK);
VTOI(vp)->i_lfs_osize = LFS_DIRBLKSIZ;
Index: src/sys/ufs/lfs/lfs_accessors.h
diff -u src/sys/ufs/lfs/lfs_accessors.h:1.13 src/sys/ufs/lfs/lfs_accessors.h:1.14
--- src/sys/ufs/lfs/lfs_accessors.h:1.13 Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_accessors.h Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_accessors.h,v 1.13 2015/08/12 18:28:01 dholland Exp $ */
+/* $NetBSD: lfs_accessors.h,v 1.14 2015/08/19 20:33:29 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 */
@@ -179,6 +179,23 @@
#define DINO_IN_BLOCK(fs, base, ix) \
((union lfs_dinode *)((char *)(base) + DINOSIZE(fs) * (ix)))
+static __unused inline void
+lfs_copy_dinode(STRUCT_LFS *fs,
+ union lfs_dinode *dst, const union lfs_dinode *src)
+{
+ /*
+ * We can do structure assignment of the structs, but not of
+ * the whole union, as the union is the size of the (larger)
+ * 64-bit struct and on a 32-bit fs the upper half of it might
+ * be off the end of a buffer or otherwise invalid.
+ */
+ if (fs->lfs_is64) {
+ dst->u_64 = src->u_64;
+ } else {
+ dst->u_32 = src->u_32;
+ }
+}
+
#define LFS_DEF_DINO_ACCESSOR(type, type32, field) \
static __unused inline type \
lfs_dino_get##field(STRUCT_LFS *fs, union lfs_dinode *dip) \
Index: src/sys/ufs/lfs/lfs_inode.c
diff -u src/sys/ufs/lfs/lfs_inode.c:1.144 src/sys/ufs/lfs/lfs_inode.c:1.145
--- src/sys/ufs/lfs/lfs_inode.c:1.144 Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_inode.c Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_inode.c,v 1.144 2015/08/12 18:28:01 dholland Exp $ */
+/* $NetBSD: lfs_inode.c,v 1.145 2015/08/19 20:33:29 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.144 2015/08/12 18:28:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.145 2015/08/19 20:33:29 dholland Exp $");
#if defined(_KERNEL_OPT)
#include "opt_quota.h"
@@ -100,7 +100,6 @@ static int lfs_vtruncbuf(struct vnode *,
union lfs_dinode *
lfs_ifind(struct lfs *fs, ino_t ino, struct buf *bp)
{
- char *base = bp->b_data;
union lfs_dinode *ldip;
unsigned num, i;
@@ -112,12 +111,12 @@ lfs_ifind(struct lfs *fs, ino_t ino, str
*/
num = LFS_INOPB(fs);
for (i = num; i-- > 0; ) {
- ldip = (union lfs_dinode *)(base + i * DINOSIZE(fs));
+ ldip = DINO_IN_BLOCK(fs, bp->b_data, i);
if (lfs_dino_getinumber(fs, ldip) == ino)
return (ldip);
}
- printf("searched %u entries\n", num);
+ printf("searched %u entries for %ju\n", num, (uintmax_t)ino);
printf("offset is 0x%jx (seg %d)\n", (uintmax_t)lfs_sb_getoffset(fs),
lfs_dtosn(fs, lfs_sb_getoffset(fs)));
printf("block is 0x%jx (seg %d)\n",
Index: src/sys/ufs/lfs/lfs_inode.h
diff -u src/sys/ufs/lfs/lfs_inode.h:1.9 src/sys/ufs/lfs/lfs_inode.h:1.10
--- src/sys/ufs/lfs/lfs_inode.h:1.9 Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_inode.h Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_inode.h,v 1.9 2015/08/12 18:28:01 dholland Exp $ */
+/* $NetBSD: lfs_inode.h,v 1.10 2015/08/19 20:33:29 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 */
@@ -152,56 +152,53 @@ struct inode {
/*
* The on-disk dinode itself.
*/
- union {
- struct lfs32_dinode *ffs1_din; /* 128 bytes of the on-disk dinode. */
- struct lfs64_dinode *ffs2_din;
- } i_din;
+ union lfs_dinode *i_din;
};
-#define i_ffs1_atime i_din.ffs1_din->di_atime
-#define i_ffs1_atimensec i_din.ffs1_din->di_atimensec
-#define i_ffs1_blocks i_din.ffs1_din->di_blocks
-#define i_ffs1_ctime i_din.ffs1_din->di_ctime
-#define i_ffs1_ctimensec i_din.ffs1_din->di_ctimensec
-#define i_ffs1_db i_din.ffs1_din->di_db
-#define i_ffs1_flags i_din.ffs1_din->di_flags
-#define i_ffs1_gen i_din.ffs1_din->di_gen
-#define i_ffs1_gid i_din.ffs1_din->di_gid
-#define i_ffs1_ib i_din.ffs1_din->di_ib
-#define i_ffs1_mode i_din.ffs1_din->di_mode
-#define i_ffs1_mtime i_din.ffs1_din->di_mtime
-#define i_ffs1_mtimensec i_din.ffs1_din->di_mtimensec
-#define i_ffs1_nlink i_din.ffs1_din->di_nlink
-#define i_ffs1_rdev i_din.ffs1_din->di_rdev
-#define i_ffs1_size i_din.ffs1_din->di_size
-#define i_ffs1_uid i_din.ffs1_din->di_uid
-#define i_ffs1_modrev i_din.ffs1_din->di_modrev
-
-#define i_ffs2_atime i_din.ffs2_din->di_atime
-#define i_ffs2_atimensec i_din.ffs2_din->di_atimensec
-#define i_ffs2_birthtime i_din.ffs2_din->di_birthtime
-#define i_ffs2_birthnsec i_din.ffs2_din->di_birthnsec
-#define i_ffs2_blocks i_din.ffs2_din->di_blocks
-#define i_ffs2_blksize i_din.ffs2_din->di_blksize
-#define i_ffs2_ctime i_din.ffs2_din->di_ctime
-#define i_ffs2_ctimensec i_din.ffs2_din->di_ctimensec
-#define i_ffs2_db i_din.ffs2_din->di_db
-#define i_ffs2_flags i_din.ffs2_din->di_flags
-#define i_ffs2_gen i_din.ffs2_din->di_gen
-#define i_ffs2_gid i_din.ffs2_din->di_gid
-#define i_ffs2_ib i_din.ffs2_din->di_ib
-#define i_ffs2_mode i_din.ffs2_din->di_mode
-#define i_ffs2_mtime i_din.ffs2_din->di_mtime
-#define i_ffs2_mtimensec i_din.ffs2_din->di_mtimensec
-#define i_ffs2_nlink i_din.ffs2_din->di_nlink
-#define i_ffs2_rdev i_din.ffs2_din->di_rdev
-#define i_ffs2_size i_din.ffs2_din->di_size
-#define i_ffs2_uid i_din.ffs2_din->di_uid
-#define i_ffs2_kernflags i_din.ffs2_din->di_kernflags
-#define i_ffs2_extsize i_din.ffs2_din->di_extsize
-#define i_ffs2_extb i_din.ffs2_din->di_extb
-#define i_ffs2_inumber i_din.ffs2_din->di_inumber
-#define i_ffs2_modrev i_din.ffs2_din->di_modrev
+#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. */
Index: src/sys/ufs/lfs/lfs_rfw.c
diff -u src/sys/ufs/lfs/lfs_rfw.c:1.29 src/sys/ufs/lfs/lfs_rfw.c:1.30
--- src/sys/ufs/lfs/lfs_rfw.c:1.29 Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_rfw.c Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_rfw.c,v 1.29 2015/08/12 18:28:01 dholland Exp $ */
+/* $NetBSD: lfs_rfw.c,v 1.30 2015/08/19 20:33:29 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.29 2015/08/12 18:28:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_rfw.c,v 1.30 2015/08/19 20:33:29 dholland Exp $");
#if defined(_KERNEL_OPT)
#include "opt_quota.h"
@@ -250,6 +250,61 @@ update_meta(struct lfs *fs, ino_t ino, i
return 0;
}
+/*
+ * Copy some the fields of the dinode as needed by update_inoblk().
+ */
+static void
+update_inoblk_copy_dinode(struct lfs *fs,
+ union lfs_dinode *dstu, const union lfs_dinode *srcu)
+{
+ if (fs->lfs_is64) {
+ struct lfs64_dinode *dst = &dstu->u_64;
+ const struct lfs64_dinode *src = &srcu->u_64;
+ unsigned i;
+
+ /*
+ * Copy everything but the block pointers and di_blocks.
+ * XXX what about di_extb?
+ */
+ dst->di_mode = src->di_mode;
+ dst->di_nlink = src->di_nlink;
+ dst->di_uid = src->di_uid;
+ dst->di_gid = src->di_gid;
+ dst->di_blksize = src->di_blksize;
+ dst->di_size = src->di_size;
+ dst->di_atime = src->di_atime;
+ dst->di_mtime = src->di_mtime;
+ dst->di_ctime = src->di_ctime;
+ dst->di_birthtime = src->di_birthtime;
+ dst->di_mtimensec = src->di_mtimensec;
+ dst->di_atimensec = src->di_atimensec;
+ dst->di_ctimensec = src->di_ctimensec;
+ dst->di_birthnsec = src->di_birthnsec;
+ dst->di_gen = src->di_gen;
+ dst->di_kernflags = src->di_kernflags;
+ dst->di_flags = src->di_flags;
+ dst->di_extsize = src->di_extsize;
+ dst->di_modrev = src->di_modrev;
+ dst->di_inumber = src->di_inumber;
+ for (i = 0; i < __arraycount(src->di_spare); i++) {
+ dst->di_spare[i] = src->di_spare[i];
+ }
+ } else {
+ struct lfs32_dinode *dst = &dstu->u_32;
+ const struct lfs32_dinode *src = &srcu->u_32;
+
+ /* Get mode, link count, size, and times */
+ memcpy(dst, src, offsetof(struct lfs32_dinode, di_db[0]));
+
+ /* Then the rest, except di_blocks */
+ dst->di_flags = src->di_flags;
+ dst->di_gen = src->di_gen;
+ dst->di_uid = src->di_uid;
+ dst->di_gid = src->di_gid;
+ dst->di_modrev = src->di_modrev;
+ }
+}
+
static int
update_inoblk(struct lfs *fs, daddr_t offset, kauth_cred_t cred,
struct lwp *l)
@@ -278,7 +333,7 @@ update_inoblk(struct lfs *fs, daddr_t of
}
num = LFS_INOPB(fs);
for (i = num; i-- > 0; ) {
- dip = (union lfs_dinode *)((char *)dbp->b_data + i * DINOSIZE(fs));
+ dip = DINO_IN_BLOCK(fs, dbp->b_data, i);
if (lfs_dino_getinumber(fs, dip) > LFS_IFILE_INUM) {
error = lfs_rf_valloc(fs, lfs_dino_getinumber(fs, dip),
lfs_dino_getgen(fs, dip),
@@ -292,31 +347,8 @@ update_inoblk(struct lfs *fs, daddr_t of
if (lfs_dino_getsize(fs, dip) != ip->i_size)
lfs_truncate(vp, lfs_dino_getsize(fs, dip), 0,
NOCRED);
- /* Get mode, link count, size, and times */
- /* XXX: ugly, simplify */
- if (fs->lfs_is64) {
- /*
- * XXX what about di_extb?
- */
- memcpy(ip->i_din.ffs2_din, dip,
- offsetof(struct lfs64_dinode, di_db[0]));
- /* Then the rest, except di_blocks */
- ip->i_ffs2_modrev = dip->u_64.di_modrev;
- ip->i_ffs2_inumber = dip->u_64.di_inumber;
- memset(ip->i_din.ffs2_din->di_spare, 0,
- sizeof(ip->i_din.ffs2_din->di_spare));
- } else {
- memcpy(ip->i_din.ffs1_din, dip,
- offsetof(struct lfs32_dinode, di_db[0]));
- /* Then the rest, except di_blocks */
- ip->i_ffs1_flags = dip->u_32.di_flags;
- ip->i_ffs1_gen = dip->u_32.di_gen;
- ip->i_ffs1_uid = dip->u_32.di_uid;
- ip->i_ffs1_gid = dip->u_32.di_gid;
- ip->i_ffs1_modrev = dip->u_32.di_modrev;
- }
+ update_inoblk_copy_dinode(fs, ip->i_din, dip);
- /* Then the rest, except di_blocks */
ip->i_flags = lfs_dino_getflags(fs, dip);
ip->i_gen = lfs_dino_getgen(fs, dip);
ip->i_uid = lfs_dino_getuid(fs, dip);
Index: src/sys/ufs/lfs/lfs_segment.c
diff -u src/sys/ufs/lfs/lfs_segment.c:1.256 src/sys/ufs/lfs/lfs_segment.c:1.257
--- src/sys/ufs/lfs/lfs_segment.c:1.256 Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_segment.c Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_segment.c,v 1.256 2015/08/12 18:28:01 dholland Exp $ */
+/* $NetBSD: lfs_segment.c,v 1.257 2015/08/19 20:33:29 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.256 2015/08/12 18:28:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_segment.c,v 1.257 2015/08/19 20:33:29 dholland Exp $");
#define _VFS_VNODE_PRIVATE /* XXX: check for VI_MARKER, this has to go */
@@ -1163,22 +1163,14 @@ lfs_writeinode(struct lfs *fs, struct se
* already been gathered.
*/
if (ip->i_number == LFS_IFILE_INUM && sp->idp) {
- if (fs->lfs_is64) {
- sp->idp->u_64 = *ip->i_din.ffs2_din;
- } else {
- sp->idp->u_32 = *ip->i_din.ffs1_din;
- }
+ lfs_copy_dinode(fs, sp->idp, ip->i_din);
ip->i_lfs_osize = ip->i_size;
return 0;
}
bp = sp->ibp;
- cdp = (union lfs_dinode *)((char *)bp->b_data + DINOSIZE(fs) * (sp->ninodes % LFS_INOPB(fs)));
- if (fs->lfs_is64) {
- cdp->u_64 = *ip->i_din.ffs2_din;
- } else {
- cdp->u_32 = *ip->i_din.ffs1_din;
- }
+ cdp = DINO_IN_BLOCK(fs, bp->b_data, sp->ninodes % LFS_INOPB(fs));
+ lfs_copy_dinode(fs, cdp, ip->i_din);
/*
* This inode is on its way to disk; clear its VU_DIROP status when
Index: src/sys/ufs/lfs/lfs_vfsops.c
diff -u src/sys/ufs/lfs/lfs_vfsops.c:1.340 src/sys/ufs/lfs/lfs_vfsops.c:1.341
--- src/sys/ufs/lfs/lfs_vfsops.c:1.340 Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_vfsops.c Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_vfsops.c,v 1.340 2015/08/12 18:28:01 dholland Exp $ */
+/* $NetBSD: lfs_vfsops.c,v 1.341 2015/08/19 20:33:29 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.340 2015/08/12 18:28:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vfsops.c,v 1.341 2015/08/19 20:33:29 dholland Exp $");
#if defined(_KERNEL_OPT)
#include "opt_lfs.h"
@@ -1488,12 +1488,7 @@ lfs_init_vnode(struct ulfsmount *ump, in
memset(dp, 0, sizeof(*dp));
ip->inode_ext.lfs = pool_get(&lfs_inoext_pool, PR_WAITOK);
memset(ip->inode_ext.lfs, 0, sizeof(*ip->inode_ext.lfs));
- // XXX this should go away
- if (fs->lfs_is64) {
- ip->i_din.ffs2_din = &dp->u_64;
- } else {
- ip->i_din.ffs1_din = &dp->u_32;
- }
+ ip->i_din = dp;
ip->i_ump = ump;
ip->i_vnode = vp;
ip->i_dev = ump->um_dev;
@@ -1519,8 +1514,7 @@ lfs_deinit_vnode(struct ulfsmount *ump,
struct inode *ip = VTOI(vp);
pool_put(&lfs_inoext_pool, ip->inode_ext.lfs);
- // XXX bogus cast
- pool_put(&lfs_dinode_pool, (union lfs_dinode *)ip->i_din.ffs1_din);
+ pool_put(&lfs_dinode_pool, ip->i_din);
pool_put(&lfs_inode_pool, ip);
vp->v_data = NULL;
}
@@ -1588,10 +1582,10 @@ lfs_loadvnode(struct mount *mp, struct v
ump->um_cleaner_hint->bi_lbn == LFS_UNUSED_LBN) {
dip = ump->um_cleaner_hint->bi_bp;
if (fs->lfs_is64) {
- error = copyin(dip, ip->i_din.ffs2_din,
+ error = copyin(dip, &ip->i_din->u_64,
sizeof(struct lfs64_dinode));
} else {
- error = copyin(dip, ip->i_din.ffs1_din,
+ error = copyin(dip, &ip->i_din->u_32,
sizeof(struct lfs32_dinode));
}
if (error) {
@@ -1662,11 +1656,7 @@ again:
#endif /* DEBUG */
panic("lfs_loadvnode: dinode not found");
}
- if (fs->lfs_is64) {
- *ip->i_din.ffs2_din = dip->u_64;
- } else {
- *ip->i_din.ffs1_din = dip->u_32;
- }
+ lfs_copy_dinode(fs, ip->i_din, dip);
brelse(bp, 0);
out:
@@ -2240,15 +2230,13 @@ lfs_vinit(struct mount *mp, struct vnode
i == 0)
continue;
if (ip->i_ffs1_db[i] != 0) {
- // XXX bogus cast
- lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_din);
+ 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) {
- // XXX bogus cast
- lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_din);
+ lfs_dump_dinode(fs, ip->i_din);
panic("inconsistent inode (indirect)");
}
}
@@ -2261,8 +2249,7 @@ lfs_vinit(struct mount *mp, struct vnode
#ifdef DIAGNOSTIC
if (vp->v_type == VNON) {
# ifdef DEBUG
- // XXX bogus cast
- lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_din);
+ lfs_dump_dinode(fs, ip->i_din);
# endif
panic("lfs_vinit: ino %llu is type VNON! (ifmt=%o)\n",
(unsigned long long)ip->i_number,
Index: src/sys/ufs/lfs/lfs_vnops.c
diff -u src/sys/ufs/lfs/lfs_vnops.c:1.286 src/sys/ufs/lfs/lfs_vnops.c:1.287
--- src/sys/ufs/lfs/lfs_vnops.c:1.286 Wed Aug 12 18:28:01 2015
+++ src/sys/ufs/lfs/lfs_vnops.c Wed Aug 19 20:33:29 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: lfs_vnops.c,v 1.286 2015/08/12 18:28:01 dholland Exp $ */
+/* $NetBSD: lfs_vnops.c,v 1.287 2015/08/19 20:33:29 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.286 2015/08/12 18:28:01 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_vnops.c,v 1.287 2015/08/19 20:33:29 dholland Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -1357,7 +1357,7 @@ lfs_reclaim(void *v)
}
mutex_exit(&lfs_lock);
- pool_put(&lfs_dinode_pool, ip->i_din.ffs1_din);
+ pool_put(&lfs_dinode_pool, ip->i_din);
lfs_deregister_all(vp);
pool_put(&lfs_inoext_pool, ip->inode_ext.lfs);
ip->inode_ext.lfs = NULL;
@@ -2108,8 +2108,7 @@ lfs_dump_vop(void *v)
#ifdef DDB
vfs_vnode_print(ap->a_vp, 0, printf);
#endif
- // XXX bogus cast
- lfs_dump_dinode(fs, (union lfs_dinode *)ip->i_din.ffs1_din);
+ lfs_dump_dinode(fs, ip->i_din);
}
#endif