diff -urN oldtree/fs/ecryptfs/file.c newtree/fs/ecryptfs/file.c
--- oldtree/fs/ecryptfs/file.c	2006-09-24 17:03:56.000000000 -0400
+++ newtree/fs/ecryptfs/file.c	2006-09-26 18:58:23.000000000 -0400
@@ -144,7 +144,6 @@
 	int decoded_length;
 	char *decoded_name;
 
-
 	crypt_stat = ecryptfs_dentry_to_private(buf->dentry)->crypt_stat;
 	buf->filldir_called++;
 	decoded_length = ecryptfs_decode_filename(crypt_stat, name, namelen,
@@ -176,6 +175,7 @@
 	struct ecryptfs_getdents_callback buf;
 
 	lower_file = ecryptfs_file_to_lower(file);
+	lower_file->f_pos = file->f_pos;
 	inode = file->f_dentry->d_inode;
 	memset(&buf, 0, sizeof(buf));
 	buf.dirent = dirent;
@@ -218,18 +218,19 @@
 	struct inode *lower_inode = NULL;
 	struct file *lower_file = NULL;
 	struct vfsmount *lower_mnt;
+	struct ecryptfs_file_info *file_info;
 	int lower_flags;
 
 	/* Released in ecryptfs_release or end of function if failure */
-	ecryptfs_set_file_private(file,
-				  kmem_cache_alloc(ecryptfs_file_info_cache,
-						   SLAB_KERNEL));
-	if (!ecryptfs_file_to_private(file)) {
+	file_info = kmem_cache_alloc(ecryptfs_file_info_cache, SLAB_KERNEL);
+	ecryptfs_set_file_private(file, file_info);
+	if (!file_info) {
 		ecryptfs_printk(KERN_ERR,
 				"Error attempting to allocate memory\n");
 		rc = -ENOMEM;
 		goto out;
 	}
+	memset(file_info, 0, sizeof(*file_info));
 	lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry);
 	crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
 	mutex_lock(&crypt_stat->cs_mutex);
