diff -urN ../linux-2.6.19-orig/fs/proc/base.c fs/proc/base.c
--- ../linux-2.6.19-orig/fs/proc/base.c	2006-11-30 06:57:37 +0900
+++ fs/proc/base.c	2006-12-05 01:16:07 +0900
@@ -1010,7 +1010,7 @@
  * due to the way we treat inodes.
  *
  * Rewrite the inode's ownerships here because the owning task may have
- * performed a setuid(), etc.
+ * performed a setuid(), etc.  Also update file position for FD entries.
  *
  * Before the /proc/pid/status file was created the only way to read
  * the effective uid of a /process was to stat /proc/pid.  Reading
@@ -1173,12 +1173,15 @@
 	struct task_struct *task = get_proc_task(inode);
 	int fd = proc_fd(inode);
 	struct files_struct *files;
+	struct file *file;
 
 	if (task) {
 		files = get_files_struct(task);
 		if (files) {
 			rcu_read_lock();
-			if (fcheck_files(files, fd)) {
+			file = fcheck_files(files, fd);
+			if (file) {
+				inode->i_size = file->f_pos;
 				rcu_read_unlock();
 				put_files_struct(files);
 				if (task_dumpable(task)) {
@@ -1244,7 +1247,7 @@
 	put_files_struct(files);
 
 	inode->i_op = &proc_pid_link_inode_operations;
-	inode->i_size = 64;
+	inode->i_size = file->f_pos;
 	ei->op.proc_get_link = proc_fd_link;
 	dentry->d_op = &tid_fd_dentry_operations;
 	d_add(dentry, inode);
