Subject: 64 bit inode changes
To: None <tech-kern@netbsd.org>
From: Christos Zoulas <christos@zoulas.com>
List: tech-kern
Date: 08/15/2005 17:47:15
Hi,

I just finished converting the kernel API's to 64 bit inodes. I had to
version the following system calls:

	getdents
	stat		
	lstat
	fstat

I changed the order of some of the stat members to make more sense (moved
birthdate up).

I did not version the following because I don't think that they are used
outside the lfs cleaner/mount program, and since not many people use lfs,
it is not that important to keep compatible (you can recompile your code):
	lfs_bmapv
	lfs_markv

The diffs are quite big (but mostly mechanical) and you can look at them
on ftp://ftp.netbsd.org/pub/NetBSD/misc/christos. There are 3 files, one
for libc, one for include, and one for sys. If you want to try them out,
you should:

	1. apply the sys patch. build and boot your kernel and make sure
	   it works.
	2. apply the include and the libc patch.
		a. make includes
		b. make cleandir in libc (to be sure remove everything by hand).
		c. make install in libc and make sure programs still work.
	3. build the rest of the world.

Things that might be broken:

	- emulations
	- nfs

But should be trivial to fix. The hardest part of the exercise was
ufs_vnops.c:ufs_readdir() which needed a complete rewrite since it
assumed that on-disk version of dirent has the same layout as the
in-memory one. None of the filesystems have been converted to use
64 bit inodes yet.

Now that we've versioned enough syscalls I propose the following refinements
in the syscall versioning system:

1. Call the syscall by the last OS release number that it was used, not by
   the libc version number. For example __stat30, since 3.0 will be the
   last release with the old stat. This way we can have multiple revisions
   of the same symbol as we do now.
2. Move the compatibility portion of the headers in src/sys/sys/compat and
   src/include/compat. These headers will *not* be installed.

christos