[Pvfs2-cvs] commit by slang in pvfs2/patches: SERIES posix-direntplus-lite.patch posix-direntplus.patch posix-extensions-cvs.patch posix-readwritex.patch posix-statlite-fix.patch posix-statlite-x86_64.patch posix-statlite.patch

CVS commit program cvs at parl.clemson.edu
Mon Jan 7 17:27:25 EST 2008


Update of /projects/cvsroot/pvfs2/patches
In directory parlweb1:/tmp/cvs-serv26113

Removed Files:
	SERIES posix-direntplus-lite.patch posix-direntplus.patch 
	posix-extensions-cvs.patch posix-readwritex.patch 
	posix-statlite-fix.patch posix-statlite-x86_64.patch 
	posix-statlite.patch 
Log Message:
Added Dean's cleaned up pNFS patches for PVFS to the patches directory, along with a brief description of each.  Thanks Dean!  Moved the posix extensions patches to a subdir.


--- SERIES	2008-01-07 17:27:25.000000000 -0500
+++ /dev/null	2004-06-24 14:04:38.000000000 -0400
@@ -1,24 +0,0 @@
-Apply the patches to a vanilla 2.6.16 kernel in the following order
-
-a) posix-extensions-cvs.patch : This implements the sys call stubs for
-   openg/openfh and the VFS hooks for file system specific implementations.
-
-b) posix-statlite.patch : This implements the sys call stubs for the statlite()
-   family of system calls and the VFS hooks for file system specific
-   implementations.
-
-c) posix-statlite-x86_64.patch : Bug fix/build fix patch for the x86-64 machine.
-
-d) posix-direntplus.patch: This implements the sys call stubs for the
-   readdir_plus() family of system calls and the corresponding VFS hooks for FS
-   specific implementations.
-
-e) posix-readwritex.patch: Implements the sys call stubs for the readx/writex
-   family of system calls and the corresponding VFS hooks for FS specific
-   implementations.
-
-f) posix-statlite-fix.patch: Bug fix for the statlite system call.
-
-g) posix-direntplus-lite.patch: Implements the syscall stubs for the
-   readdir_plus_lite() family of system calls and the corresponding VFS hooks
-   for FS specific implementations.

--- posix-direntplus-lite.patch	2008-01-07 17:27:25.000000000 -0500
+++ /dev/null	2004-06-24 14:04:38.000000000 -0400
@@ -1,441 +0,0 @@
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/i386/kernel/syscall_table.S vanilla-new/arch/i386/kernel/syscall_table.S
---- vanilla/arch/i386/kernel/syscall_table.S	2006-08-29 17:56:17.000000000 -0500
-+++ vanilla-new/arch/i386/kernel/syscall_table.S	2006-09-04 05:03:44.000000000 -0500
-@@ -322,3 +322,5 @@
- 	.long sys_getdents64_plus /* 320 */
- 	.long sys_readx
- 	.long sys_writex
-+	.long sys_getdents_plus_lite
-+	.long sys_getdents64_plus_lite
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/readdir.c vanilla-new/fs/readdir.c
---- vanilla/fs/readdir.c	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/fs/readdir.c	2006-09-04 04:49:14.000000000 -0500
-@@ -69,6 +69,33 @@
- 
- EXPORT_SYMBOL_GPL(vfs_readdirplus);
- 
-+int vfs_readdirplus_lite(struct file *file, unsigned long lite_mask,
-+		filldirpluslite_t fillerpluslite, void *buf)
-+{
-+	struct inode *inode = file->f_dentry->d_inode;
-+	int res = -ENOTDIR;
-+	if (!file->f_op || !file->f_op->readdirplus_lite)
-+		goto out;
-+
-+	res = security_file_permission(file, MAY_READ);
-+	if (res)
-+		goto out;
-+
-+	mutex_lock(&inode->i_mutex);
-+	res = -ENOENT;
-+	if (!IS_DEADDIR(inode)) {
-+		res = file->f_op->readdirplus_lite(file, lite_mask, buf, fillerpluslite);
-+		file_accessed(file);
-+	}
-+	mutex_unlock(&inode->i_mutex);
-+out:
-+	if (file->f_op && file->f_op->readdir && !file->f_op->readdirplus_lite)
-+		res = -EOPNOTSUPP;
-+	return res;
-+}
-+
-+EXPORT_SYMBOL_GPL(vfs_readdirplus_lite);
-+
- /*
-  * Traditional linux readdir() handling..
-  *
-@@ -343,6 +370,112 @@
- 	return error;
- }
- 
-+/* getdents_plus_lite implementation */
-+#define DIRENT_OFFSET(de) ((unsigned long) &((de)->dp_dirent) - (unsigned long) (char __user *) (de))
-+
-+struct linux_dirent_plus_lite {
-+	struct stat_lite     dp_stat_lite;
-+	int                  dp_stat_lite_err;
-+	struct linux_dirent  dp_dirent;
-+};
-+
-+struct getdentspluslite_callback {
-+	struct linux_dirent_plus_lite __user * current_dir;
-+	struct linux_dirent_plus_lite __user * previous;
-+	int count;
-+	int error;
-+};
-+
-+static int filldirpluslite(void * __buf, const char * name, int namlen, loff_t offset,
-+		   ino_t ino, unsigned int d_type, struct kstat_lite *statp)
-+{
-+	struct linux_dirent __user *de;
-+	struct linux_dirent_plus_lite __user * dirent;
-+	struct getdentspluslite_callback * buf = (struct getdentspluslite_callback *) __buf;
-+	int err, reclen = ROUND_UP(NAME_OFFSET(de) + namlen + DIRENT_OFFSET(dirent) + 2);
-+
-+	buf->error = -EINVAL;	/* only used if we fail.. */
-+	if (reclen > buf->count)
-+		return -EINVAL;
-+	dirent = buf->previous;
-+	if (dirent) {
-+		if (__put_user(offset, &dirent->dp_dirent.d_off))
-+			goto efault;
-+	}
-+	dirent = buf->current_dir;
-+	err = 0;
-+	if (IS_ERR(statp)) {
-+		err = PTR_ERR(statp);
-+		if (__put_user(err, &dirent->dp_stat_lite_err))
-+			goto efault;
-+	}
-+	else {
-+		if (__put_user(err, &dirent->dp_stat_lite_err))
-+			goto efault;
-+		if (cp_new_statlite(statp, &dirent->dp_stat_lite))
-+			goto efault;
-+	}
-+	if (__put_user(ino, &dirent->dp_dirent.d_ino))
-+		goto efault;
-+	if (__put_user(reclen, &dirent->dp_dirent.d_reclen))
-+		goto efault;
-+	if (copy_to_user(dirent->dp_dirent.d_name, name, namlen))
-+		goto efault;
-+	if (__put_user(0, dirent->dp_dirent.d_name + namlen))
-+		goto efault;
-+	if (__put_user(d_type, (char __user *) dirent + reclen - 1))
-+		goto efault;
-+	buf->previous = dirent;
-+	dirent = (void __user *)dirent + reclen;
-+	buf->current_dir = dirent;
-+	buf->count -= reclen;
-+	return 0;
-+efault:
-+	buf->error = -EFAULT;
-+	return -EFAULT;
-+}
-+
-+asmlinkage long sys_getdents_plus_lite(unsigned int fd, unsigned long lite_mask, 
-+		struct linux_dirent_plus_lite __user * dirent, unsigned int count)
-+{
-+	struct file * file;
-+	struct linux_dirent_plus_lite __user * lastdirent;
-+	struct getdentspluslite_callback buf;
-+	int error;
-+
-+	error = -EFAULT;
-+	if (!access_ok(VERIFY_WRITE, dirent, count))
-+		goto out;
-+
-+	error = -EBADF;
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	buf.current_dir = dirent;
-+	buf.previous = NULL;
-+	buf.count = count;
-+	buf.error = 0;
-+
-+	error = vfs_readdirplus_lite(file, lite_mask, filldirpluslite, &buf);
-+	if (error < 0)
-+		goto out_putf;
-+	error = buf.error;
-+	lastdirent = buf.previous;
-+	if (lastdirent) {
-+		typeof(lastdirent->dp_dirent.d_off) d_off = file->f_pos;
-+		error = -EFAULT;
-+		if (__put_user(d_off, &lastdirent->dp_dirent.d_off))
-+			goto out_putf;
-+		error = count - buf.count;
-+	}
-+
-+out_putf:
-+	fput(file);
-+out:
-+	return error;
-+}
-+
- #define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1))
- 
- struct getdents_callback64 {
-@@ -531,3 +664,106 @@
- out:
- 	return error;
- }
-+
-+struct getdentspluslite_callback64 {
-+	struct linux_dirent64_plus_lite __user * current_dir;
-+	struct linux_dirent64_plus_lite __user * previous;
-+	int count;
-+	int error;
-+};
-+
-+static int filldir64_plus_lite(void * __buf, const char * name, int namlen, loff_t offset,
-+		     ino_t ino, unsigned int d_type, struct kstat_lite *statp)
-+{
-+	struct linux_dirent64 __user *de;
-+	struct linux_dirent64_plus_lite __user *dirent;
-+	struct getdentspluslite_callback64 * buf = (struct getdentspluslite_callback64 *) __buf;
-+	int err, reclen = ROUND_UP64(NAME_OFFSET(de) + namlen + 1 + DIRENT_OFFSET(dirent));
-+
-+	buf->error = -EINVAL;	/* only used if we fail.. */
-+	if (reclen > buf->count)
-+		return -EINVAL;
-+	dirent = buf->previous;
-+	if (dirent) {
-+		if (__put_user(offset, &dirent->dp_dirent.d_off))
-+			goto efault;
-+	}
-+	dirent = buf->current_dir;
-+	err = 0;
-+	if (IS_ERR(statp)) {
-+		err = PTR_ERR(statp);
-+		if (__put_user(err, &dirent->dp_stat_lite_err))
-+			goto efault;
-+	}
-+	else {
-+		if (__put_user(err, &dirent->dp_stat_lite_err))
-+			goto efault;
-+#ifdef __ARCH_WANT_STAT64
-+		if (cp_new_stat64_lite(statp, &dirent->dp_stat_lite))
-+#else
-+		if (cp_new_statlite(statp, &dirent->dp_stat_lite))
-+#endif
-+			goto efault;
-+	}
-+	if (__put_user(ino, &dirent->dp_dirent.d_ino))
-+		goto efault;
-+	if (__put_user(0, &dirent->dp_dirent.d_off))
-+		goto efault;
-+	if (__put_user(reclen, &dirent->dp_dirent.d_reclen))
-+		goto efault;
-+	if (__put_user(d_type, &dirent->dp_dirent.d_type))
-+		goto efault;
-+	if (copy_to_user(dirent->dp_dirent.d_name, name, namlen))
-+		goto efault;
-+	if (__put_user(0, dirent->dp_dirent.d_name + namlen))
-+		goto efault;
-+	buf->previous = dirent;
-+	dirent = (void __user *)dirent + reclen;
-+	buf->current_dir = dirent;
-+	buf->count -= reclen;
-+	return 0;
-+efault:
-+	buf->error = -EFAULT;
-+	return -EFAULT;
-+}
-+
-+asmlinkage long sys_getdents64_plus_lite(unsigned int fd, unsigned long lite_mask, 
-+		struct linux_dirent64_plus_lite __user * dirent, unsigned int count)
-+{
-+	struct file * file;
-+	struct linux_dirent64_plus_lite __user * lastdirent;
-+	struct getdentspluslite_callback64 buf;
-+	int error;
-+
-+	error = -EFAULT;
-+	if (!access_ok(VERIFY_WRITE, dirent, count))
-+		goto out;
-+
-+	error = -EBADF;
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	buf.current_dir = dirent;
-+	buf.previous = NULL;
-+	buf.count = count;
-+	buf.error = 0;
-+
-+	error = vfs_readdirplus_lite(file, lite_mask, filldir64_plus_lite, &buf);
-+	if (error < 0)
-+		goto out_putf;
-+	error = buf.error;
-+	lastdirent = buf.previous;
-+	if (lastdirent) {
-+		typeof(lastdirent->dp_dirent.d_off) d_off = file->f_pos;
-+		error = -EFAULT;
-+		if (__put_user(d_off, &lastdirent->dp_dirent.d_off))
-+			goto out_putf;
-+		error = count - buf.count;
-+	}
-+
-+out_putf:
-+	fput(file);
-+out:
-+	return error;
-+}
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-i386/dirent.h vanilla-new/include/asm-i386/dirent.h
---- vanilla/include/asm-i386/dirent.h	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/include/asm-i386/dirent.h	2006-09-04 04:59:36.000000000 -0500
-@@ -9,12 +9,24 @@
- 	struct dirent dp_dirent;
- };
- 
-+struct dirent_plus_lite {
-+	struct stat_lite dp_stat_lite;
-+	int              dp_stat_lite_err;
-+	struct dirent    dp_dirent;
-+};
-+
- struct dirent64_plus {
- 	struct stat64   dp_stat;
- 	int             dp_stat_err;
- 	struct dirent64 dp_dirent;
- };
- 
-+struct dirent64_plus_lite {
-+	struct stat64_lite   dp_stat_lite;
-+	int                  dp_stat_lite_err;
-+	struct dirent64 	   dp_dirent;
-+};
-+
- #ifdef __KERNEL__
- 
- struct linux_dirent64_plus {
-@@ -23,6 +35,12 @@
- 	struct linux_dirent64 dp_dirent;
- };
- 
-+struct linux_dirent64_plus_lite {
-+	struct stat64_lite    dp_stat_lite;
-+	int                   dp_stat_lite_err;
-+	struct linux_dirent64 dp_dirent;
-+};
-+
- #endif
- 
- #endif
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-i386/unistd.h vanilla-new/include/asm-i386/unistd.h
---- vanilla/include/asm-i386/unistd.h	2006-08-29 17:56:17.000000000 -0500
-+++ vanilla-new/include/asm-i386/unistd.h	2006-09-04 05:04:09.000000000 -0500
-@@ -328,8 +328,10 @@
- #define __NR_getdents64_plus 320
- #define __NR_readx      321
- #define __NR_writex     322
-+#define __NR_getdents_plus_lite 323
-+#define __NR_getdents64_plus_lite 324
- 
--#define NR_syscalls 323
-+#define NR_syscalls 325
- 
- /*
-  * user-visible error numbers are in the range -1 - -128: see
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/dirent.h vanilla-new/include/asm-x86_64/dirent.h
---- vanilla/include/asm-x86_64/dirent.h	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/include/asm-x86_64/dirent.h	2006-09-04 04:57:56.000000000 -0500
-@@ -9,12 +9,24 @@
- 	struct dirent dp_dirent;
- };
- 
-+struct dirent_plus_lite {
-+	struct stat_lite dp_stat_lite;
-+	int              dp_stat_lite_err;
-+	struct dirent    dp_dirent;
-+};
-+
- struct dirent64_plus {
- 	struct stat     dp_stat;
- 	int             dp_stat_err;
- 	struct dirent64 dp_dirent;
- };
- 
-+struct dirent64_plus_lite {
-+	struct stat_lite dp_stat_lite;
-+	int              dp_stat_lite_err;
-+	struct dirent64  dp_dirent;
-+};
-+
- #ifdef __KERNEL__
- 
- struct linux_dirent64_plus {
-@@ -23,6 +35,12 @@
- 	struct linux_dirent64 dp_dirent;
- };
- 
-+struct linux_dirent64_plus_lite {
-+	struct stat_lite      dp_stat_lite;
-+	int                   dp_stat_lite_err;
-+	struct linux_dirent64 dp_dirent;
-+};
-+
- #endif
- 
- #endif
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/unistd.h vanilla-new/include/asm-x86_64/unistd.h
---- vanilla/include/asm-x86_64/unistd.h	2006-08-29 17:56:17.000000000 -0500
-+++ vanilla-new/include/asm-x86_64/unistd.h	2006-09-04 05:04:44.000000000 -0500
-@@ -623,8 +623,12 @@
- __SYSCALL(__NR_readx, sys_readx)
- #define __NR_writex 281
- __SYSCALL(__NR_writex, sys_writex)
-+#define __NR_getdents_plus_lite 282
-+__SYSCALL(__NR_getdents_plus_lite, sys_getdents_plus_lite)
-+#define __NR_getdents64_plus_lite 283
-+__SYSCALL(__NR_getdents64_plus_lite, sys_getdents64_plus_lite)
- 
--#define __NR_syscall_max __NR_writex
-+#define __NR_syscall_max __NR_getdents64_plus_lite
- 
- #ifndef __NO_STUBS
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/fs.h vanilla-new/include/linux/fs.h
---- vanilla/include/linux/fs.h	2006-08-29 17:56:17.000000000 -0500
-+++ vanilla-new/include/linux/fs.h	2006-09-04 04:55:48.000000000 -0500
-@@ -957,6 +957,13 @@
-  */
- typedef int (*filldirplus_t)(void *, const char *, int, loff_t, ino_t, unsigned, struct kstat *);
- 
-+/* 
-+ * This is the "filldirplus_lite function type, used by readdirplus_lite() to let
-+ * the kernel specify the kind of dirent layout and the stat_lite information
-+ * all in one shot
-+ */
-+typedef int (*filldirpluslite_t)(void *, const char *, int, loff_t, ino_t, unsigned, struct kstat_lite *);
-+
- struct block_device_operations {
- 	int (*open) (struct inode *, struct file *);
- 	int (*release) (struct inode *, struct file *);
-@@ -1032,6 +1039,7 @@
- 	ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t, loff_t);
- 	int (*readdir) (struct file *, void *, filldir_t);
- 	int (*readdirplus) (struct file *, void *, filldirplus_t);
-+	int (*readdirplus_lite) (struct file *, unsigned long, void *, filldirpluslite_t);
- 	unsigned int (*poll) (struct file *, struct poll_table_struct *);
- 	int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
- 	long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
-@@ -1728,6 +1736,7 @@
- 
- extern int vfs_readdir(struct file *, filldir_t, void *);
- extern int vfs_readdirplus(struct file *, filldirplus_t, void *);
-+extern int vfs_readdirplus_lite(struct file *file, unsigned long, filldirpluslite_t fillerpluslite, void *buf);
- extern int cp_new_stat(struct kstat *stat, struct stat __user *statbuf);
- extern int cp_new_statlite(struct kstat_lite *stat_lite, struct stat_lite __user *statlitebuf);
- #ifdef __ARCH_WANT_STAT64
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/syscalls.h vanilla-new/include/linux/syscalls.h
---- vanilla/include/linux/syscalls.h	2006-08-29 17:56:17.000000000 -0500
-+++ vanilla-new/include/linux/syscalls.h	2006-09-04 05:00:20.000000000 -0500
-@@ -25,6 +25,8 @@
- struct linux_dirent64;
- struct linux_dirent_plus;
- struct linux_dirent64_plus;
-+struct linux_dirent_plus_lite;
-+struct linux_dirent64_plus_lite;
- struct list_head;
- struct msgbuf;
- struct msghdr;
-@@ -434,9 +436,15 @@
- asmlinkage long sys_getdents_plus(unsigned int fd,
- 				struct linux_dirent_plus __user *dirent,
- 				unsigned int count);
-+asmlinkage long sys_getdents_plus_lite(unsigned int fd, unsigned long lite_mask,
-+				struct linux_dirent_plus_lite __user *dirent,
-+				unsigned int count);
- asmlinkage long sys_getdents64_plus(unsigned int fd,
- 				struct linux_dirent64_plus __user *dirent,
- 				unsigned int count);
-+asmlinkage long sys_getdents64_plus_lite(unsigned int fd, unsigned long lite_mask,
-+				struct linux_dirent64_plus_lite __user *dirent,
-+				unsigned int count);
- 
- asmlinkage long sys_setsockopt(int fd, int level, int optname,
- 				char __user *optval, int optlen);

--- posix-direntplus.patch	2008-01-07 17:27:25.000000000 -0500
+++ /dev/null	2004-06-24 14:04:38.000000000 -0400
@@ -1,555 +0,0 @@
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/i386/kernel/syscall_table.S vanilla-new/arch/i386/kernel/syscall_table.S
---- vanilla/arch/i386/kernel/syscall_table.S	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/arch/i386/kernel/syscall_table.S	2006-05-11 14:03:04.000000000 -0500
-@@ -314,7 +314,9 @@
- 	.long sys_openfh
- 	.long sys_newstatlite
- 	.long sys_newlstatlite
--	.long sys_newfstatlite
-+	.long sys_newfstatlite /* 315 */
- 	.long sys_statlite64
- 	.long sys_lstatlite64
- 	.long sys_fstatlite64
-+	.long sys_getdents_plus
-+	.long sys_getdents64_plus /* 320 */
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/ia64/kernel/entry.S vanilla-new/arch/ia64/kernel/entry.S
---- vanilla/arch/ia64/kernel/entry.S	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/arch/ia64/kernel/entry.S	2006-05-11 14:10:30.000000000 -0500
-@@ -1624,5 +1624,7 @@
- 	data8 sys_newstatlite
- 	data8 sys_newlstatlite
- 	data8 sys_newfstatlite
-+	data8 sys_getdents_plus
-+	data8 sys_getdents64_plus
- 
- 	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/powerpc/kernel/systbl.S vanilla-new/arch/powerpc/kernel/systbl.S
---- vanilla/arch/powerpc/kernel/systbl.S	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/arch/powerpc/kernel/systbl.S	2006-05-11 14:12:20.000000000 -0500
-@@ -327,3 +327,5 @@
- SYSCALL(newstatlite)
- SYSCALL(newlstatlite)
- SYSCALL(newfstatlite)
-+SYSCALL(sys_getdents_plus)
-+SYSCALL(sys_getdents64_plus)
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/x86_64/ia32/ia32entry.S vanilla-new/arch/x86_64/ia32/ia32entry.S
---- vanilla/arch/x86_64/ia32/ia32entry.S	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/arch/x86_64/ia32/ia32entry.S	2006-05-11 14:09:30.000000000 -0500
-@@ -696,6 +696,8 @@
- 	.quad sys32_statlite64
- 	.quad sys32_lstatlite64
- 	.quad sys32_fstatlite64
-+	.quad sys_ni_syscall   /* getdents_plus */
-+	.quad sys_ni_syscall   /* getdents64_plus */
- ia32_syscall_end:		
- 	.rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8
- 		.quad ni_syscall
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/readdir.c vanilla-new/fs/readdir.c
---- vanilla/fs/readdir.c	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/fs/readdir.c	2006-05-18 19:25:06.000000000 -0500
-@@ -43,6 +43,32 @@
- 
- EXPORT_SYMBOL(vfs_readdir);
- 
-+int vfs_readdirplus(struct file *file, filldirplus_t fillerplus, void *buf)
-+{
-+	struct inode *inode = file->f_dentry->d_inode;
-+	int res = -ENOTDIR;
-+	if (!file->f_op || !file->f_op->readdirplus)
-+		goto out;
-+
-+	res = security_file_permission(file, MAY_READ);
-+	if (res)
-+		goto out;
-+
-+	mutex_lock(&inode->i_mutex);
-+	res = -ENOENT;
-+	if (!IS_DEADDIR(inode)) {
-+		res = file->f_op->readdirplus(file, buf, fillerplus);
-+		file_accessed(file);
-+	}
-+	mutex_unlock(&inode->i_mutex);
-+out:
-+	if (file->f_op && file->f_op->readdir && !file->f_op->readdirplus)
-+		res = -EOPNOTSUPP;
-+	return res;
-+}
-+
-+EXPORT_SYMBOL_GPL(vfs_readdirplus);
-+
- /*
-  * Traditional linux readdir() handling..
-  *
-@@ -212,6 +238,111 @@
- 	return error;
- }
- 
-+/* getdents_plus implementation */
-+#define DIRENT_OFFSET(de) ((unsigned long) &((de)->dp_dirent) - (unsigned long) (char __user *) (de))
-+
-+struct linux_dirent_plus {
-+	struct stat          dp_stat;
-+	int                  dp_stat_err;
-+	struct linux_dirent  dp_dirent;
-+};
-+
-+struct getdentsplus_callback {
-+	struct linux_dirent_plus __user * current_dir;
-+	struct linux_dirent_plus __user * previous;
-+	int count;
-+	int error;
-+};
-+
-+static int filldirplus(void * __buf, const char * name, int namlen, loff_t offset,
-+		   ino_t ino, unsigned int d_type, struct kstat *statp)
-+{
-+	struct linux_dirent __user *de;
-+	struct linux_dirent_plus __user * dirent;
-+	struct getdentsplus_callback * buf = (struct getdentsplus_callback *) __buf;
-+	int err, reclen = ROUND_UP(NAME_OFFSET(de) + namlen + DIRENT_OFFSET(dirent) + 2);
-+
-+	buf->error = -EINVAL;	/* only used if we fail.. */
-+	if (reclen > buf->count)
-+		return -EINVAL;
-+	dirent = buf->previous;
-+	if (dirent) {
-+		if (__put_user(offset, &dirent->dp_dirent.d_off))
-+			goto efault;
-+	}
-+	dirent = buf->current_dir;
-+	err = 0;
-+	if (IS_ERR(statp)) {
-+		err = PTR_ERR(statp);
-+		if (__put_user(err, &dirent->dp_stat_err))
-+			goto efault;
-+	}
-+	else {
-+		if (__put_user(err, &dirent->dp_stat_err))
-+			goto efault;
-+		if (cp_new_stat(statp, &dirent->dp_stat))
-+			goto efault;
-+	}
-+	if (__put_user(ino, &dirent->dp_dirent.d_ino))
-+		goto efault;
-+	if (__put_user(reclen, &dirent->dp_dirent.d_reclen))
-+		goto efault;
-+	if (copy_to_user(dirent->dp_dirent.d_name, name, namlen))
-+		goto efault;
-+	if (__put_user(0, dirent->dp_dirent.d_name + namlen))
-+		goto efault;
-+	if (__put_user(d_type, (char __user *) dirent + reclen - 1))
-+		goto efault;
-+	buf->previous = dirent;
-+	dirent = (void __user *)dirent + reclen;
-+	buf->current_dir = dirent;
-+	buf->count -= reclen;
-+	return 0;
-+efault:
-+	buf->error = -EFAULT;
-+	return -EFAULT;
-+}
-+
-+asmlinkage long sys_getdents_plus(unsigned int fd, struct linux_dirent_plus __user * dirent, unsigned int count)
-+{
-+	struct file * file;
-+	struct linux_dirent_plus __user * lastdirent;
-+	struct getdentsplus_callback buf;
-+	int error;
-+
-+	error = -EFAULT;
-+	if (!access_ok(VERIFY_WRITE, dirent, count))
-+		goto out;
-+
-+	error = -EBADF;
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	buf.current_dir = dirent;
-+	buf.previous = NULL;
-+	buf.count = count;
-+	buf.error = 0;
-+
-+	error = vfs_readdirplus(file, filldirplus, &buf);
-+	if (error < 0)
-+		goto out_putf;
-+	error = buf.error;
-+	lastdirent = buf.previous;
-+	if (lastdirent) {
-+		typeof(lastdirent->dp_dirent.d_off) d_off = file->f_pos;
-+		error = -EFAULT;
-+		if (__put_user(d_off, &lastdirent->dp_dirent.d_off))
-+			goto out_putf;
-+		error = count - buf.count;
-+	}
-+
-+out_putf:
-+	fput(file);
-+out:
-+	return error;
-+}
-+
- #define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1))
- 
- struct getdents_callback64 {
-@@ -298,3 +429,105 @@
- out:
- 	return error;
- }
-+
-+struct getdentsplus_callback64 {
-+	struct linux_dirent64_plus __user * current_dir;
-+	struct linux_dirent64_plus __user * previous;
-+	int count;
-+	int error;
-+};
-+
-+static int filldir64_plus(void * __buf, const char * name, int namlen, loff_t offset,
-+		     ino_t ino, unsigned int d_type, struct kstat *statp)
-+{
-+	struct linux_dirent64 __user *de;
-+	struct linux_dirent64_plus __user *dirent;
-+	struct getdentsplus_callback64 * buf = (struct getdentsplus_callback64 *) __buf;
-+	int err, reclen = ROUND_UP64(NAME_OFFSET(de) + namlen + 1 + DIRENT_OFFSET(dirent));
-+
-+	buf->error = -EINVAL;	/* only used if we fail.. */
-+	if (reclen > buf->count)
-+		return -EINVAL;
-+	dirent = buf->previous;
-+	if (dirent) {
-+		if (__put_user(offset, &dirent->dp_dirent.d_off))
-+			goto efault;
-+	}
-+	dirent = buf->current_dir;
-+	err = 0;
-+	if (IS_ERR(statp)) {
-+		err = PTR_ERR(statp);
-+		if (__put_user(err, &dirent->dp_stat_err))
-+			goto efault;
-+	}
-+	else {
-+		if (__put_user(err, &dirent->dp_stat_err))
-+			goto efault;
-+#ifdef __ARCH_WANT_STAT64
-+		if (cp_new_stat64(statp, &dirent->dp_stat))
-+#else
-+		if (cp_new_stat(statp, &dirent->dp_stat))
-+#endif
-+			goto efault;
-+	}
-+	if (__put_user(ino, &dirent->dp_dirent.d_ino))
-+		goto efault;
-+	if (__put_user(0, &dirent->dp_dirent.d_off))
-+		goto efault;
-+	if (__put_user(reclen, &dirent->dp_dirent.d_reclen))
-+		goto efault;
-+	if (__put_user(d_type, &dirent->dp_dirent.d_type))
-+		goto efault;
-+	if (copy_to_user(dirent->dp_dirent.d_name, name, namlen))
-+		goto efault;
-+	if (__put_user(0, dirent->dp_dirent.d_name + namlen))
-+		goto efault;
-+	buf->previous = dirent;
-+	dirent = (void __user *)dirent + reclen;
-+	buf->current_dir = dirent;
-+	buf->count -= reclen;
-+	return 0;
-+efault:
-+	buf->error = -EFAULT;
-+	return -EFAULT;
-+}
-+
-+asmlinkage long sys_getdents64_plus(unsigned int fd, struct linux_dirent64_plus __user * dirent, unsigned int count)
-+{
-+	struct file * file;
-+	struct linux_dirent64_plus __user * lastdirent;
-+	struct getdentsplus_callback64 buf;
-+	int error;
-+
-+	error = -EFAULT;
-+	if (!access_ok(VERIFY_WRITE, dirent, count))
-+		goto out;
-+
-+	error = -EBADF;
-+	file = fget(fd);
-+	if (!file)
-+		goto out;
-+
-+	buf.current_dir = dirent;
-+	buf.previous = NULL;
-+	buf.count = count;
-+	buf.error = 0;
-+
-+	error = vfs_readdirplus(file, filldir64_plus, &buf);
-+	if (error < 0)
-+		goto out_putf;
-+	error = buf.error;
-+	lastdirent = buf.previous;
-+	if (lastdirent) {
-+		typeof(lastdirent->dp_dirent.d_off) d_off = file->f_pos;
-+		error = -EFAULT;
-+		if (__put_user(d_off, &lastdirent->dp_dirent.d_off))
-+			goto out_putf;
-+		error = count - buf.count;
-+	}
-+
-+out_putf:
-+	fput(file);
-+out:
-+	return error;
-+}
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/stat.c vanilla-new/fs/stat.c
---- vanilla/fs/stat.c	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/fs/stat.c	2006-05-11 13:35:08.000000000 -0500
-@@ -297,7 +297,7 @@
- 
- #endif /* __ARCH_WANT_OLD_STAT */
- 
--static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf)
-+int cp_new_stat(struct kstat *stat, struct stat __user *statbuf)
- {
- 	struct stat tmp;
- 
-@@ -345,7 +345,7 @@
- 	return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
- }
- 
--static int cp_new_statlite(struct kstat_lite *stat_lite, struct stat_lite __user *statlitebuf)
-+int cp_new_statlite(struct kstat_lite *stat_lite, struct stat_lite __user *statlitebuf)
- {
- 	struct stat_lite tmp;
- 
-@@ -545,7 +545,7 @@
- /* ---------- LFS-64 ----------- */
- #ifdef __ARCH_WANT_STAT64
- 
--static long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf)
-+long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf)
- {
- 	struct stat64 tmp;
- 
-@@ -580,7 +580,7 @@
- 	return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
- }
- 
--static long cp_new_stat64_lite(struct kstat_lite *stat_lite, struct stat64_lite __user *statlitebuf)
-+long cp_new_stat64_lite(struct kstat_lite *stat_lite, struct stat64_lite __user *statlitebuf)
- {
- 	struct stat64_lite tmp;
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-i386/dirent.h vanilla-new/include/asm-i386/dirent.h
---- vanilla/include/asm-i386/dirent.h	1969-12-31 18:00:00.000000000 -0600
-+++ vanilla-new/include/asm-i386/dirent.h	2006-05-18 19:25:26.000000000 -0500
-@@ -0,0 +1,28 @@
-+#ifndef _I386_DIRENT_H
-+#define _I386_DIRENT_H
-+
-+#include <asm/stat.h>
-+
-+struct dirent_plus {
-+	struct stat   dp_stat;
-+	int           dp_stat_err;
-+	struct dirent dp_dirent;
-+};
-+
-+struct dirent64_plus {
-+	struct stat64   dp_stat;
-+	int             dp_stat_err;
-+	struct dirent64 dp_dirent;
-+};
-+
-+#ifdef __KERNEL__
-+
-+struct linux_dirent64_plus {
-+	struct stat64         dp_stat;
-+	int                   dp_stat_err;
-+	struct linux_dirent64 dp_dirent;
-+};
-+
-+#endif
-+
-+#endif
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-i386/unistd.h vanilla-new/include/asm-i386/unistd.h
---- vanilla/include/asm-i386/unistd.h	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/include/asm-i386/unistd.h	2006-05-11 14:00:29.000000000 -0500
-@@ -324,8 +324,10 @@
- #define __NR_statlite64  316
- #define __NR_lstatlite64 317
- #define __NR_fstatlite64 318
-+#define __NR_getdents_plus 319
-+#define __NR_getdents64_plus 320
- 
--#define NR_syscalls 319
-+#define NR_syscalls 321
- 
- /*
-  * user-visible error numbers are in the range -1 - -128: see
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-ia64/unistd.h vanilla-new/include/asm-ia64/unistd.h
---- vanilla/include/asm-ia64/unistd.h	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/include/asm-ia64/unistd.h	2006-05-11 14:05:50.000000000 -0500
-@@ -290,12 +290,14 @@
- #define __NR_statlite      1299
- #define __NR_lstatlite     1300
- #define __NR_fstatlite     1301
-+#define __NR_getdents_plus 1302
-+#define __NR_getdents64_plus 1303
- 
- #ifdef __KERNEL__
- 
- #include <linux/config.h>
- 
--#define NR_syscalls			278 /* length of syscall table */
-+#define NR_syscalls			280 /* length of syscall table */
- 
- #define __ARCH_WANT_SYS_RT_SIGACTION
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-powerpc/unistd.h vanilla-new/include/asm-powerpc/unistd.h
---- vanilla/include/asm-powerpc/unistd.h	2006-05-05 13:59:14.000000000 -0500
-+++ vanilla-new/include/asm-powerpc/unistd.h	2006-05-11 14:14:28.000000000 -0500
-@@ -303,8 +303,13 @@
- #define __NR_unshare		282
- #define __NR_openg		283
- #define __NR_openfh		284
-+#define __NR_statlite      285
-+#define __NR_lstatlite     286
-+#define __NR_fstatlite     287
-+#define __NR_getdents_plus 288
-+#define __NR_getdents64_plus 289
- 
--#define __NR_syscalls		285
-+#define __NR_syscalls		290
- 
- #ifdef __KERNEL__
- #define __NR__exit __NR_exit
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/dirent.h vanilla-new/include/asm-x86_64/dirent.h
---- vanilla/include/asm-x86_64/dirent.h	1969-12-31 18:00:00.000000000 -0600
-+++ vanilla-new/include/asm-x86_64/dirent.h	2006-05-18 19:25:47.000000000 -0500
-@@ -0,0 +1,28 @@
-+#ifndef _ASM_X86_64_DIRENT_H
-+#define _ASM_X86_64_DIRENT_H
-+
-+#include <asm/stat.h>
-+
-+struct dirent_plus {
-+	struct stat   dp_stat;
-+	int           dp_stat_err;
-+	struct dirent dp_dirent;
-+};
-+
-+struct dirent64_plus {
-+	struct stat     dp_stat;
-+	int             dp_stat_err;
-+	struct dirent64 dp_dirent;
-+};
-+
-+#ifdef __KERNEL__
-+
-+struct linux_dirent64_plus {
-+	struct stat           dp_stat;
-+	int                   dp_stat_err;
-+	struct linux_dirent64 dp_dirent;
-+};
-+
-+#endif
-+
-+#endif
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/unistd.h vanilla-new/include/asm-x86_64/unistd.h
---- vanilla/include/asm-x86_64/unistd.h	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/include/asm-x86_64/unistd.h	2006-05-11 14:04:27.000000000 -0500
-@@ -615,8 +615,12 @@
- __SYSCALL(__NR_newlstatlite, sys_newlstatlite)
- #define __NR_newfstatlite  277
- __SYSCALL(__NR_newfstatlite, sys_newfstatlite)
-+#define __NR_getdents_plus 278
-+__SYSCALL(__NR_getdents_plus, sys_getdents_plus)
-+#define __NR_getdents64_plus 279
-+__SYSCALL(__NR_getdents64_plus, sys_getdents64_plus)
- 
--#define __NR_syscall_max __NR_newfstatlite
-+#define __NR_syscall_max __NR_getdents64_plus
- 
- #ifndef __NO_STUBS
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/dirent.h vanilla-new/include/linux/dirent.h
---- vanilla/include/linux/dirent.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/linux/dirent.h	2006-05-18 19:29:03.000000000 -0500
-@@ -28,5 +28,6 @@
- 
- #endif	/* __KERNEL__ */
- 
-+#include <asm/dirent.h>
- 
- #endif
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/fs.h vanilla-new/include/linux/fs.h
---- vanilla/include/linux/fs.h	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/include/linux/fs.h	2006-05-18 19:28:16.000000000 -0500
-@@ -9,6 +9,7 @@
- #include <linux/config.h>
- #include <linux/limits.h>
- #include <linux/ioctl.h>
-+#include <linux/unistd.h>
- 
- /*
-  * It's silly to have NR_OPEN bigger than NR_FILE, but you can change
-@@ -951,6 +952,13 @@
-  */
- typedef int (*filldir_t)(void *, const char *, int, loff_t, ino_t, unsigned);
- 
-+/*
-+ * This is the "filldirplus" function type, used by readdirplus() to let
-+ * the kernel specify the kind of dirent layout and the stat information
-+ * all in one shot
-+ */
-+typedef int (*filldirplus_t)(void *, const char *, int, loff_t, ino_t, unsigned, struct kstat *);
-+
- struct block_device_operations {
- 	int (*open) (struct inode *, struct file *);
- 	int (*release) (struct inode *, struct file *);
-@@ -1025,6 +1033,7 @@
- 	ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
- 	ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t, loff_t);
- 	int (*readdir) (struct file *, void *, filldir_t);
-+	int (*readdirplus) (struct file *, void *, filldirplus_t);
- 	unsigned int (*poll) (struct file *, struct poll_table_struct *);
- 	int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
- 	long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
-@@ -1712,7 +1721,13 @@
- void inode_set_bytes(struct inode *inode, loff_t bytes);
- 
- extern int vfs_readdir(struct file *, filldir_t, void *);
--
-+extern int vfs_readdirplus(struct file *, filldirplus_t, void *);
-+extern int cp_new_stat(struct kstat *stat, struct stat __user *statbuf);
-+extern int cp_new_statlite(struct kstat_lite *stat_lite, struct stat_lite __user *statlitebuf);
-+#ifdef __ARCH_WANT_STAT64
-+extern long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf);
-+extern long cp_new_stat64_lite(struct kstat_lite *stat_lite, struct stat64_lite __user *statlitebuf);
-+#endif
- extern int vfs_stat(char __user *, struct kstat *);
- extern int vfs_statlite(char __user *, struct kstat_lite *);
- extern int vfs_lstat(char __user *, struct kstat *);
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/syscalls.h vanilla-new/include/linux/syscalls.h
---- vanilla/include/linux/syscalls.h	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/include/linux/syscalls.h	2006-05-11 14:01:51.000000000 -0500
-@@ -22,6 +22,8 @@
- struct kexec_segment;
- struct linux_dirent;
- struct linux_dirent64;
-+struct linux_dirent_plus;
-+struct linux_dirent64_plus;
- struct list_head;
- struct msgbuf;
- struct msghdr;
-@@ -418,6 +420,12 @@
- asmlinkage long sys_getdents64(unsigned int fd,
- 				struct linux_dirent64 __user *dirent,
- 				unsigned int count);
-+asmlinkage long sys_getdents_plus(unsigned int fd,
-+				struct linux_dirent_plus __user *dirent,
-+				unsigned int count);
-+asmlinkage long sys_getdents64_plus(unsigned int fd,
-+				struct linux_dirent64_plus __user *dirent,
-+				unsigned int count);
- 
- asmlinkage long sys_setsockopt(int fd, int level, int optname,
- 				char __user *optval, int optlen);

--- posix-extensions-cvs.patch	2008-01-07 17:27:25.000000000 -0500
+++ /dev/null	2004-06-24 14:04:38.000000000 -0400
@@ -1,1038 +0,0 @@
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/i386/kernel/syscall_table.S vanilla-new/arch/i386/kernel/syscall_table.S
---- vanilla/arch/i386/kernel/syscall_table.S	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/arch/i386/kernel/syscall_table.S	2006-04-07 10:28:39.000000000 -0500
-@@ -310,3 +310,5 @@
- 	.long sys_pselect6
- 	.long sys_ppoll
- 	.long sys_unshare		/* 310 */
-+	.long sys_openg
-+	.long sys_openfh
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/ia64/kernel/entry.S vanilla-new/arch/ia64/kernel/entry.S
---- vanilla/arch/ia64/kernel/entry.S	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/arch/ia64/kernel/entry.S	2006-04-07 10:28:39.000000000 -0500
-@@ -1619,5 +1619,7 @@
- 	data8 sys_ni_syscall			// reserved for pselect
- 	data8 sys_ni_syscall			// 1295 reserved for ppoll
- 	data8 sys_unshare
-+	data8 sys_openg
-+	data8 sys_openfh
- 
- 	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/powerpc/kernel/systbl.S vanilla-new/arch/powerpc/kernel/systbl.S
---- vanilla/arch/powerpc/kernel/systbl.S	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/arch/powerpc/kernel/systbl.S	2006-04-07 10:28:39.000000000 -0500
-@@ -322,3 +322,5 @@
- COMPAT_SYS(pselect6)
- COMPAT_SYS(ppoll)
- SYSCALL(unshare)
-+SYSCALL(openg)
-+SYSCALL(openfh)
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/x86_64/ia32/ia32entry.S vanilla-new/arch/x86_64/ia32/ia32entry.S
---- vanilla/arch/x86_64/ia32/ia32entry.S	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/arch/x86_64/ia32/ia32entry.S	2006-04-07 10:28:39.000000000 -0500
-@@ -688,6 +688,8 @@
- 	.quad sys_ni_syscall		/* pselect6 for now */
- 	.quad sys_ni_syscall		/* ppoll for now */
- 	.quad sys_unshare		/* 310 */
-+	.quad compat_sys_openg
-+	.quad compat_sys_openfh
- ia32_syscall_end:		
- 	.rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8
- 		.quad ni_syscall
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/compat.c vanilla-new/fs/compat.c
---- vanilla/fs/compat.c	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/fs/compat.c	2006-04-07 13:39:13.000000000 -0500
-@@ -1332,6 +1332,27 @@
- }
- 
- /*
-+ * Exactly like fs/open.c: sys_openg(), except that it doesn't set the 
-+ * O_LARGEFILE flag.
-+ */
-+asmlinkage long
-+compat_sys_openg(const char __user *pathname, void __user *uhandle, size_t __user *uhandle_len,
-+		int flags, int mode)
-+{
-+	return do_sys_openg(pathname, uhandle, uhandle_len, flags, mode);
-+}
-+
-+/*
-+ * Exactly like fs/open.c: sys_openg(), except that it doesn't set the 
-+ * O_LARGEFILE flag.
-+ */
-+asmlinkage long
-+compat_sys_openfh(const char __user *uhandle, int uhandle_len)
-+{
-+	return do_sys_openfh(uhandle, uhandle_len);
-+}
-+
-+/*
-  * compat_count() counts the number of arguments/envelopes. It is basically
-  * a copy of count() from fs/exec.c, except that it works with 32 bit argv
-  * and envp pointers.
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/open.c vanilla-new/fs/open.c
---- vanilla/fs/open.c	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/fs/open.c	2006-04-26 22:06:15.000000000 -0500
-@@ -27,9 +27,37 @@
- #include <linux/pagemap.h>
- #include <linux/syscalls.h>
- #include <linux/rcupdate.h>
-+#include <linux/scatterlist.h>
-+#include <linux/crypto.h>
-+#include <linux/types.h>
- 
- #include <asm/unistd.h>
- 
-+void get_filesystem(struct file_system_type *fs);
-+void put_filesystem(struct file_system_type *fs);
-+struct file_system_type *get_fs_type(const char *name);
-+
-+int vfs_statfs_lite(struct super_block *sb, struct kstatfs *buf, int statfs_mask)
-+{
-+	int retval = -ENODEV;
-+
-+	if (sb) {
-+		retval = -ENOSYS;
-+		if (sb->s_op->statfs_lite) {
-+			memset(buf, 0, sizeof(*buf));
-+			retval = security_sb_statfs(sb);
-+			if (retval)
-+				return retval;
-+			retval = sb->s_op->statfs_lite(sb, buf, statfs_mask);
-+			if (retval == 0 && buf->f_frsize == 0 && (statfs_mask & STATFS_M_FRSIZE) != 0)
-+				buf->f_frsize = buf->f_bsize;
-+		}
-+	}
-+	return retval;
-+}
-+
-+EXPORT_SYMBOL(vfs_statfs_lite);
-+
- int vfs_statfs(struct super_block *sb, struct kstatfs *buf)
- {
- 	int retval = -ENODEV;
-@@ -1100,6 +1128,638 @@
- }
- EXPORT_SYMBOL_GPL(sys_openat);
- 
-+static unsigned int diff(struct timeval *end, struct timeval *begin)
-+{
-+    if (end->tv_usec < begin->tv_usec) {
-+        end->tv_usec += 1000000; end->tv_sec--;
-+    }
-+    end->tv_sec  -= begin->tv_sec;
-+    end->tv_usec -= begin->tv_usec;
-+    return ((end->tv_sec * 1000000) + (end->tv_usec));
-+}
-+
-+/*
-+ * Compute a simple crc checksum
-+ */
-+static inline __u32 simple_crc_csum(struct file_handle *fhandle)
-+{
-+	struct file_handle_generic *fhg;
-+	__le32 *u;
-+	__u8 *c;
-+	__u32 i, j;
-+	
-+	fhg = &fhandle->fh_generic;
-+	/* upto and not including the fhg_crc_csum field */
-+	for (i = 0, u = (__le32 *) fhg; u < (__le32 *)(&fhg->fhg_crc_csum); ++u)
-+		i += le32_to_cpup(u);
-+	/* and over the entire fh_private buffer */
-+	c = (__u8 *) fhandle->fh_private;
-+	for (j = 0; j < fhandle->fh_private_length; ++j) 
-+		i += *(c + j);
-+	return i;
-+}
-+
-+/*
-+ * Compute and return a crc32c checksum using the crypto subsystem
-+ * API
-+ */
-+static __u32 compute_crc32_csum(struct file_handle *fhandle)
-+{
-+#define MAX_SG_LIST 8
-+	__u32 csum;
-+	__u32 i;
-+	struct crypto_tfm *tfm;
-+	struct scatterlist sg[MAX_SG_LIST];
-+	struct timeval begin, end;
-+
-+	do_gettimeofday(&begin);
-+	if (crypto_alg_available("crc32c", 0) == 0) {
-+		csum = simple_crc_csum(fhandle);
-+		do_gettimeofday(&end);
-+		printk(KERN_DEBUG "compute_crc32_csum[simple]: took %d usecs\n", diff(&end, &begin));
-+		goto out;
-+	}
-+
-+	tfm = crypto_alloc_tfm("crc32c", 0);
-+	if (tfm == NULL) {
-+		csum = simple_crc_csum(fhandle);
-+		goto out;
-+	}
-+
-+	crypto_digest_init(tfm);
-+
-+	i = 0;
-+	sg_set_buf(&sg[i++], &fhandle->fh_generic, 
-+			offsetof(struct file_handle_generic, fhg_crc_csum));
-+	sg_set_buf(&sg[i++], fhandle->fh_private, fhandle->fh_private_length);
-+
-+	crypto_digest_update(tfm, sg, i);
-+	crypto_digest_final(tfm, (__u8*)&csum);
-+	crypto_free_tfm(tfm);
-+	do_gettimeofday(&end);
-+	printk(KERN_DEBUG "compute_crc32_csum[tfm]: took %d usecs\n", diff(&end, &begin));
-+out:
-+	return csum;
-+#undef MAX_SG_LIST
-+}
-+
-+/* 
-+ * Store a crc32 check sum into the handle buffer
-+ * NOTE: We expect fhandle->fh_private and fhandle->fh_private_length
-+ * to be initialized prior to this call!
-+ */
-+static inline void store_crc32_csum(struct file_handle *fhandle)
-+{
-+	/* Compute the CRC checksum over the handle buffer */
-+	__u32 csum = compute_crc32_csum(fhandle);
-+	/* Set the CRC checksum into the handle buffer */
-+	set_fh_field(&fhandle->fh_generic, crc_csum, csum);
-+	return;
-+}
-+
-+/* 
-+ * Verifies if a file handle's structure's check sum
-+ * matches with what user-space indicates.
-+ * This should catch most of the simple buffer handle corruption
-+ * cases (but not the maliciously crafted ones!) for which
-+ * we have the keyed SHA1 (HMAC-SHA1) algorithm verification.
-+ * NOTE: We expect fhandle->fh_private and fhandle->fh_private_length
-+ * to be initialized prior to this call!
-+ * Returns 1 in case verification was successful and 0
-+ * otherwise.
-+ */
-+static inline int verify_crc32_csum(struct file_handle *fhandle)
-+{
-+	__u32 csum, crc_csum;
-+
-+	/* Compute the CRC checksum over the handle buffer */
-+	csum = compute_crc32_csum(fhandle);
-+	/* Retrieve the CRC checksum from the handle buffer */
-+	get_fh_field(&fhandle->fh_generic, crc_csum, crc_csum);
-+	return (crc_csum == csum);
-+}
-+
-+/* 
-+ * Compute a hmac-sha1 crypto check sum using a specified
-+ * key and store it in the buffer pointed to by result.
-+ * NOTE: We assume that fhandle->fh_private and
-+ * fhandle->fh_private_length are initialized prior to this call.
-+ * Returns 0 in case SHA1/HMAC-SHA1 was not built-in/compiled
-+ * for the kernel
-+ * Else returns length of the digest generated.
-+ */
-+static unsigned int compute_hmac_sha1_csum(struct file_handle *fhandle, 
-+		char *key, int keylen, char *result)
-+{
-+#define MAX_SG_LIST 8
-+	__u32 i;
-+	struct crypto_tfm *tfm;
-+	struct scatterlist sg[MAX_SG_LIST];
-+	unsigned int ret;
-+	struct timeval begin, end;
-+ 
-+	do_gettimeofday(&begin);
-+
-+	/* SHA1 is not available */
-+	if (crypto_alg_available("sha1", 0) == 0)
-+		return 0;
-+
-+	tfm = crypto_alloc_tfm("sha1", 0);
-+	if (tfm == NULL)
-+		return 0;
-+
-+	i = 0;
-+	sg_set_buf(&sg[i++], &fhandle->fh_generic, 
-+			offsetof(struct file_handle_generic, fhg_hmac_sha1));
-+	sg_set_buf(&sg[i++], fhandle->fh_private, fhandle->fh_private_length);
-+
-+	crypto_hmac(tfm, key, &keylen, sg, i, result);
-+	ret = crypto_tfm_alg_digestsize(tfm);
-+	crypto_free_tfm(tfm);
-+	do_gettimeofday(&end);
-+	printk(KERN_DEBUG "compute_hmac_sha1_csum: took %d usecs\n", diff(&end, &begin));
-+	return ret;
-+#undef MAX_SG_LIST
-+}
-+
-+/*
-+ * Store a hmac-sha1 crypto check sum into the handle
-+ * buffer.
-+ */
-+static inline void store_hmac_csum(struct file_handle *fhandle,
-+		char *key, int keylen)
-+{
-+	compute_hmac_sha1_csum(fhandle, key, keylen,
-+			fhandle->fh_generic.fhg_hmac_sha1);
-+	return;
-+}
-+
-+/*
-+ * Verifies if a file handle buffer's computed hmac-sha1 crypto
-+ * check sum matches with whatever the user-space buffer claims
-+ * Returns 1 in case verification was succesful and 0
-+ * otherwise
-+ */
-+static int verify_hmac_csum(struct file_handle *fhandle, char *key, int keylen)
-+{
-+	__u8 result[24];
-+	unsigned int result_len;
-+
-+	result_len = compute_hmac_sha1_csum(fhandle, key, keylen, result);
-+	/* Crypto is not supported. deny verification */
-+	if (result_len == 0) 
-+		return 0;
-+
-+	/* Check if user has tampered with the buffer */
-+	if (memcmp(fhandle->fh_generic.fhg_hmac_sha1, result, result_len) == 0)
-+		return 1;
-+	return 0;
-+}
-+
-+/*
-+ * Copy the constructed file handle to a user-specified buffer.
-+ * NOTE: We assume that fhandle->fh_private and
-+ * fhandle->fh_private_length have been initialized
-+ * prior to this routine
-+ */
-+static int copy_handle(const void __user *uaddr, struct file_handle *fhandle)
-+{
-+	char __user *ptr = (char __user *) uaddr;
-+	struct timeval begin, end;
-+ 
-+	do_gettimeofday(&begin);
-+
-+	/* Copy the VFS generic part of the handle */
-+	if (copy_to_user(ptr, &fhandle->fh_generic, 
-+				sizeof(struct file_handle_generic)))
-+		return -EFAULT;
-+
-+	/* Advance the user-buffer pointer */
-+	ptr += sizeof(struct file_handle_generic);
-+	/* Copy the FS specific part of the handle */
-+	if (copy_to_user(ptr, fhandle->fh_private, fhandle->fh_private_length))
-+		return -EFAULT;
-+	do_gettimeofday(&end);
-+	printk(KERN_DEBUG "copy_handle: took %d usecs\n", diff(&end, &begin));
-+	return 0;
-+}
-+
-+/*
-+ * Copy a user-specified handle buffer to a temporary
-+ * kernel buffer.
-+ */
-+static void* move_handle_to_kernel(const void __user *uaddr, 
-+		size_t ulen, void *kaddr)
-+{
-+	if (uaddr != NULL) {
-+		if (copy_from_user(kaddr, uaddr, ulen))
-+			return ERR_PTR(-EFAULT);
-+	}
-+	return kaddr;
-+}
-+
-+/*
-+ * Copy a specified size user-space handle buffer to a temporary
-+ * kernel buffer and return a pointer to the kernel buffer.
-+ * Encodes error in return pointer in case 
-+ * operation failed for some reason.
-+ */
-+static void *gethandle(const void __user *uhandle, size_t uhandle_len)
-+{
-+	void *tmp = NULL, *result = ERR_PTR(-EINVAL);
-+	struct timeval begin, end;
-+ 
-+	do_gettimeofday(&begin);
-+
-+	do {
-+		if (uhandle_len <= 0 || uhandle_len > MAX_HANDLE_LEN) 
-+			break;
-+		result = ERR_PTR(-ENOMEM);
-+		tmp = kmalloc(uhandle_len, GFP_KERNEL);
-+		if (tmp == NULL) 
-+			break;
-+		result = move_handle_to_kernel(uhandle, uhandle_len, tmp);
-+	} while (0);
-+	do_gettimeofday(&end);
-+	printk(KERN_DEBUG "gethandle: took %d usecs\n", diff(&end, &begin));
-+	return result;
-+}
-+/*
-+ * Frees memory allocated to a temporary kernel space buffer
-+ * used for staging the handle copy from user-space.
-+ */
-+static void puthandle(void *handle)
-+{
-+	if (handle)
-+		kfree(handle);
-+	return;
-+}
-+
-+/*
-+ * Wrapper routine to obtain any FS specific keys that can be used
-+ * for the HMAC-SHA1 calculation to make the handle returned
-+ * by openg() tamper-proof or atleast tamper-detectable.
-+ *	We dont use any keys in case FS does not provide one!
-+ */
-+static void get_fs_key(struct super_block *sb, char **ppkey, int *keylen)
-+{
-+	struct timeval begin, end;
-+
-+	*ppkey = NULL;
-+	*keylen = 0;
-+	do_gettimeofday(&begin);
-+	/* underlying fs wishes to provide a key */
-+	if (sb && sb->s_op && sb->s_op->get_fs_key)
-+		sb->s_op->get_fs_key(sb, ppkey, keylen);
-+	do_gettimeofday(&end);
-+	printk(KERN_DEBUG "get_fs_key: took %d usecs\n", diff(&end, &begin));
-+	return;
-+}
-+
-+/*
-+ * Free the memory allocated to fhandle->fh_private.
-+ * This is done by either calling the provided destructor
-+ * function if any (supplied by fill_handle callback of FS).
-+ * or by calling kfree(). We expect FS to either use kmalloc()
-+ * or supply a dtor function so that fh_private can be properly
-+ * deallocated.
-+ */
-+static void drop_file_handle_private(struct file_handle *fhandle)
-+{
-+	if (!fhandle || !fhandle->fh_private)
-+		return;
-+	if (fhandle->fh_private_dtor) 
-+		fhandle->fh_private_dtor(fhandle->fh_private);
-+	else 
-+		kfree(fhandle->fh_private);
-+	fhandle->fh_private = NULL;
-+	return;
-+}
-+
-+/*
-+ * Associate and establish a file handle to a struct file mapping.
-+ * NOTE: Linux VFS is inherently based off a dentry cache model
-+ * and since we dont have any pathnames/filenames we need to create a anon.
-+ * dentry to represent files opened using this system call.
-+ */
-+static struct file *do_fh_open(const void *handle, size_t handle_len)
-+{
-+	struct file *filp = NULL;
-+	struct super_block *sb;
-+	struct inode *inode = NULL;
-+	struct file_handle fhandle;
-+	size_t min_len = sizeof(struct file_handle_generic);
-+	char *key = NULL;
-+	int   keylen = 0;
-+	struct timeval begin, end;
-+	
-+	/* Do some sanity checks on the handle lengths and handle buffer */
-+	if (handle_len <= min_len)
-+		return ERR_PTR(-EINVAL);
-+
-+	memcpy(&fhandle.fh_generic, handle, min_len);
-+	/* set the fields of the file handle prior to verification */
-+	fhandle.fh_private = (char *) handle + min_len;
-+	fhandle.fh_private_length = (handle_len - min_len);
-+	fhandle.fh_private_dtor = NULL;
-+	/* verify crc32 checksum on the handle buffer */
-+	if (!verify_crc32_csum(&fhandle))
-+		return ERR_PTR(-EACCES);
-+
-+	/*
-+	 * Verification of HMAC SHA1 csum on the handle buffer cannot be 
-+	 * done at this point  since we don't know which file
-+	 * system/superblock it belongs to.
-+	 */
-+
-+	/* Locate and get an active reference to a 
-+	 * super-block that matches a given handle 
-+	 */
-+	do_gettimeofday(&begin);
-+	sb = get_sb_handle(&fhandle);
-+	/* could not find any valid FS that owns this handle */
-+	if (!sb)
-+		return ERR_PTR(-EINVAL);
-+
-+	do_gettimeofday(&end);
-+	printk(KERN_DEBUG "get_sb_handle: took %d usecs\n", diff(&end, &begin));
-+	/* FS has not implemented a routine to query inode based on handle */
-+	if (!sb->s_op || !sb->s_op->find_inode_handle) {
-+		filp = ERR_PTR(-EOPNOTSUPP);
-+		goto out;
-+	}
-+	/* Check if underlying FS wishes to use a key */
-+	get_fs_key(sb, &key, &keylen);
-+	/* and verify the authenticity of the handle buffer */
-+	if (verify_hmac_csum(&fhandle, key, keylen) == 0) {
-+		/* Permission denied */
-+		filp = ERR_PTR(-EACCES);
-+		goto out;
-+	}
-+	do_gettimeofday(&begin);
-+	/* find an inode or allocate/lookup an inode based on the handle */
-+	inode = sb->s_op->find_inode_handle(sb, &fhandle);
-+	if (!IS_ERR(inode)) {
-+		struct dentry *anon_dentry;
-+		int flags = 0;
-+
-+		do_gettimeofday(&end);
-+		printk(KERN_DEBUG "s_op->find_inode_handle: took %d usecs\n", diff(&end, &begin));
-+
-+		get_fh_field(&fhandle.fh_generic, flags, flags);
-+		/* 
-+		 * Associate a anonymous dentry to this inode in case there is none.
-+		 * d_prune_aliases() will take care of freeeing all these dentries
-+		 * which is called when the last reference to iput() calls
-+		 * put_inode() which in turn calls the above function.
-+		 */
-+		do_gettimeofday(&begin);
-+		anon_dentry = d_alloc_anon(inode);
-+		if (anon_dentry == NULL) {
-+			filp = ERR_PTR(-ENOMEM);
-+			goto drop_inode;
-+		}
-+		/* and setup file and inode mapping */
-+		filp = get_empty_filp();
-+		if (filp == NULL) {
-+			filp = ERR_PTR(-ENFILE);
-+			goto drop_dentry;
-+		}
-+		filp = __dentry_open(anon_dentry, NULL, flags, filp, NULL);
-+		if (IS_ERR(filp)) {
-+			/* in case of error __dentry_open drops the anon_dentry */
-+			goto drop_inode;
-+	drop_dentry:
-+			dput(anon_dentry);
-+	drop_inode:
-+			iput(inode);
-+		}
-+		else {
-+			do_gettimeofday(&end);
-+			printk(KERN_DEBUG "d_alloc_anon + misc.: took %d usecs\n", diff(&end, &begin));
-+		}
-+	}
-+	else {
-+		/* in case of error */
-+		filp = ERR_PTR(PTR_ERR(inode));
-+	}
-+out:
-+	/* drop our active reference to sb */
-+	drop_super(sb);
-+	return filp;
-+}
-+
-+long do_sys_openfh(const void __user *uhandle, size_t handle_len)
-+{
-+	void *tmp = gethandle(uhandle, handle_len);
-+	int fd = PTR_ERR(tmp);
-+
-+	if (!IS_ERR(tmp)) {
-+		struct timeval begin, end;
-+
-+		do_gettimeofday(&begin);
-+		fd = get_unused_fd();
-+		do_gettimeofday(&end);
-+		printk(KERN_DEBUG "get_unused_fd: took %d usecs\n", diff(&end, &begin));
-+		if (fd >= 0) {
-+			struct file *f;
-+
-+			do_gettimeofday(&begin);
-+			f = do_fh_open(tmp, handle_len);
-+			if (IS_ERR(f)) {
-+				put_unused_fd(fd);
-+				fd = PTR_ERR(f);
-+			} else {
-+				do_gettimeofday(&end);
-+				printk(KERN_DEBUG "do_fh_open: took %d usecs\n", diff(&end, &begin));
-+				do_gettimeofday(&begin);
-+				/* this file descriptor needs to be closed on exec */
-+				set_close_on_exec(fd, 1);
-+				fd_install(fd, f);
-+				do_gettimeofday(&end);
-+				printk(KERN_DEBUG "set_close, fd_install: took %d usecs\n", diff(&end, &begin));
-+			}
-+		}
-+		puthandle(tmp);
-+	}
-+	return fd;
-+}
-+
-+asmlinkage long sys_openfh(const void __user *uhandle, size_t handle_len)
-+{
-+	return do_sys_openfh(uhandle, handle_len);
-+}
-+
-+EXPORT_SYMBOL_GPL(sys_openfh);
-+
-+long do_sys_openg(const char __user *pathname, void __user *uhandle,
-+		size_t __user *uhandle_len, int flags, int mode)
-+{
-+	char *tmp = getname(pathname);
-+	long err = PTR_ERR(tmp);
-+
-+	if (!IS_ERR(tmp)) 
-+	{
-+		struct file *f = NULL;
-+		size_t handle_len = 0;
-+		size_t min_len = sizeof(struct file_handle_generic);
-+		struct file_handle fhandle;
-+		struct timeval begin, end;
-+
-+		memset(&fhandle, 0, sizeof(fhandle));
-+		if (get_user(handle_len, uhandle_len)) {
-+			err = -EFAULT;
-+			goto drop_name;
-+		}
-+		/* discard bogus values */
-+		if (handle_len < 0)
-+		{
-+			err = -EINVAL;
-+			goto drop_name;
-+		}
-+		/* or definitely insufficient buffer length */
-+		else if (handle_len > 0 && 
-+				handle_len < min_len)
-+		{
-+			err = -ERANGE;
-+			goto drop_name;
-+		}
-+		err = 0;
-+		do_gettimeofday(&begin);
-+		/* Try to open the file now */
-+		f = do_filp_open(AT_FDCWD, tmp, flags, mode);
-+		if (IS_ERR(f)) {
-+			/* File does not exist */
-+			err = PTR_ERR(f);
-+			goto drop_name;
-+		}
-+		else {
-+			/* Is this even possible? */
-+			if (!f->f_dentry || !f->f_dentry->d_inode)
-+			{
-+				err = -EINVAL;
-+				goto drop_filp;
-+			}
-+			/* Diallow anything but regular files */
-+			if (!S_ISREG(f->f_dentry->d_inode->i_mode)) {
-+				err = -EACCES;
-+				goto drop_filp;
-+			}
-+			else {
-+				/* Does FS define callback for openg? */
-+				if (!f->f_dentry->d_inode->i_op->fill_handle) {
-+					/* not supported */
-+					err = -EOPNOTSUPP;
-+					goto drop_filp;
-+				}
-+				else {
-+					do_gettimeofday(&end);
-+					printk(KERN_DEBUG "do_filp_open: took %d usecs\n", diff(&end, &begin));
-+					fhandle.fh_private = NULL;
-+					fhandle.fh_private_length = 
-+						handle_len ? (handle_len - min_len)	: 0;
-+					fhandle.fh_private_dtor = NULL;
-+					/* 
-+					 * if handle_len == 0, 
-+					 * FS is expected to give us the handle length it needs. 
-+					 */
-+					do_gettimeofday(&begin);
-+					err = f->f_dentry->d_inode->i_op->fill_handle(
-+								f->f_dentry->d_inode, &fhandle);
-+					if (err)
-+						goto drop_filp;
-+
-+					/* make sure that FS does not set it to an invalid length */
-+					if (fhandle.fh_private_length <= 0) {
-+						err = -EINVAL;
-+						goto drop_private;
-+					}
-+					
-+					/* try to copy the handle if requested */
-+					if (handle_len > 0) {
-+						__u32 magic, fsid;
-+						struct kstatfs st;
-+						char *key = NULL;
-+						int  keylen = 0, statfs_mask = STATFS_M_TYPE | STATFS_M_FSID;
-+						/*
-+						 * Check if fhandle.fh_private was not set.
-+						 */
-+						if (fhandle.fh_private == NULL) {
-+							err = -EINVAL;
-+							goto drop_filp;
-+						}
-+						do_gettimeofday(&end);
-+						printk(KERN_DEBUG "fill_handle: took %d usecs\n", diff(&end, &begin));
-+						/*
-+						 * Check if the underlying FS wishes to supply a key for 
-+						 * the message authentication code.
-+						 * If it does not or in case of errors, we use a NULL key
-+						 * for the MAC
-+						 */
-+						get_fs_key(f->f_dentry->d_inode->i_sb, &key, &keylen);
-+						/* 
-+						 * Currently, we issue a statfs on the superblock to figure
-+						 * out the magic number and fsid for the file system.
-+						 * But this might translate to many network messages for many
-+						 * distributed/parallel file systems. Therefore, we need a 
-+						 * sb->statfs_lite() callback mechanism to get only those
-+						 * fields that don't require a network message.
-+						 * If FS does not support the callback, fallback to using statfs.
-+						 */
-+						do_gettimeofday(&begin);
-+						if ((err = vfs_statfs_lite(f->f_dentry->d_inode->i_sb, &st, statfs_mask)) < 0) {
-+							//err = vfs_statfs(f->f_dentry->d_inode->i_sb, &st);
-+							//if (err) 
-+								goto drop_private;
-+						}
-+						do_gettimeofday(&end);
-+						printk(KERN_DEBUG "statfs_lite: took %d usecs\n", diff(&end, &begin));
-+						magic = st.f_type;
-+						memcpy(&fsid, &st.f_fsid, sizeof(__u32));
-+						/* set magic number, fsid, flags */
-+						set_fh_field(&fhandle.fh_generic, magic, magic);
-+						set_fh_field(&fhandle.fh_generic, fsid,  fsid);
-+						set_fh_field(&fhandle.fh_generic, flags, flags);
-+
-+						do_gettimeofday(&begin);
-+						/* Compute and store crc check sum */
-+						store_crc32_csum(&fhandle);
-+						/* Compute and store HMAC-SHA1 crypto check sum */
-+						store_hmac_csum(&fhandle, key, keylen);
-+						/* copy opaque handle to user buffer */
-+						err = copy_handle(uhandle, &fhandle);
-+						if (err)
-+							goto drop_private;
-+						do_gettimeofday(&end);
-+						printk(KERN_DEBUG "(crc, hmac, copy_handle): took %d usecs\n", diff(&end, &begin));
-+					}
-+					/* update the handle length reported to user-space */
-+					handle_len = fhandle.fh_private_length + min_len;
-+					/* and copy the new length to user space */
-+					err = put_user(handle_len, uhandle_len);
-+			drop_private:
-+					drop_file_handle_private(&fhandle);
-+				}
-+			}
-+drop_filp:
-+			filp_close(f, NULL);
-+		}
-+drop_name:
-+		putname(tmp);
-+	}
-+	return err;
-+}
-+
-+asmlinkage long sys_openg(const char __user *pathname, void __user *uhandle, 
-+		size_t __user *uhandle_len, int flags, int mode)
-+{
-+	if (force_o_largefile())
-+		flags |= O_LARGEFILE;
-+	return do_sys_openg(pathname, uhandle, uhandle_len, flags, mode);
-+}
-+
-+EXPORT_SYMBOL_GPL(sys_openg);
-+
- #ifndef __alpha__
- 
- /*
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/super.c vanilla-new/fs/super.c
---- vanilla/fs/super.c	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/fs/super.c	2006-04-26 22:06:36.000000000 -0500
-@@ -799,6 +799,58 @@
- 
- EXPORT_SYMBOL(get_sb_single);
- 
-+struct super_block *get_sb_handle(const struct file_handle *fhandle)
-+{
-+	/* walk through the list of superblocks */
-+	struct super_block *sb;
-+
-+	spin_lock(&sb_lock);
-+	list_for_each_entry (sb, &super_blocks, s_list) {
-+		struct kstatfs st;
-+
-+		sb->s_count++;
-+		spin_unlock(&sb_lock);
-+		down_read(&sb->s_umount);
-+		if (sb->s_root)
-+		{
-+			int err, statfs_mask = STATFS_M_TYPE | STATFS_M_FSID;
-+			/* 
-+			 * Currently, we issue a statfs on the superblock to figure
-+			 * out the type and fsid for the file system.
-+			 * But this might translate to network messages for many
-+			 * distributed/parallel file systems. Therefore, we need a 
-+			 * statfs_lite() callback mechanism to get only those
-+			 * fields that don't require a network message. We fall back to a
-+			 * regular statfs in case the file system does not support a statfs_lite()
-+			 * callback.
-+			 */
-+			if ((err = vfs_statfs_lite(sb, &st, statfs_mask)) < 0) {
-+				//err = vfs_statfs(sb, &st);
-+			}
-+			
-+			if (err == 0) {
-+				__u32 fsid, magic; 
-+
-+				get_fh_field(&fhandle->fh_generic, fsid, fsid);
-+				get_fh_field(&fhandle->fh_generic, magic, magic);
-+				/* check if magic numbers and fsid matches */
-+				if (st.f_type == magic
-+						&& memcmp(&st.f_fsid, &fsid, sizeof(__u32)) == 0)
-+				{
-+					return sb;
-+				}
-+			}
-+		}
-+		drop_super(sb);
-+		spin_lock(&sb_lock);
-+	}
-+	spin_unlock(&sb_lock);
-+	/* This function will not create a new superblock! */
-+	return NULL;
-+}
-+
-+EXPORT_SYMBOL_GPL(get_sb_handle);
-+
- struct vfsmount *
- do_kern_mount(const char *fstype, int flags, const char *name, void *data)
- {
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-i386/unistd.h vanilla-new/include/asm-i386/unistd.h
---- vanilla/include/asm-i386/unistd.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/asm-i386/unistd.h	2006-04-07 10:28:39.000000000 -0500
-@@ -316,8 +316,10 @@
- #define __NR_pselect6		308
- #define __NR_ppoll		309
- #define __NR_unshare		310
-+#define __NR_openg      311
-+#define __NR_openfh     312
- 
--#define NR_syscalls 311
-+#define NR_syscalls 313
- 
- /*
-  * user-visible error numbers are in the range -1 - -128: see
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-ia64/unistd.h vanilla-new/include/asm-ia64/unistd.h
---- vanilla/include/asm-ia64/unistd.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/asm-ia64/unistd.h	2006-04-07 10:28:39.000000000 -0500
-@@ -285,12 +285,14 @@
- #define __NR_faccessat			1293
- /* 1294, 1295 reserved for pselect/ppoll */
- #define __NR_unshare			1296
-+#define __NR_openg         1297
-+#define __NR_openfh        1298
- 
- #ifdef __KERNEL__
- 
- #include <linux/config.h>
- 
--#define NR_syscalls			273 /* length of syscall table */
-+#define NR_syscalls			275 /* length of syscall table */
- 
- #define __ARCH_WANT_SYS_RT_SIGACTION
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-powerpc/unistd.h vanilla-new/include/asm-powerpc/unistd.h
---- vanilla/include/asm-powerpc/unistd.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/asm-powerpc/unistd.h	2006-04-07 10:28:39.000000000 -0500
-@@ -301,8 +301,10 @@
- #define __NR_pselect6		280
- #define __NR_ppoll		281
- #define __NR_unshare		282
-+#define __NR_openg		283
-+#define __NR_openfh		284
- 
--#define __NR_syscalls		283
-+#define __NR_syscalls		285
- 
- #ifdef __KERNEL__
- #define __NR__exit __NR_exit
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/unistd.h vanilla-new/include/asm-x86_64/unistd.h
---- vanilla/include/asm-x86_64/unistd.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/asm-x86_64/unistd.h	2006-04-07 10:28:39.000000000 -0500
-@@ -605,8 +605,12 @@
- __SYSCALL(__NR_ppoll,	sys_ni_syscall)		/* for now */
- #define __NR_unshare		272
- __SYSCALL(__NR_unshare,	sys_unshare)
-+#define __NR_openg      273
-+__SYSCALL(__NR_openg,   sys_openg)
-+#define __NR_openfh     274
-+__SYSCALL(__NR_openfh,  sys_openfh)
- 
--#define __NR_syscall_max __NR_unshare
-+#define __NR_syscall_max __NR_openfh
- 
- #ifndef __NO_STUBS
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/fs.h vanilla-new/include/linux/fs.h
---- vanilla/include/linux/fs.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/linux/fs.h	2006-04-17 13:35:37.000000000 -0500
-@@ -991,6 +991,27 @@
- #define HAVE_COMPAT_IOCTL 1
- #define HAVE_UNLOCKED_IOCTL 1
- 
-+struct file_handle_generic {
-+	/* Filled by VFS */
-+	__le32   fhg_magic; /* magic number */
-+	__le32   fhg_fsid; /* file system identifier */
-+	__le32   fhg_flags; 	/* flags associated with the file object */
-+	__le32   fhg_crc_csum; /* crc32c check sum of the blob */
-+	__u8     fhg_hmac_sha1[24]; /* hmac-sha1 message authentication code */
-+};
-+
-+struct file_handle {
-+	/* generic part filled by VFS */
-+	struct file_handle_generic fh_generic;
-+	/* FS specific part */
-+	void                      *fh_private;
-+	size_t							fh_private_length;
-+	void                      (*fh_private_dtor)(void *);
-+};
-+
-+#define set_fh_field(X, Y, Z) (X)->fhg_##Y = cpu_to_le32(Z)
-+#define get_fh_field(X, Y, Z) Z = le32_to_cpu((X)->fhg_##Y)
-+
- /*
-  * NOTE:
-  * read, write, poll, fsync, readv, writev, unlocked_ioctl and compat_ioctl
-@@ -1049,6 +1070,8 @@
- 	ssize_t (*listxattr) (struct dentry *, char *, size_t);
- 	int (*removexattr) (struct dentry *, const char *);
- 	void (*truncate_range)(struct inode *, loff_t, loff_t);
-+	/* method needed for filling up handle */
-+	int (*fill_handle)(struct inode *, struct file_handle *);
- };
- 
- struct seq_file;
-@@ -1065,12 +1088,12 @@
-  * without the big kernel lock held in all filesystems.
-  */
- struct super_operations {
--   	struct inode *(*alloc_inode)(struct super_block *sb);
-+   struct inode *(*alloc_inode)(struct super_block *sb);
- 	void (*destroy_inode)(struct inode *);
- 
- 	void (*read_inode) (struct inode *);
-   
--   	void (*dirty_inode) (struct inode *);
-+  	void (*dirty_inode) (struct inode *);
- 	int (*write_inode) (struct inode *, int);
- 	void (*put_inode) (struct inode *);
- 	void (*drop_inode) (struct inode *);
-@@ -1081,6 +1104,7 @@
- 	void (*write_super_lockfs) (struct super_block *);
- 	void (*unlockfs) (struct super_block *);
- 	int (*statfs) (struct super_block *, struct kstatfs *);
-+	int (*statfs_lite) (struct super_block *, struct kstatfs *, int statfs_mask);
- 	int (*remount_fs) (struct super_block *, int *, char *);
- 	void (*clear_inode) (struct inode *);
- 	void (*umount_begin) (struct super_block *);
-@@ -1089,6 +1113,8 @@
- 
- 	ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t);
- 	ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t);
-+	struct inode *(*find_inode_handle)(struct super_block *, const struct file_handle *);
-+	void    (*get_fs_key)(struct super_block *, char **ppkey, int *keylen);
- };
- 
- /* Inode state bits.  Protected by inode_lock. */
-@@ -1257,6 +1283,7 @@
- struct super_block *get_sb_nodev(struct file_system_type *fs_type,
- 	int flags, void *data,
- 	int (*fill_super)(struct super_block *, void *, int));
-+struct super_block *get_sb_handle(const struct file_handle *handle);
- void generic_shutdown_super(struct super_block *sb);
- void kill_block_super(struct super_block *sb);
- void kill_anon_super(struct super_block *sb);
-@@ -1292,6 +1319,7 @@
- 				  struct vfsmount *);
- 
- extern int vfs_statfs(struct super_block *, struct kstatfs *);
-+extern int vfs_statfs_lite(struct super_block *, struct kstatfs *, int statfs_mask);
- 
- /* /sys/fs */
- extern struct subsystem fs_subsys;
-@@ -1345,6 +1373,10 @@
- 		       struct file *filp);
- extern long do_sys_open(int fdf, const char __user *filename, int flags,
- 			int mode);
-+
-+extern long do_sys_openfh(const void __user *uhandle, size_t handle_len);
-+extern long do_sys_openg(const char __user *pathname, void __user *uhandle, 
-+			size_t __user *uhandle_len, int flags, int mode);
- extern struct file *filp_open(const char *, int, int);
- extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
- extern int filp_close(struct file *, fl_owner_t id);
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/limits.h vanilla-new/include/linux/limits.h
---- vanilla/include/linux/limits.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/linux/limits.h	2006-04-07 17:25:07.000000000 -0500
-@@ -16,6 +16,7 @@
- #define XATTR_NAME_MAX   255	/* # chars in an extended attribute name */
- #define XATTR_SIZE_MAX 65536	/* size of an extended attribute value (64k) */
- #define XATTR_LIST_MAX 65536	/* size of extended attribute namelist (64k) */
-+#define MAX_HANDLE_LEN   128  /* maximum size of a handle used by the openfh system call */
- 
- #define RTSIG_MAX	  32
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/statfs.h vanilla-new/include/linux/statfs.h
---- vanilla/include/linux/statfs.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/linux/statfs.h	2006-04-17 11:38:07.000000000 -0500
-@@ -5,6 +5,18 @@
- 
- #include <asm/statfs.h>
- 
-+/* Masks used by statfs_lite callback */
-+#define STATFS_M_TYPE  		(1 << 0)
-+#define STATFS_M_BSIZE  	(1 << 1)
-+#define STATFS_M_BLOCKS		(1 << 2)
-+#define STATFS_M_BFREE  	(1 << 3)
-+#define STATFS_M_BAVAIL 	(1 << 4)
-+#define STATFS_M_FILES  	(1 << 5)
-+#define STATFS_M_FFREE  	(1 << 6)
-+#define STATFS_M_FSID   	(1 << 7)
-+#define STATFS_M_NAMELEN	(1 << 8)
-+#define STATFS_M_FRSIZE    (1 << 9)
-+
- struct kstatfs {
- 	long f_type;
- 	long f_bsize;
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/syscalls.h vanilla-new/include/linux/syscalls.h
---- vanilla/include/linux/syscalls.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/linux/syscalls.h	2006-04-07 13:56:07.000000000 -0500
-@@ -327,6 +327,10 @@
- asmlinkage long sys_creat(const char __user *pathname, int mode);
- asmlinkage long sys_open(const char __user *filename,
- 				int flags, int mode);
-+asmlinkage long sys_openfh(const void __user *uhandle, 
-+				size_t handle_len);
-+asmlinkage long sys_openg(const char __user *pathname, void __user *uhandle, 
-+				size_t *uhandle_len, int flags, int mode);
- asmlinkage long sys_close(unsigned int fd);
- asmlinkage long sys_access(const char __user *filename, int mode);
- asmlinkage long sys_vhangup(void);
-@@ -566,7 +570,10 @@
- asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user * filename,
- 				      struct compat_stat __user *statbuf,
- 				      int flag);
-+asmlinkage long compat_sys_open(const char __user *filename, int flags, int mode);
- asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename,
- 				   int flags, int mode);
--
-+asmlinkage long compat_sys_openg(const char __user *pathname, void __user *uhandle,
-+					size_t __user *uhandle_len, int flags, int mode);
-+asmlinkage long compat_sys_openfh(const void __user *uhandle, size_t uhandle_len);
- #endif

--- posix-readwritex.patch	2008-01-07 17:27:25.000000000 -0500
+++ /dev/null	2004-06-24 14:04:38.000000000 -0400
@@ -1,898 +0,0 @@
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/i386/kernel/syscall_table.S vanilla-new/arch/i386/kernel/syscall_table.S
---- vanilla/arch/i386/kernel/syscall_table.S	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/arch/i386/kernel/syscall_table.S	2006-05-24 16:31:20.000000000 -0500
-@@ -320,3 +320,5 @@
- 	.long sys_fstatlite64
- 	.long sys_getdents_plus
- 	.long sys_getdents64_plus /* 320 */
-+	.long sys_readx
-+	.long sys_writex
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/ia64/kernel/entry.S vanilla-new/arch/ia64/kernel/entry.S
---- vanilla/arch/ia64/kernel/entry.S	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/arch/ia64/kernel/entry.S	2006-05-24 16:32:28.000000000 -0500
-@@ -1626,5 +1626,7 @@
- 	data8 sys_newfstatlite
- 	data8 sys_getdents_plus
- 	data8 sys_getdents64_plus
-+	data8 sys_readx
-+	data8 sys_writex
- 
- 	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/powerpc/kernel/systbl.S vanilla-new/arch/powerpc/kernel/systbl.S
---- vanilla/arch/powerpc/kernel/systbl.S	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/arch/powerpc/kernel/systbl.S	2006-05-24 16:34:44.000000000 -0500
-@@ -329,3 +329,5 @@
- SYSCALL(newfstatlite)
- SYSCALL(sys_getdents_plus)
- SYSCALL(sys_getdents64_plus)
-+SYSCALL(sys_readx)
-+SYSCALL(sys_writex)
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/x86_64/ia32/ia32entry.S vanilla-new/arch/x86_64/ia32/ia32entry.S
---- vanilla/arch/x86_64/ia32/ia32entry.S	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/arch/x86_64/ia32/ia32entry.S	2006-05-24 16:32:01.000000000 -0500
-@@ -698,6 +698,8 @@
- 	.quad sys32_fstatlite64
- 	.quad sys_ni_syscall   /* getdents_plus */
- 	.quad sys_ni_syscall   /* getdents64_plus */
-+	.quad compat_sys_readx 
-+	.quad compat_sys_writex
- ia32_syscall_end:		
- 	.rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8
- 		.quad ni_syscall
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/compat.c vanilla-new/fs/compat.c
---- vanilla/fs/compat.c	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/fs/compat.c	2006-05-24 16:26:00.000000000 -0500
-@@ -1344,6 +1344,322 @@
- 	return ret;
- }
- 
-+static ssize_t compat_do_readx_writex(int type, struct file *file,
-+			       const struct compat_iovec __user * uvector,
-+			       unsigned long nr_segs, 
-+					 const struct compat_xtvec __user * xtuvector,
-+					 unsigned long xtnr_segs)
-+{
-+	typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *);
-+	typedef ssize_t (*iov_fn_t)(struct file *, const struct iovec *, unsigned long, loff_t *);
-+	typedef ssize_t (*iox_fn_t)(struct file *, const struct iovec *, unsigned long, 
-+			const struct xtvec *, unsigned long);
-+
-+	compat_ssize_t tot_len, tot_xtlen;
-+	struct iovec iovstack[UIO_FASTIOV];
-+	struct iovec *iov=iovstack;
-+	struct xtvec xtvstack[UIO_FASTIOV];
-+	struct xtvec *xtv=xtvstack;
-+	ssize_t ret;
-+	int seg;
-+	io_fn_t fn = NULL;
-+	iov_fn_t fnv = NULL;
-+	iox_fn_t fnx = NULL;
-+
-+	/*
-+	 * readx does not make much sense if nr_segs <= 0 (OR) xtnr_segs <= 0
-+	 * We return 0 similar to how readv/writev do.
-+	 */
-+	ret = 0;
-+	if (nr_segs == 0 || xtnr_segs == 0)
-+		goto out;
-+
-+	/*
-+	 * First get the "struct iovec" from user memory and
-+	 * verify all the pointers
-+	 */
-+	ret = -EINVAL;
-+	if ((nr_segs > UIO_MAXIOV) || (nr_segs <= 0))
-+		goto out;
-+	if ((xtnr_segs > UIO_MAXIOV) || (xtnr_segs <= 0))
-+		goto out;
-+	if (!file->f_op)
-+		goto out;
-+	if (nr_segs > UIO_FASTIOV) {
-+		ret = -ENOMEM;
-+		iov = kmalloc(nr_segs * sizeof(struct iovec), GFP_KERNEL);
-+		if (!iov)
-+			goto out;
-+	}
-+	if (xtnr_segs > UIO_FASTIOV) {
-+		ret = -ENOMEM;
-+		xtv = kmalloc(xtnr_segs * sizeof(struct xtvec), GFP_KERNEL);
-+		if (!xtv) {
-+			goto out;
-+		}
-+	}
-+	ret = -EFAULT;
-+	if (!access_ok(VERIFY_READ, uvector, nr_segs * sizeof(*uvector)))
-+		goto out;
-+	if (!access_ok(VERIFY_READ, xtuvector, xtnr_segs * sizeof(*xtuvector)))
-+		goto out;
-+
-+	/*
-+	 * Single unix specification:
-+	 * We should -EINVAL if an element length is not >= 0 and fitting an
-+	 * ssize_t.  The total length is fitting an ssize_t
-+	 *
-+	 * Be careful here because iov_len is a size_t not an ssize_t
-+	 */
-+	tot_len = 0;
-+	ret = -EINVAL;
-+	for (seg = 0; seg < nr_segs; seg++) {
-+		compat_ssize_t tmp = tot_len, len;
-+		compat_uptr_t buf;
-+
-+		if (__get_user(len, &uvector->iov_len) ||
-+				__get_user(buf, &uvector->iov_base)) {
-+			ret = -EFAULT;
-+			goto out;
-+		}
-+		if (len < 0)	/* size_t not fitting an compat_ssize_t .. */
-+			goto out;
-+		tot_len += len;
-+		if (tot_len < tmp) /* maths overflow on the compat_ssize_t */
-+			goto out;
-+		iov[seg].iov_base = compat_ptr(buf);
-+		iov[seg].iov_len  = (compat_size_t) len;
-+		uvector++;
-+	}
-+	if (tot_len == 0) {
-+		ret = 0;
-+		goto out;
-+	}
-+	tot_xtlen = 0;
-+	ret = -EINVAL;
-+	for (seg = 0; seg < xtnr_segs; seg++) {
-+		compat_ssize_t tmp = tot_xtlen, len;
-+		compat_off_t off;
-+		loff_t foff;
-+
-+		if (__get_user(off, &xtuvector->xtv_off) ||
-+				__get_user(len, &xtuvector->xtv_len)) {
-+			ret = -EFAULT;
-+			goto out;
-+		}
-+		if (len < 0)	/* size_t not fitting an compat_ssize_t .. */
-+			goto out;
-+		if (off < 0)   /* off_t not fitting an loff_t */
-+			goto out;
-+		tot_xtlen += len;
-+		if (tot_xtlen < tmp) /* overflow on the compat_ssize_t */
-+			goto out;
-+		foff = (loff_t) off;
-+		ret = rw_verify_area(type, file, &foff, len);
-+		if (ret < 0)
-+			goto out;
-+		xtv[seg].xtv_off = (compat_off_t) off;
-+		xtv[seg].xtv_len = (compat_size_t) len;
-+		xtuvector++;
-+	}
-+	/* if sizes of file and mem don't match up, error out */
-+	if (tot_xtlen != tot_len) {
-+		ret = -EINVAL;
-+		goto out;
-+	}
-+
-+	if (type == READ) {
-+		fn = (io_fn_t)file->f_op->read;
-+		fnv = (iov_fn_t)file->f_op->readv;
-+		fnx = (iox_fn_t)file->f_op->readx;
-+	} else {
-+		fn = (io_fn_t)file->f_op->write;
-+		fnv = (iov_fn_t)file->f_op->writev;
-+		fnx = (iox_fn_t)file->f_op->writex;
-+	}
-+	/* if we had a scatter-gather callback in memory and file, go for it */
-+	if (fnx) {
-+		ret = fnx(file, iov, nr_segs, xtv, xtnr_segs);
-+		goto out;
-+	}
-+	/* else try to do it by hand using readv/writev operations */
-+	else if (fnv) {
-+		unsigned long xtiov_index = 0, op_iov_index = 0, iov_index = 0;
-+		struct iovec *op_iov = NULL, *copied_iovector = NULL;
-+		struct xtvec *copied_xtvector = NULL;
-+
-+		ret = -ENOMEM;
-+		op_iov = (struct iovec *) kmalloc(nr_segs * sizeof(struct iovec), GFP_KERNEL);
-+		if (!op_iov) 
-+			goto err_out1;
-+		copied_iovector = (struct iovec *) kmalloc(nr_segs * sizeof(struct iovec), GFP_KERNEL);
-+		if (!copied_iovector) 
-+			goto err_out1;
-+		copied_xtvector = (struct xtvec *) kmalloc(xtnr_segs * sizeof(struct xtvec), GFP_KERNEL);
-+		if (!copied_xtvector)
-+			goto err_out1;
-+		memcpy(copied_iovector, iov, nr_segs * sizeof(struct iovec));
-+		memcpy(copied_xtvector, xtv, xtnr_segs * sizeof(struct xtvec));
-+		ret = 0;
-+		iov_index = 0;
-+		for (xtiov_index = 0; xtiov_index < xtnr_segs; xtiov_index++) {
-+			loff_t pos;
-+			ssize_t nr, tot_nr;
-+
-+			pos = copied_xtvector[xtiov_index].xtv_off;
-+			op_iov_index = 0;
-+			tot_nr = 0;
-+			
-+			/* Finish an entire stream and .. */
-+			while (copied_xtvector[xtiov_index].xtv_len > 0) {
-+				size_t min_len;
-+				if (unlikely((iov_index >= nr_segs) || (op_iov_index >= nr_segs))) {
-+					printk(KERN_ERR "iov_index %ld or op_iov_index %ld cannot exceed number of iov segments (%ld)\n",
-+							iov_index, op_iov_index, nr_segs);
-+					ret = -EINVAL;
-+					goto err_out1;
-+				}
-+				min_len = min(copied_xtvector[xtiov_index].xtv_len, copied_iovector[iov_index].iov_len);
-+				op_iov[op_iov_index].iov_base = copied_iovector[iov_index].iov_base;
-+				op_iov[op_iov_index++].iov_len = min_len;
-+				copied_xtvector[xtiov_index].xtv_len -= min_len;
-+				copied_iovector[iov_index].iov_len -= min_len;
-+				copied_iovector[iov_index].iov_base += min_len;
-+				tot_nr += min_len;
-+				/* Advance memory stream if we have exhausted it */
-+				if (copied_iovector[iov_index].iov_len <= 0) {
-+					iov_index++;
-+				}
-+			}
-+			/* .. issue a vectored operation for that region */
-+			nr = fnv(file, op_iov, op_iov_index, &pos);
-+			if (nr < 0) {
-+				if (!ret) ret = nr;
-+				break;
-+			}
-+			ret += nr;
-+			if (nr != tot_nr)
-+				break;
-+		}
-+err_out1:
-+		kfree(op_iov);
-+		kfree(copied_iovector);
-+		kfree(copied_xtvector);
-+		goto out;
-+	}
-+	/* Do it by hand, with plain read/write operations */
-+	else {
-+		unsigned long mem_ct = 0, str_ct = 0;
-+		struct xtvec *copied_xtvector = NULL;
-+		struct iovec *copied_iovector = NULL;
-+
-+		ret = -ENOMEM;
-+		copied_iovector = (struct iovec *) kmalloc(nr_segs * sizeof(struct iovec), GFP_KERNEL);
-+		if (!copied_iovector)
-+			goto err_out2;
-+		copied_xtvector = (struct xtvec *) kmalloc(xtnr_segs * sizeof(struct xtvec), GFP_KERNEL);
-+		if (!copied_xtvector)
-+			goto err_out2;
-+		memcpy(copied_iovector, iov, nr_segs * sizeof(struct iovec));
-+		memcpy(copied_xtvector, xtv, xtnr_segs * sizeof(struct xtvec));
-+
-+		ret = 0;
-+		mem_ct = 0;
-+		str_ct = 0;
-+		while ((mem_ct < nr_segs) && (str_ct < xtnr_segs)) {
-+			size_t min_len;
-+			loff_t pos;
-+			ssize_t nr;
-+			void __user *base;
-+
-+			pos = copied_xtvector[str_ct].xtv_off;
-+			base = copied_iovector[mem_ct].iov_base;
-+			min_len = min(copied_xtvector[str_ct].xtv_len, copied_iovector[mem_ct].iov_len);
-+			copied_xtvector[str_ct].xtv_len -= min_len;
-+			copied_xtvector[str_ct].xtv_off += min_len;
-+			copied_iovector[mem_ct].iov_len -= min_len;
-+			copied_iovector[mem_ct].iov_base += min_len;
-+			if (copied_iovector[mem_ct].iov_len <= 0)
-+				mem_ct++;
-+			if (copied_xtvector[str_ct].xtv_len <= 0)
-+				str_ct++;
-+			/* Issue the smallest region that is contiguous in memory and on file */
-+			nr = fn(file, base, min_len, &pos);
-+			if (nr < 0) {
-+				if (!ret) ret = nr;
-+				break;
-+			}
-+			ret += nr;
-+			if (nr != min_len)
-+				break;
-+		}
-+err_out2:
-+		kfree(copied_xtvector);
-+		kfree(copied_iovector);
-+	}
-+out:
-+	if (iov != iovstack)
-+		kfree(iov);
-+	if (xtv != xtvstack)
-+		kfree(xtv);
-+	if ((ret + (type == READ)) > 0) {
-+		if (type == READ)
-+			fsnotify_access(file->f_dentry);
-+		else
-+			fsnotify_modify(file->f_dentry);
-+	}
-+	return ret;
-+}
-+
-+asmlinkage ssize_t
-+compat_sys_readx(unsigned long fd, const struct compat_iovec __user *vec, unsigned long vlen,
-+		const struct compat_xtvec __user *xtv, unsigned long xtvlen)
-+{
-+	struct file *file;
-+	ssize_t ret = -EBADF;
-+
-+	file = fget(fd);
-+	if (!file)
-+		return -EBADF;
-+
-+	if (!(file->f_mode & FMODE_READ))
-+		goto out;
-+
-+	ret = -EINVAL;
-+	if (!file->f_op || (!file->f_op->readx && !file->f_op->readv && !file->f_op->read))
-+		goto out;
-+
-+	ret = compat_do_readx_writex(READ, file, vec, vlen, xtv, xtvlen);
-+
-+out:
-+	fput(file);
-+	return ret;
-+}
-+
-+asmlinkage ssize_t
-+compat_sys_writex(unsigned long fd, const struct compat_iovec __user *vec, unsigned long vlen,
-+		const struct compat_xtvec __user *xtv, unsigned long xtvlen)
-+{
-+	struct file *file;
-+	ssize_t ret = -EBADF;
-+
-+	file = fget(fd);
-+	if (!file)
-+		return -EBADF;
-+	if (!(file->f_mode & FMODE_WRITE))
-+		goto out;
-+
-+	ret = -EINVAL;
-+	if (!file->f_op || (!file->f_op->writex && !file->f_op->writev && !file->f_op->write))
-+		goto out;
-+
-+	ret = compat_do_readx_writex(WRITE, file, vec, vlen, xtv, xtvlen);
-+
-+out:
-+	fput(file);
-+	return ret;
-+}
-+
- /*
-  * Exactly like fs/open.c:sys_open(), except that it doesn't set the
-  * O_LARGEFILE flag.
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/read_write.c vanilla-new/fs/read_write.c
---- vanilla/fs/read_write.c	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/fs/read_write.c	2006-05-24 16:22:20.000000000 -0500
-@@ -374,6 +374,8 @@
- 	return ret;
- }
- 
-+EXPORT_SYMBOL_GPL(sys_write);
-+
- asmlinkage ssize_t sys_pread64(unsigned int fd, char __user *buf,
- 			     size_t count, loff_t pos)
- {
-@@ -636,6 +638,334 @@
- 	return ret;
- }
- 
-+static ssize_t do_readx_writex(int type, struct file *file,
-+			       const struct iovec __user * uvector,
-+			       unsigned long nr_segs, 
-+					 const struct xtvec __user * xtuvector,
-+					 unsigned long xtnr_segs)
-+{
-+	typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *);
-+	typedef ssize_t (*iov_fn_t)(struct file *, const struct iovec *, unsigned long, loff_t *);
-+	typedef ssize_t (*iox_fn_t)(struct file *, const struct iovec *, unsigned long, 
-+			const struct xtvec *, unsigned long);
-+
-+	size_t tot_len, tot_xtlen;
-+	struct iovec iovstack[UIO_FASTIOV];
-+	struct iovec *iov=iovstack;
-+	struct xtvec xtvstack[UIO_FASTIOV];
-+	struct xtvec *xtv=xtvstack;
-+	ssize_t ret;
-+	int seg;
-+	io_fn_t fn = NULL;
-+	iov_fn_t fnv = NULL;
-+	iox_fn_t fnx = NULL;
-+
-+	/*
-+	 * readx does not make much sense if nr_segs <= 0 (OR) xtnr_segs <= 0
-+	 * We return 0 similar to how readv/writev do.
-+	 */
-+	ret = 0;
-+	if (nr_segs == 0 || xtnr_segs == 0)
-+		goto out;
-+
-+	/*
-+	 * First get the "struct iovec" from user memory and
-+	 * verify all the pointers
-+	 */
-+	ret = -EINVAL;
-+	if ((nr_segs > UIO_MAXIOV) || (nr_segs <= 0))
-+		goto out;
-+	if ((xtnr_segs > UIO_MAXIOV) || (xtnr_segs <= 0))
-+		goto out;
-+	if (!file->f_op)
-+		goto out;
-+	if (nr_segs > UIO_FASTIOV) {
-+		ret = -ENOMEM;
-+		iov = kmalloc(nr_segs * sizeof(struct iovec), GFP_KERNEL);
-+		if (!iov)
-+			goto out;
-+	}
-+	if (xtnr_segs > UIO_FASTIOV) {
-+		ret = -ENOMEM;
-+		xtv = kmalloc(xtnr_segs * sizeof(struct xtvec), GFP_KERNEL);
-+		if (!xtv) {
-+			goto out;
-+		}
-+	}
-+	ret = -EFAULT;
-+	if (copy_from_user(iov, uvector, nr_segs * sizeof(*uvector)))
-+		goto out;
-+	if (copy_from_user(xtv, xtuvector, xtnr_segs * sizeof(*xtuvector)))
-+		goto out;
-+
-+	/*
-+	 * Single unix specification:
-+	 * We should -EINVAL if an element length is not >= 0 and fitting an
-+	 * ssize_t.  The total length is fitting an ssize_t
-+	 *
-+	 * Be careful here because iov_len is a size_t not an ssize_t
-+	 */
-+	tot_len = 0;
-+	ret = -EINVAL;
-+	for (seg = 0; seg < nr_segs; seg++) {
-+		void __user *buf = iov[seg].iov_base;
-+		ssize_t len = (ssize_t)iov[seg].iov_len;
-+
-+		if (len < 0)	/* size_t not fitting an ssize_t .. */
-+			goto out;
-+		if (unlikely(!access_ok(vrfy_dir(type), buf, len)))
-+			goto Efault;
-+		tot_len += len;
-+		if ((ssize_t)tot_len < 0) /* maths overflow on the ssize_t */
-+			goto out;
-+	}
-+	if (tot_len == 0) {
-+		ret = 0;
-+		goto out;
-+	}
-+	tot_xtlen = 0;
-+	ret = -EINVAL;
-+	for (seg = 0; seg < xtnr_segs; seg++) {
-+		loff_t off = (loff_t) xtv[seg].xtv_off;
-+		ssize_t len = (ssize_t)xtv[seg].xtv_len;
-+
-+		if (len < 0)	/* size_t not fitting an ssize_t .. */
-+			goto out;
-+		if (off < 0)   /* off_t not fitting an loff_t */
-+			goto out;
-+		tot_xtlen += len;
-+		if ((ssize_t)tot_xtlen < 0) /* overflow on the ssize_t */
-+			goto out;
-+		ret = rw_verify_area(type, file, &off, len);
-+		if (ret < 0)
-+			goto out;
-+	}
-+	/* if sizes of file and mem don't match up, error out */
-+	if (tot_xtlen != tot_len) {
-+		ret = -EINVAL;
-+		goto out;
-+	}
-+
-+	ret = security_file_permission(file, type == READ ? MAY_READ : MAY_WRITE);
-+	if (ret)
-+		goto out;
-+
-+	if (type == READ) {
-+		fn = (io_fn_t)file->f_op->read;
-+		fnv = (iov_fn_t)file->f_op->readv;
-+		fnx = (iox_fn_t)file->f_op->readx;
-+	} else {
-+		fn = (io_fn_t)file->f_op->write;
-+		fnv = (iov_fn_t)file->f_op->writev;
-+		fnx = (iox_fn_t)file->f_op->writex;
-+	}
-+	/* if we had a scatter-gather callback in memory and file, go for it */
-+	if (fnx) {
-+		ret = fnx(file, iov, nr_segs, xtv, xtnr_segs);
-+		goto out;
-+	}
-+	/* else try to do it by hand using readv/writev operations */
-+	else if (fnv) {
-+		unsigned long xtiov_index = 0, op_iov_index = 0, iov_index = 0;
-+		struct iovec *op_iov = NULL, *copied_iovector = NULL;
-+		struct xtvec *copied_xtvector = NULL;
-+
-+		ret = -ENOMEM;
-+		op_iov = (struct iovec *) kmalloc(nr_segs * sizeof(struct iovec), GFP_KERNEL);
-+		if (!op_iov) 
-+			goto err_out1;
-+		copied_iovector = (struct iovec *) kmalloc(nr_segs * sizeof(struct iovec), GFP_KERNEL);
-+		if (!copied_iovector) 
-+			goto err_out1;
-+		copied_xtvector = (struct xtvec *) kmalloc(xtnr_segs * sizeof(struct xtvec), GFP_KERNEL);
-+		if (!copied_xtvector)
-+			goto err_out1;
-+		memcpy(copied_iovector, iov, nr_segs * sizeof(struct iovec));
-+		memcpy(copied_xtvector, xtv, xtnr_segs * sizeof(struct xtvec));
-+		ret = 0;
-+		iov_index = 0;
-+		for (xtiov_index = 0; xtiov_index < xtnr_segs; xtiov_index++) {
-+			loff_t pos;
-+			ssize_t nr, tot_nr;
-+
-+			pos = copied_xtvector[xtiov_index].xtv_off;
-+			op_iov_index = 0;
-+			tot_nr = 0;
-+			
-+			/* Finish an entire stream and .. */
-+			while (copied_xtvector[xtiov_index].xtv_len > 0) {
-+				size_t min_len;
-+				if (unlikely((iov_index >= nr_segs) || (op_iov_index >= nr_segs))) {
-+					printk(KERN_ERR "iov_index %ld or op_iov_index %ld cannot exceed number of iov segments (%ld)\n",
-+							iov_index, op_iov_index, nr_segs);
-+					ret = -EINVAL;
-+					goto err_out1;
-+				}
-+				min_len = min(copied_xtvector[xtiov_index].xtv_len, copied_iovector[iov_index].iov_len);
-+				op_iov[op_iov_index].iov_base = copied_iovector[iov_index].iov_base;
-+				op_iov[op_iov_index++].iov_len = min_len;
-+				copied_xtvector[xtiov_index].xtv_len -= min_len;
-+				copied_iovector[iov_index].iov_len -= min_len;
-+				copied_iovector[iov_index].iov_base += min_len;
-+				tot_nr += min_len;
-+				/* Advance memory stream if we have exhausted it */
-+				if (copied_iovector[iov_index].iov_len <= 0) {
-+					iov_index++;
-+				}
-+			}
-+			/* .. issue a vectored operation for that region */
-+			nr = fnv(file, op_iov, op_iov_index, &pos);
-+			if (nr < 0) {
-+				if (!ret) ret = nr;
-+				break;
-+			}
-+			ret += nr;
-+			if (nr != tot_nr)
-+				break;
-+		}
-+err_out1:
-+		kfree(op_iov);
-+		kfree(copied_iovector);
-+		kfree(copied_xtvector);
-+		goto out;
-+	}
-+	/* Do it by hand, with plain read/write operations */
-+	else {
-+		unsigned long mem_ct = 0, str_ct = 0;
-+		struct xtvec *copied_xtvector = NULL;
-+		struct iovec *copied_iovector = NULL;
-+
-+		ret = -ENOMEM;
-+		copied_iovector = (struct iovec *) kmalloc(nr_segs * sizeof(struct iovec), GFP_KERNEL);
-+		if (!copied_iovector)
-+			goto err_out2;
-+		copied_xtvector = (struct xtvec *) kmalloc(xtnr_segs * sizeof(struct xtvec), GFP_KERNEL);
-+		if (!copied_xtvector)
-+			goto err_out2;
-+		memcpy(copied_iovector, iov, nr_segs * sizeof(struct iovec));
-+		memcpy(copied_xtvector, xtv, xtnr_segs * sizeof(struct xtvec));
-+
-+		ret = 0;
-+		mem_ct = 0;
-+		str_ct = 0;
-+		while ((mem_ct < nr_segs) && (str_ct < xtnr_segs)) {
-+			size_t min_len;
-+			loff_t pos;
-+			ssize_t nr;
-+			void __user *base;
-+
-+			pos = copied_xtvector[str_ct].xtv_off;
-+			base = copied_iovector[mem_ct].iov_base;
-+			min_len = min(copied_xtvector[str_ct].xtv_len, copied_iovector[mem_ct].iov_len);
-+			copied_xtvector[str_ct].xtv_len -= min_len;
-+			copied_xtvector[str_ct].xtv_off += min_len;
-+			copied_iovector[mem_ct].iov_len -= min_len;
-+			copied_iovector[mem_ct].iov_base += min_len;
-+			if (copied_iovector[mem_ct].iov_len <= 0)
-+				mem_ct++;
-+			if (copied_xtvector[str_ct].xtv_len <= 0)
-+				str_ct++;
-+			/* Issue the smallest region that is contiguous in memory and on file */
-+			nr = fn(file, base, min_len, &pos);
-+			if (nr < 0) {
-+				if (!ret) ret = nr;
-+				break;
-+			}
-+			ret += nr;
-+			if (nr != min_len)
-+				break;
-+		}
-+err_out2:
-+		kfree(copied_xtvector);
-+		kfree(copied_iovector);
-+	}
-+out:
-+	if (iov != iovstack)
-+		kfree(iov);
-+	if (xtv != xtvstack)
-+		kfree(xtv);
-+	if ((ret + (type == READ)) > 0) {
-+		if (type == READ)
-+			fsnotify_access(file->f_dentry);
-+		else
-+			fsnotify_modify(file->f_dentry);
-+	}
-+	return ret;
-+Efault:
-+	ret = -EFAULT;
-+	goto out;
-+}
-+
-+ssize_t vfs_readx(struct file *file, const struct iovec __user *vec,
-+		  unsigned long vlen, const struct xtvec __user *xtvec, unsigned long xtvlen)
-+{
-+	if (!(file->f_mode & FMODE_READ))
-+		return -EBADF;
-+	if (!file->f_op || (!file->f_op->readx && !file->f_op->readv && !file->f_op->read))
-+		return -EINVAL;
-+
-+	return do_readx_writex(READ, file, vec, vlen, xtvec, xtvlen);
-+}
-+
-+EXPORT_SYMBOL_GPL(vfs_readx);
-+
-+ssize_t vfs_writex(struct file *file, const struct iovec __user *vec,
-+		   unsigned long vlen, const struct xtvec __user *xtvec, unsigned long xtvlen)
-+{
-+	if (!(file->f_mode & FMODE_WRITE))
-+		return -EBADF;
-+	if (!file->f_op || (!file->f_op->writex && !file->f_op->writev && !file->f_op->write))
-+		return -EINVAL;
-+
-+	return do_readx_writex(WRITE, file, vec, vlen, xtvec, xtvlen);
-+}
-+
-+EXPORT_SYMBOL_GPL(vfs_writex);
-+
-+asmlinkage ssize_t sys_readx(unsigned long fd,
-+				const struct iovec __user *vec,
-+				unsigned long vlen,
-+				const struct xtvec __user *xtvec,
-+				unsigned long xtvlen)
-+{
-+	struct file *file;
-+	ssize_t ret = -EBADF;
-+	int fput_needed;
-+
-+	file = fget_light(fd, &fput_needed);
-+	if (file) {
-+		ret = vfs_readx(file, vec, vlen, xtvec, xtvlen);
-+		fput_light(file, fput_needed);
-+	}
-+
-+	if (ret > 0)
-+		current->rchar += ret;
-+	current->syscr++;
-+	return ret;
-+}
-+
-+asmlinkage ssize_t sys_writex(unsigned long fd,
-+				const struct iovec __user *vec,
-+				unsigned long vlen,
-+				const struct xtvec __user *xtvec,
-+				unsigned long xtvlen)
-+{
-+	struct file *file;
-+	ssize_t ret = -EBADF;
-+	int fput_needed;
-+
-+	file = fget_light(fd, &fput_needed);
-+	if (file) {
-+		ret = vfs_writex(file, vec, vlen, xtvec, xtvlen);
-+		fput_light(file, fput_needed);
-+	}
-+
-+	if (ret > 0)
-+		current->wchar += ret;
-+	current->syscw++;
-+	return ret;
-+}
-+
- static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
- 			   size_t count, loff_t max)
- {
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-i386/unistd.h vanilla-new/include/asm-i386/unistd.h
---- vanilla/include/asm-i386/unistd.h	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/include/asm-i386/unistd.h	2006-05-24 16:27:28.000000000 -0500
-@@ -326,8 +326,10 @@
- #define __NR_fstatlite64 318
- #define __NR_getdents_plus 319
- #define __NR_getdents64_plus 320
-+#define __NR_readx      321
-+#define __NR_writex     322
- 
--#define NR_syscalls 321
-+#define NR_syscalls 323
- 
- /*
-  * user-visible error numbers are in the range -1 - -128: see
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-ia64/unistd.h vanilla-new/include/asm-ia64/unistd.h
---- vanilla/include/asm-ia64/unistd.h	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/include/asm-ia64/unistd.h	2006-05-24 16:29:19.000000000 -0500
-@@ -292,12 +292,14 @@
- #define __NR_fstatlite     1301
- #define __NR_getdents_plus 1302
- #define __NR_getdents64_plus 1303
-+#define __NR_readx         1304
-+#define __NR_writex        1305
- 
- #ifdef __KERNEL__
- 
- #include <linux/config.h>
- 
--#define NR_syscalls			280 /* length of syscall table */
-+#define NR_syscalls			282 /* length of syscall table */
- 
- #define __ARCH_WANT_SYS_RT_SIGACTION
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-powerpc/unistd.h vanilla-new/include/asm-powerpc/unistd.h
---- vanilla/include/asm-powerpc/unistd.h	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/include/asm-powerpc/unistd.h	2006-05-24 16:30:04.000000000 -0500
-@@ -308,8 +308,10 @@
- #define __NR_fstatlite     287
- #define __NR_getdents_plus 288
- #define __NR_getdents64_plus 289
-+#define __NR_readx         290
-+#define __NR_writex        291
- 
--#define __NR_syscalls		290
-+#define __NR_syscalls		292
- 
- #ifdef __KERNEL__
- #define __NR__exit __NR_exit
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/unistd.h vanilla-new/include/asm-x86_64/unistd.h
---- vanilla/include/asm-x86_64/unistd.h	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/include/asm-x86_64/unistd.h	2006-05-24 16:28:26.000000000 -0500
-@@ -619,8 +619,12 @@
- __SYSCALL(__NR_getdents_plus, sys_getdents_plus)
- #define __NR_getdents64_plus 279
- __SYSCALL(__NR_getdents64_plus, sys_getdents64_plus)
-+#define __NR_readx  280
-+__SYSCALL(__NR_readx, sys_readx)
-+#define __NR_writex 281
-+__SYSCALL(__NR_writex, sys_writex)
- 
--#define __NR_syscall_max __NR_getdents64_plus
-+#define __NR_syscall_max __NR_writex
- 
- #ifndef __NO_STUBS
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/compat.h vanilla-new/include/linux/compat.h
---- vanilla/include/linux/compat.h	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/include/linux/compat.h	2006-05-24 16:26:29.000000000 -0500
-@@ -61,6 +61,11 @@
- 	compat_size_t	iov_len;
- };
- 
-+struct compat_xtvec {
-+	compat_off_t  xtv_off;
-+	compat_size_t xtv_len;
-+};
-+
- struct compat_rlimit {
- 	compat_ulong_t	rlim_cur;
- 	compat_ulong_t	rlim_max;
-@@ -141,6 +146,13 @@
- asmlinkage ssize_t compat_sys_writev(unsigned long fd,
- 		const struct compat_iovec __user *vec, unsigned long vlen);
- 
-+asmlinkage ssize_t compat_sys_readx(unsigned long fd,
-+		const struct compat_iovec __user *vec, unsigned long vlen,
-+		const struct compat_xtvec __user *xtvec, unsigned long xtvlen);
-+asmlinkage ssize_t compat_sys_writex(unsigned long fd,
-+		const struct compat_iovec __user *vec, unsigned long vlen,
-+		const struct compat_xtvec __user *xtvec, unsigned long xtvlen);
-+
- int compat_do_execve(char * filename, compat_uptr_t __user *argv,
- 	        compat_uptr_t __user *envp, struct pt_regs * regs);
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/fs.h vanilla-new/include/linux/fs.h
---- vanilla/include/linux/fs.h	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/include/linux/fs.h	2006-05-24 16:20:15.000000000 -0500
-@@ -226,6 +226,7 @@
- 
- struct hd_geometry;
- struct iovec;
-+struct xtvec;
- struct nameidata;
- struct kiocb;
- struct pipe_inode_info;
-@@ -1048,6 +1049,8 @@
- 	int (*lock) (struct file *, int, struct file_lock *);
- 	ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);
- 	ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);
-+	ssize_t (*readx) (struct file *, const struct iovec *, unsigned long, const struct xtvec *, unsigned long);
-+	ssize_t (*writex) (struct file *, const struct iovec *, unsigned long, const struct xtvec *, unsigned long);
- 	ssize_t (*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void *);
- 	ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
- 	unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
-@@ -1092,6 +1095,11 @@
- 		unsigned long, loff_t *);
- extern ssize_t vfs_writev(struct file *, const struct iovec __user *,
- 		unsigned long, loff_t *);
-+extern ssize_t vfs_readx(struct file *, const struct iovec __user *,
-+		unsigned long, const struct xtvec __user *, unsigned long);
-+extern ssize_t vfs_writex(struct file *, const struct iovec __user *,
-+		unsigned long, const struct xtvec __user *, unsigned long);
-+
- 
- /*
-  * NOTE: write_inode, delete_inode, clear_inode, put_inode can be called
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/syscalls.h vanilla-new/include/linux/syscalls.h
---- vanilla/include/linux/syscalls.h	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/include/linux/syscalls.h	2006-05-24 16:23:31.000000000 -0500
-@@ -17,6 +17,7 @@
- struct iocb;
- struct io_event;
- struct iovec;
-+struct xtvec;
- struct itimerspec;
- struct itimerval;
- struct kexec_segment;
-@@ -402,6 +403,16 @@
- asmlinkage ssize_t sys_writev(unsigned long fd,
- 				const struct iovec __user *vec,
- 				unsigned long vlen);
-+asmlinkage ssize_t sys_readx(unsigned long fd,
-+				const struct iovec __user *vec,
-+				unsigned long vlen,
-+				const struct xtvec __user *xtvec,
-+				unsigned long xtvlen);
-+asmlinkage ssize_t sys_writex(unsigned long fd,
-+				const struct iovec __user *vec,
-+				unsigned long vlen,
-+				const struct xtvec __user *xtvec,
-+				unsigned long xtvlen);
- asmlinkage ssize_t sys_pread64(unsigned int fd, char __user *buf,
- 				size_t count, loff_t pos);
- asmlinkage ssize_t sys_pwrite64(unsigned int fd, const char __user *buf,
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/uio.h vanilla-new/include/linux/uio.h
---- vanilla/include/linux/uio.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/linux/uio.h	2006-05-24 16:24:20.000000000 -0500
-@@ -23,6 +23,12 @@
- 	__kernel_size_t iov_len; /* Must be size_t (1003.1g) */
- };
- 
-+struct xtvec 
-+{
-+	__kernel_off_t xtv_off;  /* must be off_t */
-+	__kernel_size_t xtv_len; /* must be size_t */
-+};
-+
- #ifdef __KERNEL__
- 
- struct kvec {
-@@ -30,6 +36,12 @@
- 	size_t iov_len;
- };
- 
-+struct kxtvec
-+{
-+	off_t xtv_off;
-+	size_t xtv_len;
-+};
-+
- #endif
- 
- /*

--- posix-statlite-fix.patch	2008-01-07 17:27:25.000000000 -0500
+++ /dev/null	2004-06-24 14:04:38.000000000 -0400
@@ -1,125 +0,0 @@
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/stat.c vanilla-new/fs/stat.c
---- vanilla/fs/stat.c	2006-05-24 16:19:07.000000000 -0500
-+++ vanilla-new/fs/stat.c	2006-08-29 17:58:48.000000000 -0500
-@@ -345,6 +345,15 @@
- 	return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
- }
- 
-+static long get_stat_lite_mask(struct stat_lite __user *statlitebuf)
-+{
-+	struct stat_lite tmp;
-+
-+	if (copy_from_user(&tmp,statlitebuf,sizeof(tmp)))
-+		return -EFAULT;
-+	return tmp.st_litemask;
-+}
-+
- int cp_new_statlite(struct kstat_lite *stat_lite, struct stat_lite __user *statlitebuf)
- {
- 	struct stat_lite tmp;
-@@ -434,7 +443,13 @@
- asmlinkage long sys_newstatlite(char __user *filename, struct stat_lite __user *statlitebuf)
- {
- 	struct kstat_lite stat_lite;
--	int error = vfs_statlite_fd(AT_FDCWD, filename, &stat_lite);
-+	int error;
-+
-+	stat_lite.lite_mask = get_stat_lite_mask(statlitebuf);
-+	if (stat_lite.lite_mask < 0)
-+		return stat_lite.lite_mask;
-+
-+	error = vfs_statlite_fd(AT_FDCWD, filename, &stat_lite);
- 
- 	if (!error)
- 		error = cp_new_statlite(&stat_lite, statlitebuf);
-@@ -456,7 +471,13 @@
- asmlinkage long sys_newlstatlite(char __user *filename, struct stat_lite __user *statlitebuf)
- {
- 	struct kstat_lite stat_lite;
--	int error = vfs_lstatlite_fd(AT_FDCWD, filename, &stat_lite);
-+	int error;
-+	
-+	stat_lite.lite_mask = get_stat_lite_mask(statlitebuf);
-+	if (stat_lite.lite_mask < 0)
-+		return stat_lite.lite_mask;
-+
-+	error = vfs_lstatlite_fd(AT_FDCWD, filename, &stat_lite);
- 
- 	if (!error)
- 		error = cp_new_statlite(&stat_lite, statlitebuf);
-@@ -501,7 +522,13 @@
- asmlinkage long sys_newfstatlite(unsigned int fd, struct stat_lite __user *statlitebuf)
- {
- 	struct kstat_lite stat_lite;
--	int error = vfs_fstatlite(fd, &stat_lite);
-+	int error;
-+
-+	stat_lite.lite_mask = get_stat_lite_mask(statlitebuf);
-+	if (stat_lite.lite_mask < 0)
-+		return stat_lite.lite_mask;
-+
-+	error = vfs_fstatlite(fd, &stat_lite);
- 
- 	if (!error)
- 		error = cp_new_statlite(&stat_lite, statlitebuf);
-@@ -580,6 +607,15 @@
- 	return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
- }
- 
-+static long get_stat64_lite_mask(struct stat64_lite __user *statlitebuf)
-+{
-+	struct stat64_lite tmp;
-+
-+	if (copy_from_user(&tmp,statlitebuf,sizeof(tmp)))
-+		return -EFAULT;
-+	return tmp.st_litemask;
-+}
-+
- long cp_new_stat64_lite(struct kstat_lite *stat_lite, struct stat64_lite __user *statlitebuf)
- {
- 	struct stat64_lite tmp;
-@@ -648,7 +684,13 @@
- asmlinkage long sys_statlite64(char __user * filename, struct stat64_lite __user * statlitebuf)
- {
- 	struct kstat_lite stat_lite;
--	int error = vfs_statlite(filename, &stat_lite);
-+	int error;
-+
-+	stat_lite.lite_mask = get_stat64_lite_mask(statlitebuf);
-+	if (stat_lite.lite_mask < 0)
-+		return stat_lite.lite_mask;
-+
-+	error = vfs_statlite(filename, &stat_lite);
- 
- 	if (!error)
- 		error = cp_new_stat64_lite(&stat_lite, statlitebuf);
-@@ -670,7 +712,13 @@
- asmlinkage long sys_lstatlite64(char __user * filename, struct stat64_lite __user * statlitebuf)
- {
- 	struct kstat_lite stat_lite;
--	int error = vfs_lstatlite(filename, &stat_lite);
-+	int error;
-+	
-+	stat_lite.lite_mask = get_stat64_lite_mask(statlitebuf);
-+	if (stat_lite.lite_mask < 0)
-+		return stat_lite.lite_mask;
-+
-+	error = vfs_lstatlite(filename, &stat_lite);
- 
- 	if (!error)
- 		error = cp_new_stat64_lite(&stat_lite, statlitebuf);
-@@ -692,7 +740,13 @@
- asmlinkage long sys_fstatlite64(unsigned long fd, struct stat64_lite __user * statlitebuf)
- {
- 	struct kstat_lite stat_lite;
--	int error = vfs_fstatlite(fd, &stat_lite);
-+	int error;
-+
-+	stat_lite.lite_mask = get_stat64_lite_mask(statlitebuf);
-+	if (stat_lite.lite_mask < 0)
-+		return stat_lite.lite_mask;
-+
-+	error = vfs_fstatlite(fd, &stat_lite);
- 
- 	if (!error)
- 		error = cp_new_stat64_lite(&stat_lite, statlitebuf);

--- posix-statlite-x86_64.patch	2008-01-07 17:27:25.000000000 -0500
+++ /dev/null	2004-06-24 14:04:38.000000000 -0400
@@ -1,77 +0,0 @@
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/x86_64/ia32/sys_ia32.c vanilla-new/arch/x86_64/ia32/sys_ia32.c
---- vanilla/arch/x86_64/ia32/sys_ia32.c	2006-05-09 18:53:48.000000000 -0500
-+++ vanilla-new/arch/x86_64/ia32/sys_ia32.c	2006-05-18 20:35:24.000000000 -0500
-@@ -234,13 +234,13 @@
- 			 return -EFAULT;
- 	}
- 	if (SLITE_MTIME(stat_lite->lite_mask)) {
--	    if (__put_user (stat->mtime.tv_sec, &ubuf->st_mtime) ||
--			 __put_user (stat->mtime.tv_nsec, &ubuf->st_mtime_nsec))
-+	    if (__put_user (stat_lite->mtime.tv_sec, &ubuf->st_mtime) ||
-+			 __put_user (stat_lite->mtime.tv_nsec, &ubuf->st_mtime_nsec))
- 			 return -EFAULT;
- 	}
- 	if (SLITE_CTIME(stat_lite->lite_mask)) {
--	    if (__put_user (stat->ctime.tv_sec, &ubuf->st_ctime) ||
--			 __put_user (stat->ctime.tv_nsec, &ubuf->st_ctime_nsec))
-+	    if (__put_user (stat_lite->ctime.tv_sec, &ubuf->st_ctime) ||
-+			 __put_user (stat_lite->ctime.tv_nsec, &ubuf->st_ctime_nsec))
- 			 return -EFAULT;
- 	}
- 	if (SLITE_BLKSIZE(stat_lite->lite_mask)) {
-@@ -248,7 +248,7 @@
- 			 return -EFAULT;
- 	}
- 	if (SLITE_BLOCKS(stat_lite->lite_mask)) {
--		 if (__put_user (stat->blocks, &ubuf->st_blocks))
-+		 if (__put_user (stat_lite->blocks, &ubuf->st_blocks))
- 			return -EFAULT;
- 	}
- 	return 0;
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/ia32.h vanilla-new/include/asm-x86_64/ia32.h
---- vanilla/include/asm-x86_64/ia32.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/asm-x86_64/ia32.h	2006-05-18 20:34:22.000000000 -0500
-@@ -78,6 +78,43 @@
- 	unsigned long long	st_ino;
- } __attribute__((packed));
- 
-+/* This matches struct stat64_lite in glibc2.2, hence the absolutely
-+ * insane amounts of padding around dev_t's.
-+ */
-+struct stat64_lite {
-+	unsigned long long	st_dev;
-+	unsigned char		__pad0[4];
-+
-+#define STAT64_HAS_BROKEN_ST_INO	1
-+	unsigned int		__st_ino;
-+
-+	unsigned int		st_mode;
-+	unsigned int		st_nlink;
-+
-+	unsigned int		st_uid;
-+	unsigned int		st_gid;
-+
-+	unsigned long long	st_rdev;
-+	unsigned char		__pad3[4];
-+
-+	unsigned long  st_litemask;
-+	unsigned char  __pad5[4];
-+
-+	long long		st_size;
-+	unsigned int		st_blksize;
-+
-+	long long		st_blocks;/* Number 512-byte blocks allocated. */
-+
-+	unsigned 		st_atime;
-+	unsigned 		st_atime_nsec;
-+	unsigned 		st_mtime;
-+	unsigned 		st_mtime_nsec;
-+	unsigned 		st_ctime;
-+	unsigned 		st_ctime_nsec;
-+
-+	unsigned long long	st_ino;
-+} __attribute__((packed));
-+
- typedef struct compat_siginfo{
- 	int si_signo;
- 	int si_errno;

--- posix-statlite.patch	2008-01-07 17:27:25.000000000 -0500
+++ /dev/null	2004-06-24 14:04:38.000000000 -0400
@@ -1,1112 +0,0 @@
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/i386/kernel/syscall_table.S vanilla-new/arch/i386/kernel/syscall_table.S
---- vanilla/arch/i386/kernel/syscall_table.S	2006-05-05 13:59:14.000000000 -0500
-+++ vanilla-new/arch/i386/kernel/syscall_table.S	2006-05-05 15:14:31.000000000 -0500
-@@ -312,3 +312,9 @@
- 	.long sys_unshare		/* 310 */
- 	.long sys_openg
- 	.long sys_openfh
-+	.long sys_newstatlite
-+	.long sys_newlstatlite
-+	.long sys_newfstatlite
-+	.long sys_statlite64
-+	.long sys_lstatlite64
-+	.long sys_fstatlite64
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/ia64/kernel/entry.S vanilla-new/arch/ia64/kernel/entry.S
---- vanilla/arch/ia64/kernel/entry.S	2006-05-05 13:59:14.000000000 -0500
-+++ vanilla-new/arch/ia64/kernel/entry.S	2006-05-05 15:29:07.000000000 -0500
-@@ -1621,5 +1621,8 @@
- 	data8 sys_unshare
- 	data8 sys_openg
- 	data8 sys_openfh
-+	data8 sys_newstatlite
-+	data8 sys_newlstatlite
-+	data8 sys_newfstatlite
- 
- 	.org sys_call_table + 8*NR_syscalls	// guard against failures to increase NR_syscalls
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/powerpc/kernel/systbl.S vanilla-new/arch/powerpc/kernel/systbl.S
---- vanilla/arch/powerpc/kernel/systbl.S	2006-05-05 13:59:14.000000000 -0500
-+++ vanilla-new/arch/powerpc/kernel/systbl.S	2006-05-05 17:02:20.000000000 -0500
-@@ -324,3 +324,6 @@
- SYSCALL(unshare)
- SYSCALL(openg)
- SYSCALL(openfh)
-+SYSCALL(newstatlite)
-+SYSCALL(newlstatlite)
-+SYSCALL(newfstatlite)
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/x86_64/ia32/ia32entry.S vanilla-new/arch/x86_64/ia32/ia32entry.S
---- vanilla/arch/x86_64/ia32/ia32entry.S	2006-05-05 13:59:14.000000000 -0500
-+++ vanilla-new/arch/x86_64/ia32/ia32entry.S	2006-05-05 15:15:16.000000000 -0500
-@@ -690,6 +690,12 @@
- 	.quad sys_unshare		/* 310 */
- 	.quad compat_sys_openg
- 	.quad compat_sys_openfh
-+	.quad compat_sys_newstatlite
-+	.quad compat_sys_newlstatlite
-+	.quad compat_sys_newfstatlite
-+	.quad sys32_statlite64
-+	.quad sys32_lstatlite64
-+	.quad sys32_fstatlite64
- ia32_syscall_end:		
- 	.rept IA32_NR_syscalls-(ia32_syscall_end-ia32_sys_call_table)/8
- 		.quad ni_syscall
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/arch/x86_64/ia32/sys_ia32.c vanilla-new/arch/x86_64/ia32/sys_ia32.c
---- vanilla/arch/x86_64/ia32/sys_ia32.c	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/arch/x86_64/ia32/sys_ia32.c	2006-05-05 16:17:51.000000000 -0500
-@@ -106,6 +106,59 @@
- 	return 0;
- }
- 
-+int cp_compat_statlite(struct kstat_lite *kbuf, struct compat_stat_lite __user *ubuf)
-+{
-+	typeof(ubuf->st_uid) uid = 0;
-+	typeof(ubuf->st_gid) gid = 0;
-+	SET_UID(uid, kbuf->uid);
-+	SET_GID(gid, kbuf->gid);
-+	if (!old_valid_dev(kbuf->dev) || !old_valid_dev(kbuf->rdev))
-+		return -EOVERFLOW;
-+	if (SLITE_SIZET(kbuf->lite_mask) && kbuf->size >= 0x7fffffff)
-+		return -EOVERFLOW;
-+	if (!access_ok(VERIFY_WRITE, ubuf, sizeof(struct compat_stat_lite)) ||
-+	    __put_user (old_encode_dev(kbuf->dev), &ubuf->st_dev) ||
-+	    __put_user (kbuf->ino, &ubuf->st_ino) ||
-+	    __put_user (kbuf->mode, &ubuf->st_mode) ||
-+	    __put_user (kbuf->nlink, &ubuf->st_nlink) ||
-+	    __put_user (uid, &ubuf->st_uid) ||
-+	    __put_user (gid, &ubuf->st_gid) ||
-+	    __put_user (old_encode_dev(kbuf->rdev), &ubuf->st_rdev))
-+		return -EFAULT;
-+
-+	if (__put_user (kbuf->lite_mask, &ubuf->st_litemask))
-+		return -EFAULT;
-+
-+	if (SLITE_SIZET(kbuf->lite_mask)) {
-+	    if (__put_user (kbuf->size, &ubuf->st_size))
-+			 return -EFAULT;
-+	}
-+	if (SLITE_ATIME(kbuf->lite_mask)) {
-+	    if (__put_user (kbuf->atime.tv_sec, &ubuf->st_atime) ||
-+			 __put_user (kbuf->atime.tv_nsec, &ubuf->st_atime_nsec))
-+			 return -EFAULT;
-+	}
-+	if (SLITE_MTIME(kbuf->lite_mask)) {
-+	    if (__put_user (kbuf->mtime.tv_sec, &ubuf->st_mtime) ||
-+			 __put_user (kbuf->mtime.tv_nsec, &ubuf->st_mtime_nsec))
-+			 return -EFAULT;
-+	}
-+	if (SLITE_CTIME(kbuf->lite_mask)) {
-+	    if (__put_user (kbuf->ctime.tv_sec, &ubuf->st_ctime) ||
-+			 __put_user (kbuf->ctime.tv_nsec, &ubuf->st_ctime_nsec))
-+			 return -EFAULT;
-+	}
-+	if (SLITE_BLKSIZE(kbuf->lite_mask)) {
-+	    if (__put_user (kbuf->blksize, &ubuf->st_blksize))
-+			 return -EFAULT;
-+	}
-+	if (SLITE_BLOCKS(kbuf->lite_mask)) {
-+	    if (__put_user (kbuf->blocks, &ubuf->st_blocks))
-+			 return -EFAULT;
-+	}
-+	return 0;
-+}
-+
- asmlinkage long
- sys32_truncate64(char __user * filename, unsigned long offset_low, unsigned long offset_high)
- {
-@@ -150,6 +203,57 @@
- 	return 0;
- }
- 
-+static int
-+cp_stat64_lite(struct stat64_lite __user *ubuf, struct kstat_lite *stat_lite)
-+{
-+	typeof(ubuf->st_uid) uid = 0;
-+	typeof(ubuf->st_gid) gid = 0;
-+	SET_UID(uid, stat_lite->uid);
-+	SET_GID(gid, stat_lite->gid);
-+	if (!access_ok(VERIFY_WRITE, ubuf, sizeof(struct stat64_lite)) ||
-+	    __put_user(huge_encode_dev(stat_lite->dev), &ubuf->st_dev) ||
-+	    __put_user (stat_lite->ino, &ubuf->__st_ino) ||
-+	    __put_user (stat_lite->ino, &ubuf->st_ino) ||
-+	    __put_user (stat_lite->mode, &ubuf->st_mode) ||
-+	    __put_user (stat_lite->nlink, &ubuf->st_nlink) ||
-+	    __put_user (uid, &ubuf->st_uid) ||
-+	    __put_user (gid, &ubuf->st_gid) ||
-+	    __put_user (huge_encode_dev(stat_lite->rdev), &ubuf->st_rdev))
-+		return -EFAULT;
-+
-+	if (__put_user (stat_lite->lite_mask, &ubuf->st_litemask))
-+		return -EFAULT;
-+
-+	if (SLITE_SIZET(stat_lite->lite_mask)) {
-+	    if (__put_user (stat_lite->size, &ubuf->st_size))
-+			 return -EFAULT;
-+	}
-+	if (SLITE_ATIME(stat_lite->lite_mask)) {
-+	    if (__put_user (stat_lite->atime.tv_sec, &ubuf->st_atime) ||
-+			 __put_user (stat_lite->atime.tv_nsec, &ubuf->st_atime_nsec)) 
-+			 return -EFAULT;
-+	}
-+	if (SLITE_MTIME(stat_lite->lite_mask)) {
-+	    if (__put_user (stat->mtime.tv_sec, &ubuf->st_mtime) ||
-+			 __put_user (stat->mtime.tv_nsec, &ubuf->st_mtime_nsec))
-+			 return -EFAULT;
-+	}
-+	if (SLITE_CTIME(stat_lite->lite_mask)) {
-+	    if (__put_user (stat->ctime.tv_sec, &ubuf->st_ctime) ||
-+			 __put_user (stat->ctime.tv_nsec, &ubuf->st_ctime_nsec))
-+			 return -EFAULT;
-+	}
-+	if (SLITE_BLKSIZE(stat_lite->lite_mask)) {
-+	    if (__put_user (stat_lite->blksize, &ubuf->st_blksize))
-+			 return -EFAULT;
-+	}
-+	if (SLITE_BLOCKS(stat_lite->lite_mask)) {
-+		 if (__put_user (stat->blocks, &ubuf->st_blocks))
-+			return -EFAULT;
-+	}
-+	return 0;
-+}
-+
- asmlinkage long
- sys32_stat64(char __user * filename, struct stat64 __user *statbuf)
- {
-@@ -161,6 +265,16 @@
- }
- 
- asmlinkage long
-+sys32_statlite64(char __user * filename, struct stat64_lite __user *statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int ret = vfs_statlite(filename, &stat_lite);
-+	if (!ret)
-+		ret = cp_stat64_lite(statlitebuf, &stat_lite);
-+	return ret;
-+}
-+
-+asmlinkage long
- sys32_lstat64(char __user * filename, struct stat64 __user *statbuf)
- {
- 	struct kstat stat;
-@@ -171,6 +285,16 @@
- }
- 
- asmlinkage long
-+sys32_lstatlite64(char __user * filename, struct stat64_lite __user *statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int ret = vfs_lstatlite(filename, &stat_lite);
-+	if (!ret)
-+		ret = cp_stat64_lite(statlitebuf, &stat_lite);
-+	return ret;
-+}
-+
-+asmlinkage long
- sys32_fstat64(unsigned int fd, struct stat64 __user *statbuf)
- {
- 	struct kstat stat;
-@@ -181,6 +305,16 @@
- }
- 
- asmlinkage long
-+sys32_fstatlite64(unsigned int fd, struct stat64_lite __user *statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int ret = vfs_fstatlite(fd, &stat_lite);
-+	if (!ret)
-+		ret = cp_stat64_lite(statlitebuf, &stat_lite);
-+	return ret;
-+}
-+
-+asmlinkage long
- sys32_fstatat(unsigned int dfd, char __user *filename,
- 	      struct stat64 __user* statbuf, int flag)
- {
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/compat.c vanilla-new/fs/compat.c
---- vanilla/fs/compat.c	2006-05-05 13:59:14.000000000 -0500
-+++ vanilla-new/fs/compat.c	2006-05-05 14:16:16.000000000 -0500
-@@ -103,6 +103,17 @@
- 	return error;
- }
- 
-+asmlinkage long compat_sys_newstatlite(char __user * filename,
-+		struct compat_stat_lite __user *statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int error = vfs_statlite_fd(AT_FDCWD, filename, &stat_lite);
-+
-+	if (!error)
-+		error = cp_compat_statlite(&stat_lite, statlitebuf);
-+	return error;
-+}
-+
- asmlinkage long compat_sys_newlstat(char __user * filename,
- 		struct compat_stat __user *statbuf)
- {
-@@ -114,6 +125,17 @@
- 	return error;
- }
- 
-+asmlinkage long compat_sys_newlstatlite(char __user * filename,
-+		struct compat_stat_lite __user *statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int error = vfs_lstatlite_fd(AT_FDCWD, filename, &stat_lite);
-+
-+	if (!error)
-+		error = cp_compat_statlite(&stat_lite, statlitebuf);
-+	return error;
-+}
-+
- asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user *filename,
- 		struct compat_stat __user *statbuf, int flag)
- {
-@@ -146,6 +168,17 @@
- 	return error;
- }
- 
-+asmlinkage long compat_sys_newfstatlite(unsigned int fd,
-+		struct compat_stat_lite __user * statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int error = vfs_fstatlite(fd, &stat_lite);
-+
-+	if (!error)
-+		error = cp_compat_statlite(&stat_lite, statlitebuf);
-+	return error;
-+}
-+
- static int put_compat_statfs(struct compat_statfs __user *ubuf, struct kstatfs *kbuf)
- {
- 	
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/fs/stat.c vanilla-new/fs/stat.c
---- vanilla/fs/stat.c	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/fs/stat.c	2006-05-05 17:12:15.000000000 -0500
-@@ -38,6 +38,33 @@
- 
- EXPORT_SYMBOL(generic_fillattr);
- 
-+void generic_fillattr_lite(struct inode *inode, struct kstat_lite *stat_lite)
-+{
-+	unsigned long lite_mask = stat_lite->lite_mask;
-+
-+	stat_lite->dev = inode->i_sb->s_dev;
-+	stat_lite->ino = inode->i_ino;
-+	stat_lite->mode = inode->i_mode;
-+	stat_lite->nlink = inode->i_nlink;
-+	stat_lite->uid = inode->i_uid;
-+	stat_lite->gid = inode->i_gid;
-+	stat_lite->rdev = inode->i_rdev;
-+	if (SLITE_ATIME(lite_mask))
-+		stat_lite->atime = inode->i_atime;
-+	if (SLITE_MTIME(lite_mask))
-+		stat_lite->mtime = inode->i_mtime;
-+	if (SLITE_CTIME(lite_mask))
-+		stat_lite->ctime = inode->i_ctime;
-+	if (SLITE_SIZET(lite_mask))
-+		stat_lite->size = i_size_read(inode);
-+	if (SLITE_BLOCKS(lite_mask))
-+		stat_lite->blocks = inode->i_blocks;
-+	if (SLITE_BLKSIZE(lite_mask))
-+		stat_lite->blksize = inode->i_blksize;
-+}
-+
-+EXPORT_SYMBOL_GPL(generic_fillattr_lite);
-+
- int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
- {
- 	struct inode *inode = dentry->d_inode;
-@@ -63,6 +90,31 @@
- 
- EXPORT_SYMBOL(vfs_getattr);
- 
-+int vfs_getattr_lite(struct vfsmount *mnt, struct dentry *dentry, struct kstat_lite *stat_lite)
-+{
-+	struct inode *inode = dentry->d_inode;
-+	int retval;
-+
-+	retval = security_inode_getattr(mnt, dentry);
-+	if (retval)
-+		return retval;
-+
-+	if (inode->i_op->getattr_lite)
-+		return inode->i_op->getattr_lite(mnt, dentry, stat_lite);
-+
-+	generic_fillattr_lite(inode, stat_lite);
-+	if (!stat_lite->blksize) {
-+		struct super_block *s = inode->i_sb;
-+		unsigned blocks;
-+		blocks = (stat_lite->size+s->s_blocksize-1) >> s->s_blocksize_bits;
-+		stat_lite->blocks = (s->s_blocksize / 512) * blocks;
-+		stat_lite->blksize = s->s_blocksize;
-+	}
-+	return 0;
-+}
-+
-+EXPORT_SYMBOL_GPL(vfs_getattr_lite);
-+
- int vfs_stat_fd(int dfd, char __user *name, struct kstat *stat)
- {
- 	struct nameidata nd;
-@@ -76,6 +128,19 @@
- 	return error;
- }
- 
-+int vfs_statlite_fd(int dfd, char __user *name, struct kstat_lite *stat_lite)
-+{
-+	struct nameidata nd;
-+	int error;
-+
-+	error = __user_walk_fd(dfd, name, LOOKUP_FOLLOW, &nd);
-+	if (!error) {
-+		error = vfs_getattr_lite(nd.mnt, nd.dentry, stat_lite);
-+		path_release(&nd);
-+	}
-+	return error;
-+}
-+
- int vfs_stat(char __user *name, struct kstat *stat)
- {
- 	return vfs_stat_fd(AT_FDCWD, name, stat);
-@@ -83,6 +148,13 @@
- 
- EXPORT_SYMBOL(vfs_stat);
- 
-+int vfs_statlite(char __user *name, struct kstat_lite *stat_lite)
-+{
-+	return vfs_statlite_fd(AT_FDCWD, name, stat_lite);
-+}
-+
-+EXPORT_SYMBOL_GPL(vfs_statlite);
-+
- int vfs_lstat_fd(int dfd, char __user *name, struct kstat *stat)
- {
- 	struct nameidata nd;
-@@ -96,6 +168,19 @@
- 	return error;
- }
- 
-+int vfs_lstatlite_fd(int dfd, char __user *name, struct kstat_lite *stat_lite)
-+{
-+	struct nameidata nd;
-+	int error;
-+
-+	error = __user_walk_fd(dfd, name, 0, &nd);
-+	if (!error) {
-+		error = vfs_getattr_lite(nd.mnt, nd.dentry, stat_lite);
-+		path_release(&nd);
-+	}
-+	return error;
-+}
-+
- int vfs_lstat(char __user *name, struct kstat *stat)
- {
- 	return vfs_lstat_fd(AT_FDCWD, name, stat);
-@@ -103,6 +188,13 @@
- 
- EXPORT_SYMBOL(vfs_lstat);
- 
-+int vfs_lstatlite(char __user *name, struct kstat_lite *stat_lite)
-+{
-+	return vfs_lstatlite_fd(AT_FDCWD, name, stat_lite);
-+}
-+
-+EXPORT_SYMBOL_GPL(vfs_lstatlite);
-+
- int vfs_fstat(unsigned int fd, struct kstat *stat)
- {
- 	struct file *f = fget(fd);
-@@ -117,6 +209,20 @@
- 
- EXPORT_SYMBOL(vfs_fstat);
- 
-+int vfs_fstatlite(unsigned int fd, struct kstat_lite *stat_lite)
-+{
-+	struct file *f = fget(fd);
-+	int error = -EBADF;
-+
-+	if (f) {
-+		error = vfs_getattr_lite(f->f_vfsmnt, f->f_dentry, stat_lite);
-+		fput(f);
-+	}
-+	return error;
-+}
-+
-+EXPORT_SYMBOL_GPL(vfs_fstatlite);
-+
- #ifdef __ARCH_WANT_OLD_STAT
- 
- /*
-@@ -239,6 +345,81 @@
- 	return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
- }
- 
-+static int cp_new_statlite(struct kstat_lite *stat_lite, struct stat_lite __user *statlitebuf)
-+{
-+	struct stat_lite tmp;
-+
-+#if BITS_PER_LONG == 32
-+	if (!old_valid_dev(stat_lite->dev) || !old_valid_dev(stat_lite->rdev))
-+		return -EOVERFLOW;
-+#else
-+	if (!new_valid_dev(stat_lite->dev) || !new_valid_dev(stat_lite->rdev))
-+		return -EOVERFLOW;
-+#endif
-+
-+	memset(&tmp, 0, sizeof(tmp));
-+#if BITS_PER_LONG == 32
-+	tmp.st_dev = old_encode_dev(stat_lite->dev);
-+#else
-+	tmp.st_dev = new_encode_dev(stat_lite->dev);
-+#endif
-+	tmp.st_ino = stat_lite->ino;
-+	tmp.st_mode = stat_lite->mode;
-+	tmp.st_nlink = stat_lite->nlink;
-+	if (tmp.st_nlink != stat_lite->nlink)
-+		return -EOVERFLOW;
-+	SET_UID(tmp.st_uid, stat_lite->uid);
-+	SET_GID(tmp.st_gid, stat_lite->gid);
-+#if BITS_PER_LONG == 32
-+	tmp.st_rdev = old_encode_dev(stat_lite->rdev);
-+#else
-+	tmp.st_rdev = new_encode_dev(stat_lite->rdev);
-+#endif
-+#if BITS_PER_LONG == 32
-+	if (SLITE_SIZET(stat_lite->lite_mask) && stat_lite->size > MAX_NON_LFS)
-+		return -EOVERFLOW;
-+#endif
-+	if (SLITE_SIZET(stat_lite->lite_mask)) {
-+		tmp.st_size = stat_lite->size;
-+		tmp.st_litemask |= S_SLITE_SIZET;
-+	}
-+	if (SLITE_ATIME(stat_lite->lite_mask)) {
-+		tmp.st_atime = stat_lite->atime.tv_sec;
-+		tmp.st_litemask |= S_SLITE_ATIME;
-+	}
-+	if (SLITE_MTIME(stat_lite->lite_mask)) {
-+		tmp.st_mtime = stat_lite->mtime.tv_sec;
-+		tmp.st_litemask |= S_SLITE_MTIME;
-+	}
-+	if (SLITE_CTIME(stat_lite->lite_mask)) {
-+		tmp.st_ctime = stat_lite->ctime.tv_sec;
-+		tmp.st_litemask |= S_SLITE_CTIME;
-+	}
-+#ifdef STAT_HAVE_NSEC
-+	if (SLITE_ATIME(stat_lite->lite_mask)) {
-+		tmp.st_atime_nsec = stat_lite->atime.tv_nsec;
-+		tmp.st_litemask |= S_SLITE_ATIME;
-+	}
-+	if (SLITE_MTIME(stat_lite->lite_mask)) {
-+		tmp.st_mtime_nsec = stat_lite->mtime.tv_nsec;
-+		tmp.st_litemask |= S_SLITE_MTIME;
-+	}
-+	if (SLITE_CTIME(stat_lite->lite_mask)) {
-+		tmp.st_ctime_nsec = stat_lite->ctime.tv_nsec;
-+		tmp.st_litemask |= S_SLITE_CTIME;
-+	}
-+#endif
-+	if (SLITE_BLOCKS(stat_lite->lite_mask)) {
-+		tmp.st_blocks = stat_lite->blocks;
-+		tmp.st_litemask |= S_SLITE_BLOCKS;
-+	}
-+	if (SLITE_BLKSIZE(stat_lite->lite_mask)) {
-+		tmp.st_blksize = stat_lite->blksize;
-+		tmp.st_litemask |= S_SLITE_BLKSIZE;
-+	}
-+	return copy_to_user(statlitebuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
-+}
-+
- asmlinkage long sys_newstat(char __user *filename, struct stat __user *statbuf)
- {
- 	struct kstat stat;
-@@ -250,6 +431,17 @@
- 	return error;
- }
- 
-+asmlinkage long sys_newstatlite(char __user *filename, struct stat_lite __user *statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int error = vfs_statlite_fd(AT_FDCWD, filename, &stat_lite);
-+
-+	if (!error)
-+		error = cp_new_statlite(&stat_lite, statlitebuf);
-+
-+	return error;
-+}
-+
- asmlinkage long sys_newlstat(char __user *filename, struct stat __user *statbuf)
- {
- 	struct kstat stat;
-@@ -261,6 +453,17 @@
- 	return error;
- }
- 
-+asmlinkage long sys_newlstatlite(char __user *filename, struct stat_lite __user *statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int error = vfs_lstatlite_fd(AT_FDCWD, filename, &stat_lite);
-+
-+	if (!error)
-+		error = cp_new_statlite(&stat_lite, statlitebuf);
-+
-+	return error;
-+}
-+
- #ifndef __ARCH_WANT_STAT64
- asmlinkage long sys_newfstatat(int dfd, char __user *filename,
- 				struct stat __user *statbuf, int flag)
-@@ -295,6 +498,17 @@
- 	return error;
- }
- 
-+asmlinkage long sys_newfstatlite(unsigned int fd, struct stat_lite __user *statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int error = vfs_fstatlite(fd, &stat_lite);
-+
-+	if (!error)
-+		error = cp_new_statlite(&stat_lite, statlitebuf);
-+
-+	return error;
-+}
-+
- asmlinkage long sys_readlinkat(int dfd, const char __user *path,
- 				char __user *buf, int bufsiz)
- {
-@@ -366,6 +580,60 @@
- 	return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
- }
- 
-+static long cp_new_stat64_lite(struct kstat_lite *stat_lite, struct stat64_lite __user *statlitebuf)
-+{
-+	struct stat64_lite tmp;
-+
-+	memset(&tmp, 0, sizeof(struct stat64_lite));
-+#ifdef CONFIG_MIPS
-+	/* mips has weird padding, so we don't get 64 bits there */
-+	if (!new_valid_dev(stat_lite->dev) || !new_valid_dev(stat_lite->rdev))
-+		return -EOVERFLOW;
-+	tmp.st_dev = new_encode_dev(stat_lite->dev);
-+	tmp.st_rdev = new_encode_dev(stat_lite->rdev);
-+#else
-+	tmp.st_dev = huge_encode_dev(stat_lite->dev);
-+	tmp.st_rdev = huge_encode_dev(stat_lite->rdev);
-+#endif
-+	tmp.st_ino = stat_lite->ino;
-+#ifdef STAT64_HAS_BROKEN_ST_INO
-+	tmp.__st_ino = stat_lite->ino;
-+#endif
-+	tmp.st_mode = stat_lite->mode;
-+	tmp.st_nlink = stat_lite->nlink;
-+	tmp.st_uid = stat_lite->uid;
-+	tmp.st_gid = stat_lite->gid;
-+
-+	if (SLITE_ATIME(stat_lite->lite_mask)) {
-+		tmp.st_atime = stat_lite->atime.tv_sec;
-+		tmp.st_atime_nsec = stat_lite->atime.tv_nsec;
-+		tmp.st_litemask |= S_SLITE_ATIME;
-+	}
-+	if (SLITE_MTIME(stat_lite->lite_mask)) {
-+		tmp.st_mtime = stat_lite->mtime.tv_sec;
-+		tmp.st_mtime_nsec = stat_lite->mtime.tv_nsec;
-+		tmp.st_litemask |= S_SLITE_MTIME;
-+	}
-+	if (SLITE_CTIME(stat_lite->lite_mask)) {
-+		tmp.st_ctime = stat_lite->ctime.tv_sec;
-+		tmp.st_ctime_nsec = stat_lite->ctime.tv_nsec;
-+		tmp.st_litemask |= S_SLITE_CTIME;
-+	}
-+	if (SLITE_SIZET(stat_lite->lite_mask)) {
-+		tmp.st_size = stat_lite->size;
-+		tmp.st_litemask |= S_SLITE_SIZET;
-+	}
-+	if (SLITE_BLOCKS(stat_lite->lite_mask)) {
-+		tmp.st_blocks = stat_lite->blocks;
-+		tmp.st_litemask |= S_SLITE_BLOCKS;
-+	}
-+	if (SLITE_BLKSIZE(stat_lite->lite_mask)) {
-+		tmp.st_blksize = stat_lite->blksize;
-+		tmp.st_litemask |= S_SLITE_BLKSIZE;
-+	}
-+	return copy_to_user(statlitebuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
-+}
-+
- asmlinkage long sys_stat64(char __user * filename, struct stat64 __user * statbuf)
- {
- 	struct kstat stat;
-@@ -376,6 +644,18 @@
- 
- 	return error;
- }
-+
-+asmlinkage long sys_statlite64(char __user * filename, struct stat64_lite __user * statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int error = vfs_statlite(filename, &stat_lite);
-+
-+	if (!error)
-+		error = cp_new_stat64_lite(&stat_lite, statlitebuf);
-+
-+	return error;
-+}
-+
- asmlinkage long sys_lstat64(char __user * filename, struct stat64 __user * statbuf)
- {
- 	struct kstat stat;
-@@ -386,6 +666,18 @@
- 
- 	return error;
- }
-+
-+asmlinkage long sys_lstatlite64(char __user * filename, struct stat64_lite __user * statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int error = vfs_lstatlite(filename, &stat_lite);
-+
-+	if (!error)
-+		error = cp_new_stat64_lite(&stat_lite, statlitebuf);
-+
-+	return error;
-+}
-+
- asmlinkage long sys_fstat64(unsigned long fd, struct stat64 __user * statbuf)
- {
- 	struct kstat stat;
-@@ -397,6 +689,17 @@
- 	return error;
- }
- 
-+asmlinkage long sys_fstatlite64(unsigned long fd, struct stat64_lite __user * statlitebuf)
-+{
-+	struct kstat_lite stat_lite;
-+	int error = vfs_fstatlite(fd, &stat_lite);
-+
-+	if (!error)
-+		error = cp_new_stat64_lite(&stat_lite, statlitebuf);
-+
-+	return error;
-+}
-+
- asmlinkage long sys_fstatat64(int dfd, char __user *filename,
- 			       struct stat64 __user *statbuf, int flag)
- {
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-i386/stat.h vanilla-new/include/asm-i386/stat.h
---- vanilla/include/asm-i386/stat.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/asm-i386/stat.h	2006-05-05 16:58:22.000000000 -0500
-@@ -36,6 +36,28 @@
- 	unsigned long  __unused5;
- };
- 
-+struct stat_lite {
-+	unsigned long  st_dev;
-+	unsigned long  st_ino;
-+	unsigned short st_mode;
-+	unsigned short st_nlink;
-+	unsigned short st_uid;
-+	unsigned short st_gid;
-+	unsigned long  st_rdev;
-+	unsigned long  st_litemask;
-+	unsigned long  st_size;
-+	unsigned long  st_blksize;
-+	unsigned long  st_blocks;
-+	unsigned long  st_atime;
-+	unsigned long  st_atime_nsec;
-+	unsigned long  st_mtime;
-+	unsigned long  st_mtime_nsec;
-+	unsigned long  st_ctime;
-+	unsigned long  st_ctime_nsec;
-+	unsigned long  __unused4;
-+	unsigned long  __unused5;
-+};
-+
- /* This matches struct stat64 in glibc2.1, hence the absolutely
-  * insane amounts of padding around dev_t's.
-  */
-@@ -75,4 +97,41 @@
- 
- #define STAT_HAVE_NSEC 1
- 
-+struct stat64_lite {
-+	unsigned long long	st_dev;
-+	unsigned char	__pad0[4];
-+
-+#define STAT64_HAS_BROKEN_ST_INO	1
-+	unsigned long	__st_ino;
-+
-+	unsigned int	st_mode;
-+	unsigned int	st_nlink;
-+
-+	unsigned long	st_uid;
-+	unsigned long	st_gid;
-+
-+	unsigned long long	st_rdev;
-+	unsigned char	__pad3[4];
-+
-+	unsigned long  st_litemask;
-+	unsigned char  __pad5[4];
-+
-+	long long	st_size;
-+	unsigned long	st_blksize;
-+
-+	unsigned long	st_blocks;	/* Number 512-byte blocks allocated. */
-+	unsigned long	__pad4;		/* future possible st_blocks high bits */
-+
-+	unsigned long	st_atime;
-+	unsigned long	st_atime_nsec;
-+
-+	unsigned long	st_mtime;
-+	unsigned int	st_mtime_nsec;
-+
-+	unsigned long	st_ctime;
-+	unsigned long	st_ctime_nsec;
-+
-+	unsigned long long	st_ino;
-+};
-+
- #endif
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-i386/unistd.h vanilla-new/include/asm-i386/unistd.h
---- vanilla/include/asm-i386/unistd.h	2006-05-05 13:59:14.000000000 -0500
-+++ vanilla-new/include/asm-i386/unistd.h	2006-05-05 15:22:38.000000000 -0500
-@@ -318,8 +318,14 @@
- #define __NR_unshare		310
- #define __NR_openg      311
- #define __NR_openfh     312
-+#define __NR_newstatlite 313
-+#define __NR_newlstatlite 314
-+#define __NR_newfstatlite 315
-+#define __NR_statlite64  316
-+#define __NR_lstatlite64 317
-+#define __NR_fstatlite64 318
- 
--#define NR_syscalls 313
-+#define NR_syscalls 319
- 
- /*
-  * user-visible error numbers are in the range -1 - -128: see
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-ia64/unistd.h vanilla-new/include/asm-ia64/unistd.h
---- vanilla/include/asm-ia64/unistd.h	2006-05-05 13:59:14.000000000 -0500
-+++ vanilla-new/include/asm-ia64/unistd.h	2006-05-05 15:27:03.000000000 -0500
-@@ -287,12 +287,15 @@
- #define __NR_unshare			1296
- #define __NR_openg         1297
- #define __NR_openfh        1298
-+#define __NR_statlite      1299
-+#define __NR_lstatlite     1300
-+#define __NR_fstatlite     1301
- 
- #ifdef __KERNEL__
- 
- #include <linux/config.h>
- 
--#define NR_syscalls			275 /* length of syscall table */
-+#define NR_syscalls			278 /* length of syscall table */
- 
- #define __ARCH_WANT_SYS_RT_SIGACTION
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-powerpc/stat.h vanilla-new/include/asm-powerpc/stat.h
---- vanilla/include/asm-powerpc/stat.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/asm-powerpc/stat.h	2006-05-05 11:48:16.000000000 -0500
-@@ -55,6 +55,37 @@
- #endif
- };
- 
-+struct stat_lite {
-+	unsigned long	st_dev;
-+	ino_t		st_ino;
-+#ifdef __powerpc64__
-+	nlink_t		st_nlink;
-+	mode_t		st_mode;
-+#else
-+	mode_t		st_mode;
-+	nlink_t		st_nlink;
-+#endif
-+	uid_t		st_uid;
-+	gid_t		st_gid;
-+	unsigned long	st_rdev;
-+	unsigned long  st_litemask;
-+	off_t		st_size;
-+	unsigned long	st_blksize;
-+	unsigned long	st_blocks;
-+	unsigned long	st_atime;
-+	unsigned long	st_atime_nsec;
-+	unsigned long	st_mtime;
-+	unsigned long	st_mtime_nsec;
-+	unsigned long	st_ctime;
-+	unsigned long	st_ctime_nsec;
-+	unsigned long	__unused4;
-+	unsigned long	__unused5;
-+#ifdef __powerpc64__
-+	unsigned long	__unused6;
-+#endif
-+};
-+
-+
- /* This matches struct stat64 in glibc2.1. Only used for 32 bit. */
- struct stat64 {
- 	unsigned long long st_dev;		/* Device.  */
-@@ -78,4 +109,28 @@
- 	unsigned int	__unused5;
- };
- 
-+/* This matches struct stat64_lite in glibc2.1. Only used for 32 bit. */
-+struct stat64_lite {
-+	unsigned long long st_dev;		/* Device.  */
-+	unsigned long long st_ino;		/* File serial number.  */
-+	unsigned int	st_mode;	/* File mode.  */
-+	unsigned int	st_nlink;	/* Link count.  */
-+	unsigned int	st_uid;		/* User ID of the file's owner.  */
-+	unsigned int	st_gid;		/* Group ID of the file's group. */
-+	unsigned long long st_rdev;	/* Device number, if device.  */
-+	unsigned short	__pad2;
-+	unsigned long  st_litemask;
-+	long long	st_size;	/* Size of file, in bytes.  */
-+	int		st_blksize;	/* Optimal block size for I/O.  */
-+	long long	st_blocks;	/* Number 512-byte blocks allocated. */
-+	int		st_atime;	/* Time of last access.  */
-+	unsigned int	st_atime_nsec;
-+	int		st_mtime;	/* Time of last modification.  */
-+	unsigned int	st_mtime_nsec;
-+	int		st_ctime;	/* Time of last status change.  */
-+	unsigned int	st_ctime_nsec;
-+	unsigned int	__unused4;
-+	unsigned int	__unused5;
-+};
-+
- #endif /* _ASM_POWERPC_STAT_H */
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/compat.h vanilla-new/include/asm-x86_64/compat.h
---- vanilla/include/asm-x86_64/compat.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/asm-x86_64/compat.h	2006-05-05 13:56:12.000000000 -0500
-@@ -69,6 +69,30 @@
- 	u32		__unused5;
- };
- 
-+struct compat_stat_lite {
-+	compat_dev_t	st_dev;
-+	u16		__pad1;
-+	compat_ino_t	st_ino;
-+	compat_mode_t	st_mode;
-+	compat_nlink_t	st_nlink;
-+	__compat_uid_t	st_uid;
-+	__compat_gid_t	st_gid;
-+	compat_dev_t	st_rdev;
-+	u16		__pad2;
-+	u32      st_litemask;
-+	u32		st_size;
-+	u32		st_blksize;
-+	u32		st_blocks;
-+	u32		st_atime;
-+	u32		st_atime_nsec;
-+	u32		st_mtime;
-+	u32		st_mtime_nsec;
-+	u32		st_ctime;
-+	u32		st_ctime_nsec;
-+	u32		__unused4;
-+	u32		__unused5;
-+};
-+
- struct compat_flock {
- 	short		l_type;
- 	short		l_whence;
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/stat.h vanilla-new/include/asm-x86_64/stat.h
---- vanilla/include/asm-x86_64/stat.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/asm-x86_64/stat.h	2006-05-05 17:05:54.000000000 -0500
-@@ -26,6 +26,30 @@
-   	long		__unused[3];
- };
- 
-+struct stat_lite {
-+	unsigned long	st_dev;
-+	unsigned long	st_ino;
-+	unsigned long	st_nlink;
-+
-+	unsigned int	st_mode;
-+	unsigned int	st_uid;
-+	unsigned int	st_gid;
-+	unsigned int	__pad0;
-+	unsigned long	st_rdev;
-+	unsigned long  st_litemask;
-+	long		st_size;
-+	long		st_blksize;
-+	long		st_blocks;	/* Number 512-byte blocks allocated. */
-+
-+	unsigned long	st_atime;
-+	unsigned long 	st_atime_nsec; 
-+	unsigned long	st_mtime;
-+	unsigned long	st_mtime_nsec;
-+	unsigned long	st_ctime;
-+	unsigned long   st_ctime_nsec;
-+  	long		__unused[3];
-+};
-+
- /* For 32bit emulation */
- struct __old_kernel_stat {
- 	unsigned short st_dev;
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/asm-x86_64/unistd.h vanilla-new/include/asm-x86_64/unistd.h
---- vanilla/include/asm-x86_64/unistd.h	2006-05-05 13:59:14.000000000 -0500
-+++ vanilla-new/include/asm-x86_64/unistd.h	2006-05-05 15:18:33.000000000 -0500
-@@ -609,8 +609,14 @@
- __SYSCALL(__NR_openg,   sys_openg)
- #define __NR_openfh     274
- __SYSCALL(__NR_openfh,  sys_openfh)
-+#define __NR_newstatlite   275
-+__SYSCALL(__NR_newstatlite, sys_newstatlite)
-+#define __NR_newlstatlite  276
-+__SYSCALL(__NR_newlstatlite, sys_newlstatlite)
-+#define __NR_newfstatlite  277
-+__SYSCALL(__NR_newfstatlite, sys_newfstatlite)
- 
--#define __NR_syscall_max __NR_openfh
-+#define __NR_syscall_max __NR_newfstatlite
- 
- #ifndef __NO_STUBS
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/compat.h vanilla-new/include/linux/compat.h
---- vanilla/include/linux/compat.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/linux/compat.h	2006-05-05 16:19:58.000000000 -0500
-@@ -52,6 +52,7 @@
- } compat_sigset_t;
- 
- extern int cp_compat_stat(struct kstat *, struct compat_stat __user *);
-+extern int cp_compat_statlite(struct kstat_lite *, struct compat_stat_lite __user *);
- extern int get_compat_timespec(struct timespec *, const struct compat_timespec __user *);
- extern int put_compat_timespec(const struct timespec *, struct compat_timespec __user *);
- 
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/fs.h vanilla-new/include/linux/fs.h
---- vanilla/include/linux/fs.h	2006-05-05 13:59:14.000000000 -0500
-+++ vanilla-new/include/linux/fs.h	2006-05-05 16:55:19.000000000 -0500
-@@ -1065,6 +1065,7 @@
- 	int (*permission) (struct inode *, int, struct nameidata *);
- 	int (*setattr) (struct dentry *, struct iattr *);
- 	int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
-+	int (*getattr_lite) (struct vfsmount *mnt, struct dentry *, struct kstat_lite *);
- 	int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
- 	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);
- 	ssize_t (*listxattr) (struct dentry *, char *, size_t);
-@@ -1702,7 +1703,9 @@
- extern struct inode_operations page_symlink_inode_operations;
- extern int generic_readlink(struct dentry *, char __user *, int);
- extern void generic_fillattr(struct inode *, struct kstat *);
-+extern void generic_fillattr_lite(struct inode *, struct kstat_lite *);
- extern int vfs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
-+extern int vfs_getattr_lite(struct vfsmount *, struct dentry *, struct kstat_lite *);
- void inode_add_bytes(struct inode *inode, loff_t bytes);
- void inode_sub_bytes(struct inode *inode, loff_t bytes);
- loff_t inode_get_bytes(struct inode *inode);
-@@ -1711,10 +1714,15 @@
- extern int vfs_readdir(struct file *, filldir_t, void *);
- 
- extern int vfs_stat(char __user *, struct kstat *);
-+extern int vfs_statlite(char __user *, struct kstat_lite *);
- extern int vfs_lstat(char __user *, struct kstat *);
-+extern int vfs_lstatlite(char __user *, struct kstat_lite *);
- extern int vfs_stat_fd(int dfd, char __user *, struct kstat *);
-+extern int vfs_statlite_fd(int dfd, char __user *, struct kstat_lite *);
- extern int vfs_lstat_fd(int dfd, char __user *, struct kstat *);
-+extern int vfs_lstatlite_fd(int dfd, char __user *, struct kstat_lite *);
- extern int vfs_fstat(unsigned int, struct kstat *);
-+extern int vfs_fstatlite(unsigned int, struct kstat_lite *);
- 
- extern int vfs_ioctl(struct file *, unsigned int, unsigned int, unsigned long);
- 
-@@ -1728,6 +1736,7 @@
- extern loff_t dcache_dir_lseek(struct file *, loff_t, int);
- extern int dcache_readdir(struct file *, void *, filldir_t);
- extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *);
-+extern int simple_getattr_lite(struct vfsmount *, struct dentry *, struct kstat_lite *);
- extern int simple_statfs(struct super_block *, struct kstatfs *);
- extern int simple_link(struct dentry *, struct inode *, struct dentry *);
- extern int simple_unlink(struct inode *, struct dentry *);
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/stat.h vanilla-new/include/linux/stat.h
---- vanilla/include/linux/stat.h	2006-03-19 23:53:29.000000000 -0600
-+++ vanilla-new/include/linux/stat.h	2006-05-05 17:00:11.000000000 -0500
-@@ -44,6 +44,22 @@
- #define S_IWOTH 00002
- #define S_IXOTH 00001
- 
-+#define S_SLITE_SIZET     0x1
-+#define S_SLITE_BLKSIZE   0x2
-+#define S_SLITE_BLOCKS    0x4
-+#define S_SLITE_ATIME     0x8
-+#define S_SLITE_MTIME     0x10
-+#define S_SLITE_CTIME     0x20
-+#define S_SLITE_ALL       (S_SLITE_SIZET | S_SLITE_BLKSIZE | S_SLITE_BLOCKS \
-+									S_SLITE_ATIME | S_SLITE_MTIME   | S_SLITE_CTIME)
-+
-+#define SLITE_SIZET(m)    ((m) & S_SLITE_SIZET)
-+#define SLITE_BLKSIZE(m)  ((m) & S_SLITE_BLKSIZE)
-+#define SLITE_BLOCKS(m)   ((m) & S_SLITE_BLOCKS)
-+#define SLITE_ATIME(m)    ((m) & S_SLITE_ATIME)
-+#define SLITE_MTIME(m)    ((m) & S_SLITE_MTIME)
-+#define SLITE_CTIME(m)    ((m) & S_SLITE_CTIME)
-+
- #endif
- 
- #ifdef __KERNEL__
-@@ -72,6 +88,24 @@
- 	unsigned long	blocks;
- };
- 
-+struct kstat_lite {
-+	unsigned long	ino;
-+	dev_t		dev;
-+	umode_t		mode;
-+	unsigned int	nlink;
-+	uid_t		uid;
-+	gid_t		gid;
-+	dev_t		rdev;
-+	unsigned long  lite_mask;
-+	/* Fields below this are optional */
-+	loff_t		size;
-+	struct timespec  atime;
-+	struct timespec	mtime;
-+	struct timespec	ctime;
-+	unsigned long	blksize;
-+	unsigned long	blocks;
-+};
-+
- #endif
- 
- #endif
-diff -Naur --exclude-from=/home/vilayann/redhat/BUILD/kernel-2.6.16/exclude vanilla/include/linux/syscalls.h vanilla-new/include/linux/syscalls.h
---- vanilla/include/linux/syscalls.h	2006-05-05 13:59:14.000000000 -0500
-+++ vanilla-new/include/linux/syscalls.h	2006-05-05 17:12:01.000000000 -0500
-@@ -38,7 +38,9 @@
- struct shmid_ds;
- struct sockaddr;
- struct stat;
-+struct stat_lite;
- struct stat64;
-+struct stat64_lite;
- struct statfs;
- struct statfs64;
- struct __sysctl_args;
-@@ -226,16 +228,29 @@
- 			struct __old_kernel_stat __user *statbuf);
- asmlinkage long sys_newstat(char __user *filename,
- 				struct stat __user *statbuf);
-+asmlinkage long sys_newstatlite(char __user *filename,
-+				struct stat_lite __user *statlitebuf);
- asmlinkage long sys_newlstat(char __user *filename,
- 				struct stat __user *statbuf);
-+asmlinkage long sys_newlstatlite(char __user *filename,
-+				struct stat_lite __user *statlitebuf);
- asmlinkage long sys_newfstat(unsigned int fd, struct stat __user *statbuf);
-+asmlinkage long sys_newfstatlite(unsigned int fd, 
-+				struct stat_lite __user *statlitebuf);
- asmlinkage long sys_ustat(unsigned dev, struct ustat __user *ubuf);
- #if BITS_PER_LONG == 32
- asmlinkage long sys_stat64(char __user *filename,
- 				struct stat64 __user *statbuf);
--asmlinkage long sys_fstat64(unsigned long fd, struct stat64 __user *statbuf);
-+asmlinkage long sys_statlite64(char __user *filename,
-+				struct stat64_lite __user *statlitebuf);
-+asmlinkage long sys_fstat64(unsigned long fd, 
-+				struct stat64 __user *statbuf);
-+asmlinkage long sys_fstatlite64(unsigned long fd,
-+				struct stat64_lite __user *statlitebuf);
- asmlinkage long sys_lstat64(char __user *filename,
- 				struct stat64 __user *statbuf);
-+asmlinkage long sys_lstatlite64(char __user *filename,
-+				struct stat64_lite __user *statlitebuf);
- asmlinkage long sys_truncate64(const char __user *path, loff_t length);
- asmlinkage long sys_ftruncate64(unsigned int fd, loff_t length);
- #endif



More information about the Pvfs2-cvs mailing list