NetBSD Problem Report #43344

From www@NetBSD.org  Sun May 23 16:11:23 2010
Return-Path: <www@NetBSD.org>
Received: from mail.netbsd.org (mail.netbsd.org [204.152.190.11])
	by www.NetBSD.org (Postfix) with ESMTP id 2BA3A63B879
	for <gnats-bugs@gnats.NetBSD.org>; Sun, 23 May 2010 16:11:23 +0000 (UTC)
Message-Id: <20100523161122.A053D63B873@www.NetBSD.org>
Date: Sun, 23 May 2010 16:11:22 +0000 (UTC)
From: ishit@oak.dti.ne.jp
Reply-To: ishit@oak.dti.ne.jp
To: gnats-bugs@NetBSD.org
Subject: ext2fs: add support for inodes > 128 bytes -> NetBSD 5.1
X-Send-Pr-Version: www-1.0

>Number:         43344
>Category:       kern
>Synopsis:       ext2fs: add support for inodes > 128 bytes -> NetBSD 5.1
>Confidential:   no
>Severity:       non-critical
>Priority:       high
>Responsible:    tsutsui
>State:          closed
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Sun May 23 16:15:00 +0000 2010
>Closed-Date:    Sun Jan 16 12:45:05 +0000 2011
>Last-Modified:  Sun Jan 16 12:45:05 +0000 2011
>Originator:     ISIHARA Takanori
>Release:        5.1_RC2
>Organization:
Nagoya *BSD Users' Group :-)
>Environment:
NetBSD ishitPc8.home 5.1_RC2 NetBSD 5.1_RC2 (ISHITPC8_XEN3_DOM0) #0: Sat May 22 10:56:29 JST 2010  sysbuild@ishitPc8.home:/opt/sysbuild/netbsd-5/obj/amd64/sys/arch/amd64/compile/ISHITPC8_XEN3_DOM0 amd64

>Description:
Please apply kern/40936 patches to 5.1.
It is very useful for xen (& Linux domU) administrators/users, i think.

>How-To-Repeat:

>Fix:

>Release-Note:

>Audit-Trail:
From: Jeff Rizzo <riz@NetBSD.org>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: kern/43344
Date: Tue, 15 Jun 2010 21:14:37 -0700

 --jI8keyz6grp/JLjh
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline

 Can you try this patch against 5.1_RC3 and let me know if it does
 what you expect?  (this is from the kern/40936 commits)

 It's too late for 5.1, but I can get it pulled up for 5.2 if it works
 for you.

 --jI8keyz6grp/JLjh
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="ext2.patch"

 Index: sys/ufs/ext2fs/ext2fs_dinode.h
 ===================================================================
 RCS file: /cvsroot/src/sys/ufs/ext2fs/ext2fs_dinode.h,v
 retrieving revision 1.16.28.1
 diff -u -r1.16.28.1 ext2fs_dinode.h
 --- sys/ufs/ext2fs/ext2fs_dinode.h	29 Nov 2008 23:10:18 -0000	1.16.28.1
 +++ sys/ufs/ext2fs/ext2fs_dinode.h	16 Jun 2010 04:10:59 -0000
 @@ -154,7 +154,7 @@
  #define EXT2_NODUMP		0x00000040	/* do not dump file */

  /* Size of on-disk inode. */
 -#define	EXT2_DINODE_SIZE	(sizeof(struct ext2fs_dinode))	/* 128 */
 +#define EXT2_DINODE_SIZE(s)	(s)->e2fs.e2fs_inode_size

  /*
   * The e2di_blocks fields may be overlaid with other information for
 Index: sys/ufs/ext2fs/ext2fs_inode.c
 ===================================================================
 RCS file: /cvsroot/src/sys/ufs/ext2fs/ext2fs_inode.c,v
 retrieving revision 1.66.8.1
 diff -u -r1.66.8.1 ext2fs_inode.c
 --- sys/ufs/ext2fs/ext2fs_inode.c	22 Feb 2010 04:43:46 -0000	1.66.8.1
 +++ sys/ufs/ext2fs/ext2fs_inode.c	16 Jun 2010 04:10:59 -0000
 @@ -221,7 +221,7 @@
  	}
  	ip->i_flag &= ~(IN_MODIFIED | IN_ACCESSED);
  	cp = (char *)bp->b_data +
 -	    (ino_to_fsbo(fs, ip->i_number) * EXT2_DINODE_SIZE);
 +	    (ino_to_fsbo(fs, ip->i_number) * EXT2_DINODE_SIZE(fs));
  	e2fs_isave(ip->i_din.e2fs_din, (struct ext2fs_dinode *)cp);
  	if ((updflags & (UPDATE_WAIT|UPDATE_DIROP)) != 0 &&
  	    (flags & IN_MODIFIED) != 0 &&
 Index: sys/ufs/ext2fs/ext2fs_vfsops.c
 ===================================================================
 RCS file: /cvsroot/src/sys/ufs/ext2fs/ext2fs_vfsops.c,v
 retrieving revision 1.137.6.5
 diff -u -r1.137.6.5 ext2fs_vfsops.c
 --- sys/ufs/ext2fs/ext2fs_vfsops.c	27 Oct 2009 21:41:07 -0000	1.137.6.5
 +++ sys/ufs/ext2fs/ext2fs_vfsops.c	16 Jun 2010 04:10:59 -0000
 @@ -577,7 +577,7 @@
  	fs->e2fs_bmask = ~fs->e2fs_qbmask;
  	fs->e2fs_ngdb =
  	    howmany(fs->e2fs_ncg, fs->e2fs_bsize / sizeof(struct ext2_gd));
 -	fs->e2fs_ipb = fs->e2fs_bsize / EXT2_DINODE_SIZE;
 +	fs->e2fs_ipb = fs->e2fs_bsize / EXT2_DINODE_SIZE(fs);
  	fs->e2fs_itpg = fs->e2fs.e2fs_ipg / fs->e2fs_ipb;
  	brelse(bp, 0);

 @@ -646,7 +646,7 @@
  			break;
  		}
  		cp = (char *)bp->b_data +
 -		    (ino_to_fsbo(fs, ip->i_number) * EXT2_DINODE_SIZE);
 +		    (ino_to_fsbo(fs, ip->i_number) * EXT2_DINODE_SIZE(fs));
  		e2fs_iload((struct ext2fs_dinode *)cp, ip->i_din.e2fs_din);
  		ext2fs_set_inode_guid(ip);
  		brelse(bp, 0);
 @@ -696,8 +696,7 @@
  	ump = NULL;

  #ifdef DEBUG_EXT2
 -	printf("sb size: %d ino size %d\n", sizeof(struct ext2fs),
 -	    EXT2_DINODE_SIZE);
 +	printf("ext2 sb size: %d\n", sizeof(struct ext2fs));
  #endif
  	error = bread(devvp, (SBOFF / size), SBSIZE, cred, 0, &bp);
  	if (error)
 @@ -717,6 +716,10 @@
  	bp = NULL;
  	m_fs = ump->um_e2fs;
  	m_fs->e2fs_ronly = ronly;
 +
 +#ifdef DEBUG_EXT2
 +	printf("ext2 ino size %d\n", EXT2_DINODE_SIZE(m_fs));
 +#endif
  	if (ronly == 0) {
  		if (m_fs->e2fs.e2fs_state == E2FS_ISCLEAN)
  			m_fs->e2fs.e2fs_state = 0;
 @@ -737,7 +740,7 @@
  	m_fs->e2fs_bmask = ~m_fs->e2fs_qbmask;
  	m_fs->e2fs_ngdb =
  	    howmany(m_fs->e2fs_ncg, m_fs->e2fs_bsize / sizeof(struct ext2_gd));
 -	m_fs->e2fs_ipb = m_fs->e2fs_bsize / EXT2_DINODE_SIZE;
 +	m_fs->e2fs_ipb = m_fs->e2fs_bsize / EXT2_DINODE_SIZE(m_fs);
  	m_fs->e2fs_itpg = m_fs->e2fs.e2fs_ipg / m_fs->e2fs_ipb;

  	m_fs->e2fs_gd = malloc(m_fs->e2fs_ngdb * m_fs->e2fs_bsize,
 @@ -1078,7 +1081,7 @@
  		*vpp = NULL;
  		return (error);
  	}
 -	cp = (char *)bp->b_data + (ino_to_fsbo(fs, ino) * EXT2_DINODE_SIZE);
 +	cp = (char *)bp->b_data + (ino_to_fsbo(fs, ino) * EXT2_DINODE_SIZE(fs));
  	ip->i_din.e2fs_din = pool_get(&ext2fs_dinode_pool, PR_WAITOK);
  	e2fs_iload((struct ext2fs_dinode *)cp, ip->i_din.e2fs_din);
  	ext2fs_set_inode_guid(ip);
 @@ -1260,9 +1263,8 @@
  		return (EINVAL);	   /* XXX needs translation */
  	}
  	if (fs2h32(fs->e2fs_rev) > E2FS_REV0) {
 -		if (fs2h32(fs->e2fs_first_ino) != EXT2_FIRSTINO ||
 -		    fs2h16(fs->e2fs_inode_size) != EXT2_DINODE_SIZE) {
 -			printf("Ext2 fs: unsupported inode size\n");
 +		if (fs2h32(fs->e2fs_first_ino) != EXT2_FIRSTINO) {
 +			printf("Ext2 fs: unsupported first inode position\n");
  			return (EINVAL);      /* XXX needs translation */
  		}
  		if (fs2h32(fs->e2fs_features_incompat) &
 Index: sbin/newfs_ext2fs/extern.h
 ===================================================================
 RCS file: /cvsroot/src/sbin/newfs_ext2fs/extern.h,v
 retrieving revision 1.2
 diff -u -r1.2 extern.h
 --- sbin/newfs_ext2fs/extern.h	14 Dec 2007 13:19:35 -0000	1.2
 +++ sbin/newfs_ext2fs/extern.h	16 Jun 2010 04:10:59 -0000
 @@ -41,6 +41,7 @@
  extern int	Oflag;		/* format as an 4.3BSD file system */
  extern int	verbosity;	/* amount of printf() output */
  extern int64_t	fssize;		/* file system size */
 +extern uint16_t	inodesize;	/* bytes per inode */
  extern uint	sectorsize;	/* sector size */
  extern uint	fsize;		/* fragment size */
  extern uint	bsize;		/* block size */
 Index: sbin/newfs_ext2fs/mke2fs.c
 ===================================================================
 RCS file: /cvsroot/src/sbin/newfs_ext2fs/mke2fs.c,v
 retrieving revision 1.9
 diff -u -r1.9 mke2fs.c
 --- sbin/newfs_ext2fs/mke2fs.c	28 Aug 2008 16:29:24 -0000	1.9
 +++ sbin/newfs_ext2fs/mke2fs.c	16 Jun 2010 04:10:59 -0000
 @@ -248,11 +248,12 @@
  	sblock.e2fs.e2fs_fsize = ilog2(fsize) - LOG_MINBSIZE;

  	sblock.e2fs_bsize = bsize;
 +	sblock.e2fs.e2fs_inode_size = inodesize;
  	sblock.e2fs_bshift = sblock.e2fs.e2fs_log_bsize + LOG_MINBSIZE;
  	sblock.e2fs_qbmask = sblock.e2fs_bsize - 1;
  	sblock.e2fs_bmask = ~sblock.e2fs_qbmask;
  	sblock.e2fs_fsbtodb = ilog2(sblock.e2fs_bsize) - ilog2(sectorsize);
 -	sblock.e2fs_ipb = sblock.e2fs_bsize / EXT2_DINODE_SIZE;
 +	sblock.e2fs_ipb = sblock.e2fs_bsize / inodesize;

  	/*
  	 * Ext2fs preserves BBSIZE (1024 bytes) space at the top for
 @@ -301,7 +302,7 @@
  		num_inodes = UINT16_MAX * ncg;	/* ext2bgd_nifree is uint16_t */

  	inodes_per_cg = num_inodes / ncg;
 -	iblocks_per_cg = howmany(EXT2_DINODE_SIZE * inodes_per_cg, bsize);
 +	iblocks_per_cg = howmany(inodesize * inodes_per_cg, bsize);

  	/* Check that the last cylinder group has enough space for inodes */
  	minblocks_per_cg =
 @@ -404,7 +405,6 @@
  	sblock.e2fs.e2fs_rgid = getegid();

  	sblock.e2fs.e2fs_first_ino = EXT2_FIRSTINO;
 -	sblock.e2fs.e2fs_inode_size = EXT2_DINODE_SIZE;

  	/* e2fs_block_group_nr is set on writing superblock to each group */

 Index: sbin/newfs_ext2fs/newfs_ext2fs.8
 ===================================================================
 RCS file: /cvsroot/src/sbin/newfs_ext2fs/newfs_ext2fs.8,v
 retrieving revision 1.1
 diff -u -r1.1 newfs_ext2fs.8
 --- sbin/newfs_ext2fs/newfs_ext2fs.8	17 Nov 2007 16:50:26 -0000	1.1
 +++ sbin/newfs_ext2fs/newfs_ext2fs.8	16 Jun 2010 04:10:59 -0000
 @@ -29,7 +29,7 @@
  .\"
  .\"     @(#)newfs.8	8.6 (Berkeley) 5/3/95
  .\"
 -.Dd November 17, 2007
 +.Dd March 1, 2009
  .Dt NEWFS_EXT2FS 8
  .Os
  .Sh NAME
 @@ -37,6 +37,7 @@
  .Nd construct a new Ext2 file system
  .Sh SYNOPSIS
  .Nm
 +.Op Fl D Ar inodesize
  .Op Fl FINZ
  .Op Fl b Ar block-size
  .Op Fl f Ar frag-size
 @@ -93,6 +94,9 @@
  .It \*[Gt] 512 MB
  4 KB
  .El
 +.It Fl D
 +Set the inode size. Defaults to 128, and can also be set to 256 for
 +compatibility with ext4.
  .It Fl F
  Create a file system image in
  .Ar special .
 Index: sbin/newfs_ext2fs/newfs_ext2fs.c
 ===================================================================
 RCS file: /cvsroot/src/sbin/newfs_ext2fs/newfs_ext2fs.c,v
 retrieving revision 1.4
 diff -u -r1.4 newfs_ext2fs.c
 --- sbin/newfs_ext2fs/newfs_ext2fs.c	20 Jul 2008 01:20:23 -0000	1.4
 +++ sbin/newfs_ext2fs/newfs_ext2fs.c	16 Jun 2010 04:10:59 -0000
 @@ -104,6 +104,7 @@
  #define DEFAULT_VERBOSITY 3	/* 4 is traditional behavior of newfs(8) */
  int64_t fssize;			/* file system size */
  uint	sectorsize;		/* bytes/sector */
 +uint16_t inodesize = 128;	/* inode size */
  uint	fsize = 0;		/* fragment size */
  uint	bsize = 0;		/* block size */
  uint	minfree = MINFREE;	/* free space threshold */
 @@ -133,10 +134,16 @@
  	fsi = fso = -1;
  	Fflag = Iflag = Zflag = 0;
  	verbosity = -1;
 -	opstring = "FINO:S:V:Zb:f:i:l:m:n:s:v:";
 +	opstring = "D:FINO:S:V:Zb:f:i:l:m:n:s:v:";
  	byte_sized = 0;
  	while ((ch = getopt(argc, argv, opstring)) != -1)
  		switch (ch) {
 +		case 'D':
 +			inodesize = (uint16_t)strtol(optarg, &s1, 0);
 +			if (*s1 || inodesize != 128 || inodesize != 256)
 +				errx(1, "Bad inode size %d "
 +				    "(only 128 and 256 supported)", inodesize);
 +			break;
  		case 'F':
  			Fflag = 1;
  			break;
 @@ -449,6 +456,7 @@
  }

  static const char help_strings[] =
 +	"\t-D inodesize\tsize of an inode in bytes (128 or 256)\n"
  	"\t-F \t\tcreate file system image in regular file\n"
  	"\t-I \t\tdo not check that the file system type is `Linux Ext2'\n"
  	"\t-N \t\tdo not create file system, just print out parameters\n"
 Index: sys/lib/libsa/ext2fs.c
 ===================================================================
 RCS file: /cvsroot/src/sys/lib/libsa/ext2fs.c,v
 retrieving revision 1.4
 diff -u -r1.4 ext2fs.c
 --- sys/lib/libsa/ext2fs.c	2 Dec 2007 06:47:43 -0000	1.4
 +++ sys/lib/libsa/ext2fs.c	16 Jun 2010 04:10:59 -0000
 @@ -431,7 +431,7 @@
  	if (ext2fs.e2fs_rev > E2FS_REV1 ||
  	    (ext2fs.e2fs_rev == E2FS_REV1 &&
  	     (ext2fs.e2fs_first_ino != EXT2_FIRSTINO ||
 -	      ext2fs.e2fs_inode_size != EXT2_DINODE_SIZE ||
 +	     (ext2fs.e2fs_inode_size != 128 && ext2fs.e2fs_inode_size != 256) ||
  	      ext2fs.e2fs_features_incompat & ~EXT2F_INCOMPAT_SUPP))) {
  		return ENODEV;
  	}
 @@ -449,7 +449,7 @@
  	fs->e2fs_bmask = ~fs->e2fs_qbmask;
  	fs->e2fs_ngdb =
  	    howmany(fs->e2fs_ncg, fs->e2fs_bsize / sizeof(struct ext2_gd));
 -	fs->e2fs_ipb = fs->e2fs_bsize / EXT2_DINODE_SIZE;
 +	fs->e2fs_ipb = fs->e2fs_bsize / ext2fs.e2fs_inode_size;
  	fs->e2fs_itpg = fs->e2fs.e2fs_ipg / fs->e2fs_ipb;

  	return 0;

 --jI8keyz6grp/JLjh--

From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
To: gnats-bugs@NetBSD.org
Cc: kern-bug-people@NetBSD.org, gnats-admin@NetBSD.org, netbsd-bugs@NetBSD.org,
        ishit@oak.dti.ne.jp, tsutsui@ceres.dti.ne.jp
Subject: Re: kern/43344
Date: Wed, 16 Jun 2010 18:41:15 +0900

 riz@NetBSD.org wrote:

 >  Can you try this patch against 5.1_RC3 and let me know if it does
 >  what you expect?  (this is from the kern/40936 commits)

 Which revisions did you pull from the HEAD?
 IIRC I did more commits to fix botches on that PR.

 ---
 Izumi Tsutsui

From: Jeff Rizzo <riz@tastylime.net>
To: gnats-bugs@netbsd.org
Cc: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
Subject: Re: kern/43344
Date: Wed, 16 Jun 2010 07:10:34 -0700

 >>   Can you try this patch against 5.1_RC3 and let me know if it does
 >>   what you expect?  (this is from the kern/40936 commits)
 >>      
 > Which revisions did you pull from the HEAD?
 > IIRC I did more commits to fix botches on that PR.
 >    

 This is why I asked!  :)

 Here's what the patch consists of.  If there's other important stuff, 
 I'll be glad to add it before requesting a pullup.

 Module Name:    src
 Committed By:   christos
 Date:           Sun Mar  1 15:59:57 UTC 2009

 Modified Files:
          src/sys/ufs/ext2fs: ext2fs_dinode.h ext2fs_inode.c ext2fs_vfsops.c

 Log Message:
 PR/40936: Frederik Sausmikat: ext2fs: add support for inodes > 128 bytes


 To generate a diff of this commit:
 cvs rdiff -u -r1.17 -r1.18 src/sys/ufs/ext2fs/ext2fs_dinode.h
 cvs rdiff -u -r1.67 -r1.68 src/sys/ufs/ext2fs/ext2fs_inode.c
 cvs rdiff -u -r1.141 -r1.142 src/sys/ufs/ext2fs/ext2fs_vfsops.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:    src
 Committed By:   christos
 Date:           Sun Mar  1 19:21:09 UTC 2009

 Modified Files:
          src/sbin/newfs_ext2fs: extern.h mke2fs.c newfs_ext2fs.8 
 newfs_ext2fs.c

 Log Message:
 Support variable inode sizes.


 To generate a diff of this commit:
 cvs rdiff -u -r1.2 -r1.3 src/sbin/newfs_ext2fs/extern.h
 cvs rdiff -u -r1.9 -r1.10 src/sbin/newfs_ext2fs/mke2fs.c
 cvs rdiff -u -r1.1 -r1.2 src/sbin/newfs_ext2fs/newfs_ext2fs.8
 cvs rdiff -u -r1.4 -r1.5 src/sbin/newfs_ext2fs/newfs_ext2fs.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:    src
 Committed By:   christos
 Date:           Sun Mar  1 19:37:16 UTC 2009

 Modified Files:
          src/sys/lib/libsa: ext2fs.c

 Log Message:
 catch up with variable inode size.


 To generate a diff of this commit:
 cvs rdiff -u -r1.5 -r1.6 src/sys/lib/libsa/ext2fs.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.




From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
To: gnats-bugs@NetBSD.org
Cc: kern-bug-people@NetBSD.org, gnats-admin@NetBSD.org, netbsd-bugs@NetBSD.org,
        ishit@oak.dti.ne.jp, tsutsui@ceres.dti.ne.jp
Subject: Re: kern/43344
Date: Thu, 17 Jun 2010 02:25:49 +0900

 >  Here's what the patch consists of.  If there's other important stuff, 
 >  I'll be glad to add it before requesting a pullup.

 At least the following revisions are also required, but
 I have not checked if they can be applied cleanly to netbsd-5:
 ---
 src/sbin/fsck_ext2fs/inode.c		1.28
 src/sbin/fsck_ext2fs/setup.c		1.26
 src/sbin/newfs_ext2fs/mke2fs.c		1.11, 1.12
 src/sbin/newfs_ext2fs/newfs_ext2fs.c	1.6, 1.7, 1.8
 src/sbin/newfs_ext2fs/newfs_ext2fs.8	1.3, 1.4
 src/sys/lib/libsa/ext2fs.c		1.7
 src/sys/ufs/ext2fs/ext2fs_dinode.h	1.19
 ---

 FYI, not relevant to this PR, but IIRC I saw some problems on
 inode=256 ext2fs. It sometimes got mangled on fsck_ext2fs(8),
 but I didn't track what caused the issue...

 ---
 Izumi Tsutsui

From: Jeff Rizzo <riz@tastylime.net>
To: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
Cc: gnats-bugs@NetBSD.org
Subject: Re: kern/43344
Date: Wed, 16 Jun 2010 14:30:24 -0700

 This is a multi-part message in MIME format.
 --------------040308030201050100000304
 Content-Type: multipart/alternative;
  boundary="------------040801040209050107010005"


 --------------040801040209050107010005
 Content-Type: text/plain; charset=ISO-8859-1; format=flowed
 Content-Transfer-Encoding: 7bit

 On 06/16/2010 10:25 AM, Izumi Tsutsui wrote:
 >>   Here's what the patch consists of.  If there's other important stuff,
 >>   I'll be glad to add it before requesting a pullup.
 >>      
 > At least the following revisions are also required, but
 > I have not checked if they can be applied cleanly to netbsd-5:
 > ---
 > src/sbin/fsck_ext2fs/inode.c		1.28
 > src/sbin/fsck_ext2fs/setup.c		1.26
 > src/sbin/newfs_ext2fs/mke2fs.c		1.11, 1.12
 > src/sbin/newfs_ext2fs/newfs_ext2fs.c	1.6, 1.7, 1.8
 > src/sbin/newfs_ext2fs/newfs_ext2fs.8	1.3, 1.4
 > src/sys/lib/libsa/ext2fs.c		1.7
 > src/sys/ufs/ext2fs/ext2fs_dinode.h	1.19
 > ---
 >
 > FYI, not relevant to this PR, but IIRC I saw some problems on
 > inode=256 ext2fs. It sometimes got mangled on fsck_ext2fs(8),
 > but I didn't track what caused the issue...
 >    

 The following revisions apply cleanly to netbsd-5:

 sbin/fsck_ext2fs/inode.c                        1.24-28
 sbin/fsck_ext2fs/setup.c                        1.26
 sbin/newfs_ext2fs/extern.h                      1.3
 sbin/newfs_ext2fs/mke2fs.c                      1.10-12
 sbin/newfs_ext2fs/newfs_ext2fs.8                1.2-4
 sbin/newfs_ext2fs/newfs_ext2fs.c                1.5-8
 sys/lib/libsa/ext2fs.c                          1.6-7
 sys/ufs/ext2fs/ext2fs_dinode.h                  1.18-19
 sys/ufs/ext2fs/ext2fs_inode.c                   1.68
 sys/ufs/ext2fs/ext2fs_vfsops.c                  1.142


 If someone can verify for me that they have the intended effect, I will 
 request pullup to netbsd-5.

 I built netbsd-5/amd64 with these revisions, which can be retrieved here:

 http://www.tastylime.net/netbsd/amd64-PR43344/

 attached is a patch against netbsd-5-RC3, and the commit messages for 
 all the included revisions.






 --------------040801040209050107010005
 Content-Type: text/html; charset=ISO-8859-1
 Content-Transfer-Encoding: 7bit

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 <html>
 <head>
   <meta content="text/html; charset=ISO-8859-1"
  http-equiv="Content-Type">
 </head>
 <body text="#000000" bgcolor="#ffffff">
 On 06/16/2010 10:25 AM, Izumi Tsutsui wrote:
 <blockquote cite="mid:100617022549.M0114633@mirage.ceres.dti.ne.jp"
  type="cite">
   <blockquote type="cite">
     <pre wrap=""> Here's what the patch consists of.  If there's other important stuff, 
  I'll be glad to add it before requesting a pullup.
     </pre>
   </blockquote>
   <pre wrap="">
 At least the following revisions are also required, but
 I have not checked if they can be applied cleanly to netbsd-5:
 ---
 src/sbin/fsck_ext2fs/inode.c		1.28
 src/sbin/fsck_ext2fs/setup.c		1.26
 src/sbin/newfs_ext2fs/mke2fs.c		1.11, 1.12
 src/sbin/newfs_ext2fs/newfs_ext2fs.c	1.6, 1.7, 1.8
 src/sbin/newfs_ext2fs/newfs_ext2fs.8	1.3, 1.4
 src/sys/lib/libsa/ext2fs.c		1.7
 src/sys/ufs/ext2fs/ext2fs_dinode.h	1.19
 ---

 FYI, not relevant to this PR, but IIRC I saw some problems on
 inode=256 ext2fs. It sometimes got mangled on fsck_ext2fs(8),
 but I didn't track what caused the issue...
   </pre>
 </blockquote>
 <br>
 The following revisions apply cleanly to netbsd-5:<br>
 <br>
 sbin/fsck_ext2fs/inode.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.24-28<br>
 sbin/fsck_ext2fs/setup.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.26<br>
 sbin/newfs_ext2fs/extern.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.3<br>
 sbin/newfs_ext2fs/mke2fs.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.10-12<br>
 sbin/newfs_ext2fs/newfs_ext2fs.8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.2-4<br>
 sbin/newfs_ext2fs/newfs_ext2fs.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.5-8<br>
 sys/lib/libsa/ext2fs.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.6-7<br>
 sys/ufs/ext2fs/ext2fs_dinode.h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.18-19<br>
 sys/ufs/ext2fs/ext2fs_inode.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.68<br>
 sys/ufs/ext2fs/ext2fs_vfsops.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.142<br>
 <br>
 <br>
 If someone can verify for me that they have the intended effect, I will
 request pullup to netbsd-5.<br>
 <br>
 I built netbsd-5/amd64 with these revisions, which can be retrieved
 here:<br>
 <br>
 <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
 <a href="http://www.tastylime.net/netbsd/amd64-PR43344/">http://www.tastylime.net/netbsd/amd64-PR43344/</a><br>
 <br>
 attached is a patch against netbsd-5-RC3, and the commit messages for
 all the included revisions.<br>
 <br>
 <br>
 <br>
 <br>
 <br>
 </body>
 </html>

 --------------040801040209050107010005--

 --------------040308030201050100000304
 Content-Type: text/plain;
  name="40936"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
  filename="40936"

 Module Name:	src
 Committed By:	christos
 Date:		Sun Mar  1 15:59:57 UTC 2009

 Modified Files:
 	src/sys/ufs/ext2fs: ext2fs_dinode.h ext2fs_inode.c ext2fs_vfsops.c

 Log Message:
 PR/40936: Frederik Sausmikat: ext2fs: add support for inodes > 128 bytes


 To generate a diff of this commit:
 cvs rdiff -u -r1.17 -r1.18 src/sys/ufs/ext2fs/ext2fs_dinode.h
 cvs rdiff -u -r1.67 -r1.68 src/sys/ufs/ext2fs/ext2fs_inode.c
 cvs rdiff -u -r1.141 -r1.142 src/sys/ufs/ext2fs/ext2fs_vfsops.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	christos
 Date:		Sun Mar  1 19:21:09 UTC 2009

 Modified Files:
 	src/sbin/newfs_ext2fs: extern.h mke2fs.c newfs_ext2fs.8 newfs_ext2fs.c

 Log Message:
 Support variable inode sizes.


 To generate a diff of this commit:
 cvs rdiff -u -r1.2 -r1.3 src/sbin/newfs_ext2fs/extern.h
 cvs rdiff -u -r1.9 -r1.10 src/sbin/newfs_ext2fs/mke2fs.c
 cvs rdiff -u -r1.1 -r1.2 src/sbin/newfs_ext2fs/newfs_ext2fs.8
 cvs rdiff -u -r1.4 -r1.5 src/sbin/newfs_ext2fs/newfs_ext2fs.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	christos
 Date:		Sun Mar  1 19:37:16 UTC 2009

 Modified Files:
 	src/sys/lib/libsa: ext2fs.c

 Log Message:
 catch up with variable inode size.


 To generate a diff of this commit:
 cvs rdiff -u -r1.5 -r1.6 src/sys/lib/libsa/ext2fs.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	tsutsui
 Date:		Mon Mar  2 09:54:49 UTC 2009

 Modified Files:
 	src/sys/ufs/ext2fs: ext2fs_dinode.h

 Log Message:
 Don't use e2fs_inode_size in superblock on E2FS_REV0 file system.


 To generate a diff of this commit:
 cvs rdiff -u -r1.18 -r1.19 src/sys/ufs/ext2fs/ext2fs_dinode.h

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	tsutsui
 Date:		Mon Mar  2 10:15:59 UTC 2009

 Modified Files:
 	src/sbin/newfs_ext2fs: mke2fs.c

 Log Message:
 - accept only EXT2_REV0_DINODE_SIZE inodesize on -O 0
 - use inodesize to get offset of inode, not struct ext2fs_dinode array


 To generate a diff of this commit:
 cvs rdiff -u -r1.10 -r1.11 src/sbin/newfs_ext2fs/mke2fs.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	tsutsui
 Date:		Mon Mar  2 10:16:49 UTC 2009

 Modified Files:
 	src/sbin/newfs_ext2fs: newfs_ext2fs.c

 Log Message:
 Replace a magic number with a new EXT2_REV0_DINODE_SIZE macro.


 To generate a diff of this commit:
 cvs rdiff -u -r1.6 -r1.7 src/sbin/newfs_ext2fs/newfs_ext2fs.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	tsutsui
 Date:		Mon Mar  2 10:25:01 UTC 2009

 Modified Files:
 	src/sys/lib/libsa: ext2fs.c

 Log Message:
 Use EXT2_DINODE_SIZE() to get offset of inode, not struct ext2fs_dinode array.


 To generate a diff of this commit:
 cvs rdiff -u -r1.6 -r1.7 src/sys/lib/libsa/ext2fs.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	tsutsui
 Date:		Mon Mar  2 10:38:13 UTC 2009

 Modified Files:
 	src/sbin/newfs_ext2fs: newfs_ext2fs.c

 Log Message:
 Fix botched logic in inodesize check.


 To generate a diff of this commit:
 cvs rdiff -u -r1.7 -r1.8 src/sbin/newfs_ext2fs/newfs_ext2fs.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	tsutsui
 Date:		Mon Mar  2 10:57:03 UTC 2009

 Modified Files:
 	src/sbin/newfs_ext2fs: mke2fs.c

 Log Message:
 Use inodesize to get offset of inode in one more place.


 To generate a diff of this commit:
 cvs rdiff -u -r1.11 -r1.12 src/sbin/newfs_ext2fs/mke2fs.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	tsutsui
 Date:		Mon Mar  2 11:31:59 UTC 2009

 Modified Files:
 	src/sbin/fsck_ext2fs: inode.c setup.c

 Log Message:
 - add a sanity check for e2fs_inode_size in readsb()
 - use EXT2_DINODE_SIZE() rather than sizeof(struct ext2fs_dinode) or
   struct ext2fs_dinode array/pointer to see e2fs_ipb and inode offsets


 To generate a diff of this commit:
 cvs rdiff -u -r1.27 -r1.28 src/sbin/fsck_ext2fs/inode.c
 cvs rdiff -u -r1.25 -r1.26 src/sbin/fsck_ext2fs/setup.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	wiz
 Date:		Sun Mar  1 21:52:37 UTC 2009

 Modified Files:
 	src/sbin/newfs_ext2fs: newfs_ext2fs.8

 Log Message:
 Sort options.


 To generate a diff of this commit:
 cvs rdiff -u -r1.2 -r1.3 src/sbin/newfs_ext2fs/newfs_ext2fs.8

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	wiz
 Date:		Sun Mar  1 21:52:59 UTC 2009

 Modified Files:
 	src/sbin/newfs_ext2fs: newfs_ext2fs.8

 Log Message:
 New sentence, new line.


 To generate a diff of this commit:
 cvs rdiff -u -r1.3 -r1.4 src/sbin/newfs_ext2fs/newfs_ext2fs.8

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Module Name:	src
 Committed By:	wiz
 Date:		Sun Mar  1 21:54:31 UTC 2009

 Modified Files:
 	src/sbin/newfs_ext2fs: newfs_ext2fs.c

 Log Message:
 Sort options in usage.


 To generate a diff of this commit:
 cvs rdiff -u -r1.5 -r1.6 src/sbin/newfs_ext2fs/newfs_ext2fs.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Modified Files:
 	src/sbin/fsck_ext2fs: inode.c

 Log Message:
 - unsigned -> unsigned int
 - remove unnecessary casts from malloc(3) and free(3)
 - fix a bogus indent


 To generate a diff of this commit:
 cvs rdiff -r1.23 -r1.24 src/sbin/fsck_ext2fs/inode.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Modified Files:
 	src/sbin/fsck_ext2fs: inode.c

 Log Message:
 Use "size > INT32_MAX" rather than "size >= 0x80000000U" to check 2GB limit.


 To generate a diff of this commit:
 cvs rdiff -r1.24 -r1.25 src/sbin/fsck_ext2fs/inode.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Modified Files:
 	src/sbin/fsck_ext2fs: inode.c

 Log Message:
 Add missed byteswap ops against ext2fs_dinode members.


 To generate a diff of this commit:
 cvs rdiff -r1.25 -r1.26 src/sbin/fsck_ext2fs/inode.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.


 Modified Files:
 	src/sbin/fsck_ext2fs: inode.c

 Log Message:
 Handle 32 bit uid field on E2FS_REV1.


 To generate a diff of this commit:
 cvs rdiff -r1.26 -r1.27 src/sbin/fsck_ext2fs/inode.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.



 --------------040308030201050100000304
 Content-Type: text/x-diff;
  name="40936.patch"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: attachment;
  filename="40936.patch"

 Index: sbin/fsck_ext2fs/inode.c
 ===================================================================
 RCS file: /cvsroot/src/sbin/fsck_ext2fs/inode.c,v
 retrieving revision 1.23
 diff -p -u -r1.23 inode.c
 --- sbin/fsck_ext2fs/inode.c	9 Oct 2008 16:56:23 -0000	1.23
 +++ sbin/fsck_ext2fs/inode.c	16 Jun 2010 21:29:47 -0000
 @@ -127,7 +127,7 @@ inosize(struct ext2fs_dinode *dp)

  	if ((fs2h16(dp->e2di_mode) & IFMT) == IFREG)
  		size |= (u_int64_t)fs2h32(dp->e2di_dacl) << 32;
 -	if (size >= 0x80000000U)
 +	if (size > INT32_MAX)
  		(void)setlarge();
  	return size;
  }
 @@ -137,10 +137,10 @@ inossize(struct ext2fs_dinode *dp, u_int
  {
  	if ((fs2h16(dp->e2di_mode) & IFMT) == IFREG) {
  		dp->e2di_dacl = h2fs32(size >> 32);
 -		if (size >= 0x80000000U)
 +		if (size > INT32_MAX)
  			if (!setlarge())
  				return;
 -	} else if (size >= 0x80000000U) {
 +	} else if (size > INT32_MAX) {
  		pfatal("TRYING TO SET FILESIZE TO %llu ON MODE %x FILE\n",
  		    (unsigned long long)size, fs2h16(dp->e2di_mode) & IFMT);
  		return;
 @@ -169,7 +169,7 @@ ckinode(struct ext2fs_dinode *dp, struct
  	dino = *dp;
  	ndb = howmany(inosize(&dino), sblock.e2fs_bsize);
  	for (ap = &dino.e2di_blocks[0]; ap < &dino.e2di_blocks[NDADDR];
 -																ap++,ndb--) {
 +	    ap++,ndb--) {
  		idesc->id_numfrags = 1;
  		if (*ap == 0) {
  			if (idesc->id_type == DATA && ndb > 0) {
 @@ -325,7 +325,7 @@ chkrange(daddr_t blk, int cnt)
  {
  	int c, overh;

 -	if ((unsigned)(blk + cnt) > maxfsblock)
 +	if ((unsigned int)(blk + cnt) > maxfsblock)
  		return (1);
  	c = dtog(&sblock, blk);
  	overh = cgoverhead(c);
 @@ -371,6 +371,7 @@ struct ext2fs_dinode *
  ginode(ino_t inumber)
  {
  	daddr_t iblk;
 +	struct ext2fs_dinode *dp;

  	if ((inumber < EXT2_FIRSTINO &&
  	     inumber != EXT2_ROOTINO &&
 @@ -385,9 +386,13 @@ ginode(ino_t inumber)
  		if (pbp != 0)
  			pbp->b_flags &= ~B_INUSE;
  		pbp = getdatablk(iblk, sblock.e2fs_bsize);
 -		startinum = ((inumber -1) / sblock.e2fs_ipb) * sblock.e2fs_ipb + 1;
 +		startinum =
 +		    ((inumber - 1) / sblock.e2fs_ipb) * sblock.e2fs_ipb + 1;
  	}
 -	return (&pbp->b_un.b_dinode[(inumber-1) % sblock.e2fs_ipb]);
 +	dp = (struct ext2fs_dinode *)(pbp->b_un.b_buf +
 +	    EXT2_DINODE_SIZE(&sblock) * ino_to_fsbo(&sblock, inumber));
 +
 +	return dp;
  }

  /*
 @@ -396,14 +401,15 @@ ginode(ino_t inumber)
   */
  ino_t nextino, lastinum;
  long readcnt, readpercg, fullcnt, inobufsize, partialcnt, partialsize;
 -struct ext2fs_dinode *inodebuf;
 +char *inodebuf;

  struct ext2fs_dinode *
  getnextinode(ino_t inumber)
  {
  	long size;
  	daddr_t dblk;
 -	static struct ext2fs_dinode *dp;
 +	struct ext2fs_dinode *dp;
 +	static char *bp;

  	if (inumber != nextino++ || inumber > maxino)
  		errexit("bad inode number %llu to nextinode",
 @@ -418,10 +424,13 @@ getnextinode(ino_t inumber)
  			size = inobufsize;
  			lastinum += fullcnt;
  		}
 -		(void)bread(fsreadfd, (char *)inodebuf, dblk, size);
 -		dp = inodebuf;
 +		(void)bread(fsreadfd, inodebuf, dblk, size);
 +		bp = inodebuf;
  	}
 -	return (dp++);
 +	dp = (struct ext2fs_dinode *)bp;
 +	bp += EXT2_DINODE_SIZE(&sblock);
 +
 +	return dp;
  }

  void
 @@ -433,10 +442,10 @@ resetinodebuf(void)
  	lastinum = 1;
  	readcnt = 0;
  	inobufsize = blkroundup(&sblock, INOBUFSIZE);
 -	fullcnt = inobufsize / sizeof(struct ext2fs_dinode);
 +	fullcnt = inobufsize / EXT2_DINODE_SIZE(&sblock);
  	readpercg = sblock.e2fs.e2fs_ipg / fullcnt;
  	partialcnt = sblock.e2fs.e2fs_ipg % fullcnt;
 -	partialsize = partialcnt * sizeof(struct ext2fs_dinode);
 +	partialsize = partialcnt * EXT2_DINODE_SIZE(&sblock);
  	if (partialcnt != 0) {
  		readpercg++;
  	} else {
 @@ -444,8 +453,7 @@ resetinodebuf(void)
  		partialsize = inobufsize;
  	}
  	if (inodebuf == NULL &&
 -	    (inodebuf = (struct ext2fs_dinode *)malloc((unsigned)inobufsize)) ==
 -		NULL)
 +	    (inodebuf = malloc((unsigned int)inobufsize)) == NULL)
  		errexit("Cannot allocate space for inode buffer");
  	while (nextino < EXT2_ROOTINO)
  		(void)getnextinode(nextino);
 @@ -456,7 +464,7 @@ freeinodebuf(void)
  {

  	if (inodebuf != NULL)
 -		free((char *)inodebuf);
 +		free(inodebuf);
  	inodebuf = NULL;
  }

 @@ -478,8 +486,7 @@ cacheino(struct ext2fs_dinode *dp, ino_t
  	if (blks > NDADDR)
  		blks = NDADDR + NIADDR;
  	/* XXX ondisk32 */
 -	inp = (struct inoinfo *)
 -		malloc(sizeof(*inp) + (blks - 1) * sizeof(int32_t));
 +	inp = malloc(sizeof(*inp) + (blks - 1) * sizeof(int32_t));
  	if (inp == NULL)
  		return;
  	inpp = &inphead[inumber % numdirs];
 @@ -499,7 +506,7 @@ cacheino(struct ext2fs_dinode *dp, ino_t
  	if (inplast == listmax) {
  		listmax += 100;
  		inpsort = (struct inoinfo **)realloc((char *)inpsort,
 -		    (unsigned)listmax * sizeof(struct inoinfo *));
 +		    (unsigned int)listmax * sizeof(struct inoinfo *));
  		if (inpsort == NULL)
  			errexit("cannot increase directory list");
  	}
 @@ -534,9 +541,9 @@ inocleanup(void)
  	if (inphead == NULL)
  		return;
  	for (inpp = &inpsort[inplast - 1]; inpp >= inpsort; inpp--)
 -		free((char *)(*inpp));
 -	free((char *)inphead);
 -	free((char *)inpsort);
 +		free(*inpp);
 +	free(inphead);
 +	free(inpsort);
  	inphead = inpsort = NULL;
  }

 @@ -555,7 +562,7 @@ clri(struct inodesc *idesc, const char *
  	dp = ginode(idesc->id_number);
  	if (flag == 1) {
  		pwarn("%s %s", type,
 -		    (dp->e2di_mode & IFMT) == IFDIR ? "DIR" : "FILE");
 +		    (fs2h16(dp->e2di_mode) & IFMT) == IFDIR ? "DIR" : "FILE");
  		pinode(idesc->id_number);
  	}
  	if (preen || reply("CLEAR") == 1) {
 @@ -612,18 +619,22 @@ pinode(ino_t ino)
  	char *p;
  	struct passwd *pw;
  	time_t t;
 +	uid_t uid;

  	printf(" I=%llu ", (unsigned long long)ino);
  	if ((ino < EXT2_FIRSTINO && ino != EXT2_ROOTINO) || ino > maxino)
  		return;
  	dp = ginode(ino);
 +	uid = fs2h16(dp->e2di_uid);
 +	if (sblock.e2fs.e2fs_rev > E2FS_REV0)
 +		uid |= fs2h16(dp->e2di_uid_high) << 16;
  	printf(" OWNER=");
  #ifndef SMALL
 -	if (Uflag && (pw = getpwuid((int)dp->e2di_uid)) != 0)
 +	if (Uflag && (pw = getpwuid(uid)) != 0)
  		printf("%s ", pw->pw_name);
  	else
  #endif
 -		printf("%u ", (unsigned)fs2h16(dp->e2di_uid));
 +		printf("%u ", (unsigned int)uid);
  	printf("MODE=%o\n", fs2h16(dp->e2di_mode));
  	if (preen)
  		printf("%s: ", cdevname());
 Index: sbin/fsck_ext2fs/setup.c
 ===================================================================
 RCS file: /cvsroot/src/sbin/fsck_ext2fs/setup.c,v
 retrieving revision 1.25
 diff -p -u -r1.25 setup.c
 --- sbin/fsck_ext2fs/setup.c	16 Mar 2008 23:17:55 -0000	1.25
 +++ sbin/fsck_ext2fs/setup.c	16 Jun 2010 21:29:47 -0000
 @@ -309,6 +309,14 @@ readsb(int listerr)
  		badsb(listerr, "BAD LOG_BSIZE");
  		return 0;
  	}
 +	if (sblock.e2fs.e2fs_rev > E2FS_REV0 &&
 +	    (!powerof2(sblock.e2fs.e2fs_inode_size) ||
 +	     sblock.e2fs.e2fs_inode_size < sizeof(struct ext2fs_dinode) ||
 +	     sblock.e2fs.e2fs_inode_size >
 +	      (1024 << sblock.e2fs.e2fs_log_bsize))) {
 +		badsb(listerr, "BAD INODE_SIZE");
 +		return 0;
 +	}

  	/* compute the dynamic fields of the in-memory sb */
  	/* compute dynamic sb infos */
 @@ -323,7 +331,7 @@ readsb(int listerr)
  	sblock.e2fs_bmask = ~sblock.e2fs_qbmask;
  	sblock.e2fs_ngdb = howmany(sblock.e2fs_ncg,
  	    sblock.e2fs_bsize / sizeof(struct ext2_gd));
 -	sblock.e2fs_ipb = sblock.e2fs_bsize / sizeof(struct ext2fs_dinode);
 +	sblock.e2fs_ipb = sblock.e2fs_bsize / EXT2_DINODE_SIZE(&sblock);
  	sblock.e2fs_itpg = howmany(sblock.e2fs.e2fs_ipg, sblock.e2fs_ipb);

  	/*
 Index: sbin/newfs_ext2fs/extern.h
 ===================================================================
 RCS file: /cvsroot/src/sbin/newfs_ext2fs/extern.h,v
 retrieving revision 1.2
 diff -p -u -r1.2 extern.h
 --- sbin/newfs_ext2fs/extern.h	14 Dec 2007 13:19:35 -0000	1.2
 +++ sbin/newfs_ext2fs/extern.h	16 Jun 2010 21:29:47 -0000
 @@ -41,6 +41,7 @@ extern int	Nflag;		/* run mkfs without w
  extern int	Oflag;		/* format as an 4.3BSD file system */
  extern int	verbosity;	/* amount of printf() output */
  extern int64_t	fssize;		/* file system size */
 +extern uint16_t	inodesize;	/* bytes per inode */
  extern uint	sectorsize;	/* sector size */
  extern uint	fsize;		/* fragment size */
  extern uint	bsize;		/* block size */
 Index: sbin/newfs_ext2fs/mke2fs.c
 ===================================================================
 RCS file: /cvsroot/src/sbin/newfs_ext2fs/mke2fs.c,v
 retrieving revision 1.9
 diff -p -u -r1.9 mke2fs.c
 --- sbin/newfs_ext2fs/mke2fs.c	28 Aug 2008 16:29:24 -0000	1.9
 +++ sbin/newfs_ext2fs/mke2fs.c	16 Jun 2010 21:29:47 -0000
 @@ -243,6 +243,12 @@ mke2fs(const char *fsys, int fi, int fo)
  		    bsize, fsize);
  	}

 +	/* variable inodesize is REV1 feature */
 +	if (Oflag == 0 && inodesize != EXT2_REV0_DINODE_SIZE) {
 +		errx(EXIT_FAILURE, "GOOD_OLD_REV file system format"
 +		    " doesn't support %d byte inode\n", inodesize);
 +	}
 +
  	sblock.e2fs.e2fs_log_bsize = ilog2(bsize) - LOG_MINBSIZE;
  	/* Umm, why not e2fs_log_fsize? */
  	sblock.e2fs.e2fs_fsize = ilog2(fsize) - LOG_MINBSIZE;
 @@ -252,7 +258,7 @@ mke2fs(const char *fsys, int fi, int fo)
  	sblock.e2fs_qbmask = sblock.e2fs_bsize - 1;
  	sblock.e2fs_bmask = ~sblock.e2fs_qbmask;
  	sblock.e2fs_fsbtodb = ilog2(sblock.e2fs_bsize) - ilog2(sectorsize);
 -	sblock.e2fs_ipb = sblock.e2fs_bsize / EXT2_DINODE_SIZE;
 +	sblock.e2fs_ipb = sblock.e2fs_bsize / inodesize;

  	/*
  	 * Ext2fs preserves BBSIZE (1024 bytes) space at the top for
 @@ -301,7 +307,7 @@ mke2fs(const char *fsys, int fi, int fo)
  		num_inodes = UINT16_MAX * ncg;	/* ext2bgd_nifree is uint16_t */

  	inodes_per_cg = num_inodes / ncg;
 -	iblocks_per_cg = howmany(EXT2_DINODE_SIZE * inodes_per_cg, bsize);
 +	iblocks_per_cg = howmany(inodesize * inodes_per_cg, bsize);

  	/* Check that the last cylinder group has enough space for inodes */
  	minblocks_per_cg =
 @@ -404,7 +410,7 @@ mke2fs(const char *fsys, int fi, int fo)
  	sblock.e2fs.e2fs_rgid = getegid();

  	sblock.e2fs.e2fs_first_ino = EXT2_FIRSTINO;
 -	sblock.e2fs.e2fs_inode_size = EXT2_DINODE_SIZE;
 +	sblock.e2fs.e2fs_inode_size = inodesize;

  	/* e2fs_block_group_nr is set on writing superblock to each group */

 @@ -754,11 +760,11 @@ initcg(uint cylno)
  	 *       to override these generated numbers.
  	 */
  	memset(buf, 0, sblock.e2fs_bsize);
 -	dp = (struct ext2fs_dinode *)buf;
  	for (i = 0; i < sblock.e2fs_itpg; i++) {
  		for (j = 0; j < sblock.e2fs_ipb; j++) {
 +			dp = (struct ext2fs_dinode *)(buf + inodesize * j);
  			/* h2fs32() just for consistency */
 -			dp[j].e2di_gen = h2fs32(arc4random());
 +			dp->e2di_gen = h2fs32(arc4random());
  		}
  		wtfs(fsbtodb(&sblock, gd[cylno].ext2bgd_i_tables + i),
  		    sblock.e2fs_bsize, buf);
 @@ -1352,8 +1358,8 @@ iput(struct ext2fs_dinode *ip, ino_t ino
  	d = fsbtodb(&sblock, ino_to_fsba(&sblock, ino));
  	rdfs(d, sblock.e2fs_bsize, bp);

 -	dp = (struct ext2fs_dinode *)bp;
 -	dp += ino_to_fsbo(&sblock, ino);
 +	dp = (struct ext2fs_dinode *)(bp +
 +	    inodesize * ino_to_fsbo(&sblock, ino));
  	e2fs_isave(ip, dp);
  	/* e2fs_i_bswap() doesn't swap e2di_blocks addrs */
  	if ((ip->e2di_mode & EXT2_IFMT) != EXT2_IFLNK) {
 Index: sbin/newfs_ext2fs/newfs_ext2fs.8
 ===================================================================
 RCS file: /cvsroot/src/sbin/newfs_ext2fs/newfs_ext2fs.8,v
 retrieving revision 1.1
 diff -p -u -r1.1 newfs_ext2fs.8
 --- sbin/newfs_ext2fs/newfs_ext2fs.8	17 Nov 2007 16:50:26 -0000	1.1
 +++ sbin/newfs_ext2fs/newfs_ext2fs.8	16 Jun 2010 21:29:47 -0000
 @@ -29,7 +29,7 @@
  .\"
  .\"     @(#)newfs.8	8.6 (Berkeley) 5/3/95
  .\"
 -.Dd November 17, 2007
 +.Dd March 1, 2009
  .Dt NEWFS_EXT2FS 8
  .Os
  .Sh NAME
 @@ -39,6 +39,7 @@
  .Nm
  .Op Fl FINZ
  .Op Fl b Ar block-size
 +.Op Fl D Ar inodesize
  .Op Fl f Ar frag-size
  .Op Fl i Ar bytes-per-inode
  .Op Fl m Ar free-space
 @@ -93,6 +94,10 @@ The default size depends upon the size o
  .It \*[Gt] 512 MB
  4 KB
  .El
 +.It Fl D
 +Set the inode size.
 +Defaults to 128, and can also be set to 256 for
 +compatibility with ext4.
  .It Fl F
  Create a file system image in
  .Ar special .
 @@ -134,7 +139,8 @@ Select the filesystem-format
  .It 0
  .Ql GOOD_OLD_REV ;
  This option is primarily used to build root file systems that can be
 -understood by old or dumb firmwares for bootstrap. (default)
 +understood by old or dumb firmwares for bootstrap.
 +(default)
  .It 1
  .Ql DYNAMIC_REV ;
  Various extended (and sometimes incompatible) features are enabled
 Index: sbin/newfs_ext2fs/newfs_ext2fs.c
 ===================================================================
 RCS file: /cvsroot/src/sbin/newfs_ext2fs/newfs_ext2fs.c,v
 retrieving revision 1.4
 diff -p -u -r1.4 newfs_ext2fs.c
 --- sbin/newfs_ext2fs/newfs_ext2fs.c	20 Jul 2008 01:20:23 -0000	1.4
 +++ sbin/newfs_ext2fs/newfs_ext2fs.c	16 Jun 2010 21:29:47 -0000
 @@ -54,6 +54,7 @@ __RCSID("$NetBSD$");
  #include <sys/mount.h>

  #include <ufs/ext2fs/ext2fs.h>
 +#include <ufs/ext2fs/ext2fs_dinode.h>

  #include <disktab.h>
  #include <err.h>
 @@ -104,6 +105,7 @@ int	verbosity;		/* amount of printf() ou
  #define DEFAULT_VERBOSITY 3	/* 4 is traditional behavior of newfs(8) */
  int64_t fssize;			/* file system size */
  uint	sectorsize;		/* bytes/sector */
 +uint16_t inodesize = EXT2_REV0_DINODE_SIZE;	/* inode size */
  uint	fsize = 0;		/* fragment size */
  uint	bsize = 0;		/* block size */
  uint	minfree = MINFREE;	/* free space threshold */
 @@ -133,10 +135,16 @@ main(int argc, char *argv[])
  	fsi = fso = -1;
  	Fflag = Iflag = Zflag = 0;
  	verbosity = -1;
 -	opstring = "FINO:S:V:Zb:f:i:l:m:n:s:v:";
 +	opstring = "D:FINO:S:V:Zb:f:i:l:m:n:s:v:";
  	byte_sized = 0;
  	while ((ch = getopt(argc, argv, opstring)) != -1)
  		switch (ch) {
 +		case 'D':
 +			inodesize = (uint16_t)strtol(optarg, &s1, 0);
 +			if (*s1 || (inodesize != 128 && inodesize != 256))
 +				errx(1, "Bad inode size %d "
 +				    "(only 128 and 256 supported)", inodesize);
 +			break;
  		case 'F':
  			Fflag = 1;
  			break;
 @@ -449,20 +457,21 @@ strsuftoi64(const char *desc, const char
  }

  static const char help_strings[] =
 -	"\t-F \t\tcreate file system image in regular file\n"
 -	"\t-I \t\tdo not check that the file system type is `Linux Ext2'\n"
 -	"\t-N \t\tdo not create file system, just print out parameters\n"
 -	"\t-O N\t\tfilesystem revision: 0 ==> REV0, 1 ==> REV1 (default 0)\n"
 -	"\t-S secsize\tsector size\n"
 -	"\t-V verbose\toutput verbosity: 0 ==> none, 4 ==> max\n"
 -	"\t-Z \t\tpre-zero the image file\n"
  	"\t-b bsize\tblock size\n"
 +	"\t-D inodesize\tsize of an inode in bytes (128 or 256)\n"
 +	"\t-F \t\tcreate file system image in regular file\n"
  	"\t-f fsize\tfragment size\n"
 +	"\t-I \t\tdo not check that the file system type is `Linux Ext2'\n"
  	"\t-i density\tnumber of bytes per inode\n"
  	"\t-m minfree\tminimum free space %\n"
 +	"\t-N \t\tdo not create file system, just print out parameters\n"
  	"\t-n inodes\tnumber of inodes (overrides -i density)\n"
 +	"\t-O N\t\tfilesystem revision: 0 ==> REV0, 1 ==> REV1 (default 0)\n"
 +	"\t-S secsize\tsector size\n"
  	"\t-s fssize\tfile system size (sectors)\n"
 -	"\t-v volname\text2fs volume name\n";
 +	"\t-V verbose\toutput verbosity: 0 ==> none, 4 ==> max\n"
 +	"\t-v volname\text2fs volume name\n"
 +	"\t-Z \t\tpre-zero the image file\n";

  static void
  usage(void)
 Index: sys/lib/libsa/ext2fs.c
 ===================================================================
 RCS file: /cvsroot/src/sys/lib/libsa/ext2fs.c,v
 retrieving revision 1.4
 diff -p -u -r1.4 ext2fs.c
 --- sys/lib/libsa/ext2fs.c	2 Dec 2007 06:47:43 -0000	1.4
 +++ sys/lib/libsa/ext2fs.c	16 Jun 2010 21:29:47 -0000
 @@ -189,8 +189,9 @@ read_inode(ino32_t inumber, struct open_
  	if (rsize != fs->e2fs_bsize)
  		return EIO;

 -	dip = (struct ext2fs_dinode *)buf;
 -	e2fs_iload(&dip[ino_to_fsbo(fs, inumber)], &fp->f_di);
 +	dip = (struct ext2fs_dinode *)(buf +
 +	    EXT2_DINODE_SIZE(fs) * ino_to_fsbo(fs, inumber));
 +	e2fs_iload(dip, &fp->f_di);

  	/*
  	 * Clear out the old buffers
 @@ -431,7 +432,7 @@ read_sblock(struct open_file *f, struct 
  	if (ext2fs.e2fs_rev > E2FS_REV1 ||
  	    (ext2fs.e2fs_rev == E2FS_REV1 &&
  	     (ext2fs.e2fs_first_ino != EXT2_FIRSTINO ||
 -	      ext2fs.e2fs_inode_size != EXT2_DINODE_SIZE ||
 +	     (ext2fs.e2fs_inode_size != 128 && ext2fs.e2fs_inode_size != 256) ||
  	      ext2fs.e2fs_features_incompat & ~EXT2F_INCOMPAT_SUPP))) {
  		return ENODEV;
  	}
 @@ -449,7 +450,7 @@ read_sblock(struct open_file *f, struct 
  	fs->e2fs_bmask = ~fs->e2fs_qbmask;
  	fs->e2fs_ngdb =
  	    howmany(fs->e2fs_ncg, fs->e2fs_bsize / sizeof(struct ext2_gd));
 -	fs->e2fs_ipb = fs->e2fs_bsize / EXT2_DINODE_SIZE;
 +	fs->e2fs_ipb = fs->e2fs_bsize / ext2fs.e2fs_inode_size;
  	fs->e2fs_itpg = fs->e2fs.e2fs_ipg / fs->e2fs_ipb;

  	return 0;
 Index: sys/ufs/ext2fs/ext2fs_dinode.h
 ===================================================================
 RCS file: /cvsroot/src/sys/ufs/ext2fs/ext2fs_dinode.h,v
 retrieving revision 1.16.28.1
 diff -p -u -r1.16.28.1 ext2fs_dinode.h
 --- sys/ufs/ext2fs/ext2fs_dinode.h	29 Nov 2008 23:10:18 -0000	1.16.28.1
 +++ sys/ufs/ext2fs/ext2fs_dinode.h	16 Jun 2010 21:29:47 -0000
 @@ -154,7 +154,10 @@ struct ext2fs_dinode {
  #define EXT2_NODUMP		0x00000040	/* do not dump file */

  /* Size of on-disk inode. */
 -#define	EXT2_DINODE_SIZE	(sizeof(struct ext2fs_dinode))	/* 128 */
 +#define EXT2_REV0_DINODE_SIZE	sizeof(struct ext2fs_dinode)
 +#define EXT2_DINODE_SIZE(fs)	((fs)->e2fs.e2fs_rev > E2FS_REV0 ?	\
 +				    (fs)->e2fs.e2fs_inode_size :	\
 +				    EXT2_REV0_DINODE_SIZE)

  /*
   * The e2di_blocks fields may be overlaid with other information for
 Index: sys/ufs/ext2fs/ext2fs_inode.c
 ===================================================================
 RCS file: /cvsroot/src/sys/ufs/ext2fs/ext2fs_inode.c,v
 retrieving revision 1.66.8.1
 diff -p -u -r1.66.8.1 ext2fs_inode.c
 --- sys/ufs/ext2fs/ext2fs_inode.c	22 Feb 2010 04:43:46 -0000	1.66.8.1
 +++ sys/ufs/ext2fs/ext2fs_inode.c	16 Jun 2010 21:29:47 -0000
 @@ -221,7 +221,7 @@ ext2fs_update(struct vnode *vp, const st
  	}
  	ip->i_flag &= ~(IN_MODIFIED | IN_ACCESSED);
  	cp = (char *)bp->b_data +
 -	    (ino_to_fsbo(fs, ip->i_number) * EXT2_DINODE_SIZE);
 +	    (ino_to_fsbo(fs, ip->i_number) * EXT2_DINODE_SIZE(fs));
  	e2fs_isave(ip->i_din.e2fs_din, (struct ext2fs_dinode *)cp);
  	if ((updflags & (UPDATE_WAIT|UPDATE_DIROP)) != 0 &&
  	    (flags & IN_MODIFIED) != 0 &&
 Index: sys/ufs/ext2fs/ext2fs_vfsops.c
 ===================================================================
 RCS file: /cvsroot/src/sys/ufs/ext2fs/ext2fs_vfsops.c,v
 retrieving revision 1.137.6.5
 diff -p -u -r1.137.6.5 ext2fs_vfsops.c
 --- sys/ufs/ext2fs/ext2fs_vfsops.c	27 Oct 2009 21:41:07 -0000	1.137.6.5
 +++ sys/ufs/ext2fs/ext2fs_vfsops.c	16 Jun 2010 21:29:47 -0000
 @@ -577,7 +577,7 @@ ext2fs_reload(struct mount *mountp, kaut
  	fs->e2fs_bmask = ~fs->e2fs_qbmask;
  	fs->e2fs_ngdb =
  	    howmany(fs->e2fs_ncg, fs->e2fs_bsize / sizeof(struct ext2_gd));
 -	fs->e2fs_ipb = fs->e2fs_bsize / EXT2_DINODE_SIZE;
 +	fs->e2fs_ipb = fs->e2fs_bsize / EXT2_DINODE_SIZE(fs);
  	fs->e2fs_itpg = fs->e2fs.e2fs_ipg / fs->e2fs_ipb;
  	brelse(bp, 0);

 @@ -646,7 +646,7 @@ loop:
  			break;
  		}
  		cp = (char *)bp->b_data +
 -		    (ino_to_fsbo(fs, ip->i_number) * EXT2_DINODE_SIZE);
 +		    (ino_to_fsbo(fs, ip->i_number) * EXT2_DINODE_SIZE(fs));
  		e2fs_iload((struct ext2fs_dinode *)cp, ip->i_din.e2fs_din);
  		ext2fs_set_inode_guid(ip);
  		brelse(bp, 0);
 @@ -696,8 +696,7 @@ ext2fs_mountfs(struct vnode *devvp, stru
  	ump = NULL;

  #ifdef DEBUG_EXT2
 -	printf("sb size: %d ino size %d\n", sizeof(struct ext2fs),
 -	    EXT2_DINODE_SIZE);
 +	printf("ext2 sb size: %d\n", sizeof(struct ext2fs));
  #endif
  	error = bread(devvp, (SBOFF / size), SBSIZE, cred, 0, &bp);
  	if (error)
 @@ -717,6 +716,10 @@ ext2fs_mountfs(struct vnode *devvp, stru
  	bp = NULL;
  	m_fs = ump->um_e2fs;
  	m_fs->e2fs_ronly = ronly;
 +
 +#ifdef DEBUG_EXT2
 +	printf("ext2 ino size %d\n", EXT2_DINODE_SIZE(m_fs));
 +#endif
  	if (ronly == 0) {
  		if (m_fs->e2fs.e2fs_state == E2FS_ISCLEAN)
  			m_fs->e2fs.e2fs_state = 0;
 @@ -737,7 +740,7 @@ ext2fs_mountfs(struct vnode *devvp, stru
  	m_fs->e2fs_bmask = ~m_fs->e2fs_qbmask;
  	m_fs->e2fs_ngdb =
  	    howmany(m_fs->e2fs_ncg, m_fs->e2fs_bsize / sizeof(struct ext2_gd));
 -	m_fs->e2fs_ipb = m_fs->e2fs_bsize / EXT2_DINODE_SIZE;
 +	m_fs->e2fs_ipb = m_fs->e2fs_bsize / EXT2_DINODE_SIZE(m_fs);
  	m_fs->e2fs_itpg = m_fs->e2fs.e2fs_ipg / m_fs->e2fs_ipb;

  	m_fs->e2fs_gd = malloc(m_fs->e2fs_ngdb * m_fs->e2fs_bsize,
 @@ -1078,7 +1081,7 @@ retry:
  		*vpp = NULL;
  		return (error);
  	}
 -	cp = (char *)bp->b_data + (ino_to_fsbo(fs, ino) * EXT2_DINODE_SIZE);
 +	cp = (char *)bp->b_data + (ino_to_fsbo(fs, ino) * EXT2_DINODE_SIZE(fs));
  	ip->i_din.e2fs_din = pool_get(&ext2fs_dinode_pool, PR_WAITOK);
  	e2fs_iload((struct ext2fs_dinode *)cp, ip->i_din.e2fs_din);
  	ext2fs_set_inode_guid(ip);
 @@ -1260,9 +1263,8 @@ ext2fs_checksb(struct ext2fs *fs, int ro
  		return (EINVAL);	   /* XXX needs translation */
  	}
  	if (fs2h32(fs->e2fs_rev) > E2FS_REV0) {
 -		if (fs2h32(fs->e2fs_first_ino) != EXT2_FIRSTINO ||
 -		    fs2h16(fs->e2fs_inode_size) != EXT2_DINODE_SIZE) {
 -			printf("Ext2 fs: unsupported inode size\n");
 +		if (fs2h32(fs->e2fs_first_ino) != EXT2_FIRSTINO) {
 +			printf("Ext2 fs: unsupported first inode position\n");
  			return (EINVAL);      /* XXX needs translation */
  		}
  		if (fs2h32(fs->e2fs_features_incompat) &

 --------------040308030201050100000304--

From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
To: riz@tastylime.net
Cc: gnats-bugs@NetBSD.org, tsutsui@ceres.dti.ne.jp
Subject: Re: kern/43344
Date: Sat, 11 Sep 2010 21:31:13 +0900

 > If someone can verify for me that they have the intended effect, I will 
 > request pullup to netbsd-5.

 Finally I've tried it on NetBSD/i386 5.1_RC3 on QEMU.

 I can create ext2fs with 256byte inode by newfs_ext2fs(8),
 root on ext2fs with 256byte inode seems working, and
 fsck_ext2fs(8) checks it with no particular problem.

 ---
 Izumi Tsutsui

Responsible-Changed-From-To: kern-bug-people->tsutsui
Responsible-Changed-By: tsutsui@NetBSD.org
Responsible-Changed-When: Sun, 16 Jan 2011 17:04:12 +0900
Responsible-Changed-Why:


State-Changed-From-To: open->pending-pullups
State-Changed-By: tsutsui@NetBSD.org
State-Changed-When: Sun, 16 Jan 2011 17:04:12 +0900
State-Changed-Why:
pullup-5 #1486


State-Changed-From-To: pending-pullups->closed
State-Changed-By: tsutsui@NetBSD.org
State-Changed-When: Sun, 16 Jan 2011 21:45:05 +0900
State-Changed-Why:
Will appear in 5.2.


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.39 2013/11/01 18:47:49 spz Exp $
$NetBSD: gnats_config.sh,v 1.8 2006/05/07 09:23:38 tsutsui Exp $
Copyright © 1994-2007 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.