Revert "eCryptfs: Handle failed metadata read in lookup"
authorHerton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
Mon, 12 Sep 2011 20:02:37 +0000 (17:02 -0300)
committerHerton Ronaldo Krzesinski <herton.krzesinski@canonical.com>
Mon, 12 Sep 2011 20:02:37 +0000 (17:02 -0300)
This fix was not verified in the -proposed kernel to have resolved the
problem, so the patch is being reverted.

This reverts commit 8953034e6cb4b4f7cca0c1bf617ee37b5aa1ed77.

Signed-off-by: Herton Ronaldo Krzesinski <herton.krzesinski@canonical.com>

fs/ecryptfs/crypto.c
fs/ecryptfs/ecryptfs_kernel.h
fs/ecryptfs/file.c
fs/ecryptfs/inode.c

index 97b0a86..bfd8b68 100644 (file)
@@ -1452,25 +1452,6 @@ static void set_default_header_data(struct ecryptfs_crypt_stat *crypt_stat)
        crypt_stat->metadata_size = ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE;
 }
 
        crypt_stat->metadata_size = ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE;
 }
 
-void ecryptfs_i_size_init(const char *page_virt, struct inode *inode)
-{
-       struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
-       struct ecryptfs_crypt_stat *crypt_stat;
-       u64 file_size;
-
-       crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat;
-       mount_crypt_stat =
-               &ecryptfs_superblock_to_private(inode->i_sb)->mount_crypt_stat;
-       if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) {
-               file_size = i_size_read(ecryptfs_inode_to_lower(inode));
-               if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
-                       file_size += crypt_stat->metadata_size;
-       } else
-               file_size = get_unaligned_be64(page_virt);
-       i_size_write(inode, (loff_t)file_size);
-       crypt_stat->flags |= ECRYPTFS_I_SIZE_INITIALIZED;
-}
-
 /**
  * ecryptfs_read_headers_virt
  * @page_virt: The virtual address into which to read the headers
 /**
  * ecryptfs_read_headers_virt
  * @page_virt: The virtual address into which to read the headers
@@ -1501,8 +1482,6 @@ static int ecryptfs_read_headers_virt(char *page_virt,
                rc = -EINVAL;
                goto out;
        }
                rc = -EINVAL;
                goto out;
        }
-       if (!(crypt_stat->flags & ECRYPTFS_I_SIZE_INITIALIZED))
-               ecryptfs_i_size_init(page_virt, ecryptfs_dentry->d_inode);
        offset += MAGIC_ECRYPTFS_MARKER_SIZE_BYTES;
        rc = ecryptfs_process_flags(crypt_stat, (page_virt + offset),
                                    &bytes_read);
        offset += MAGIC_ECRYPTFS_MARKER_SIZE_BYTES;
        rc = ecryptfs_process_flags(crypt_stat, (page_virt + offset),
                                    &bytes_read);
index 40efaa7..e007534 100644 (file)
@@ -270,7 +270,6 @@ struct ecryptfs_crypt_stat {
 #define ECRYPTFS_ENCFN_USE_MOUNT_FNEK 0x00001000
 #define ECRYPTFS_ENCFN_USE_FEK        0x00002000
 #define ECRYPTFS_UNLINK_SIGS         0x00004000
 #define ECRYPTFS_ENCFN_USE_MOUNT_FNEK 0x00001000
 #define ECRYPTFS_ENCFN_USE_FEK        0x00002000
 #define ECRYPTFS_UNLINK_SIGS         0x00004000
-#define ECRYPTFS_I_SIZE_INITIALIZED   0x00008000
        u32 flags;
        unsigned int file_version;
        size_t iv_bytes;
        u32 flags;
        unsigned int file_version;
        size_t iv_bytes;
@@ -631,7 +630,6 @@ struct ecryptfs_open_req {
 int ecryptfs_interpose(struct dentry *hidden_dentry,
                       struct dentry *this_dentry, struct super_block *sb,
                       u32 flags);
 int ecryptfs_interpose(struct dentry *hidden_dentry,
                       struct dentry *this_dentry, struct super_block *sb,
                       u32 flags);
-void ecryptfs_i_size_init(const char *page_virt, struct inode *inode);
 int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
                                        struct dentry *lower_dentry,
                                        struct inode *ecryptfs_dir_inode);
 int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
                                        struct dentry *lower_dentry,
                                        struct inode *ecryptfs_dir_inode);
index d30aac2..7d1050e 100644 (file)
@@ -211,8 +211,7 @@ static int ecryptfs_open(struct inode *inode, struct file *file)
        if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) {
                ecryptfs_printk(KERN_DEBUG, "This is a directory\n");
                mutex_lock(&crypt_stat->cs_mutex);
        if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) {
                ecryptfs_printk(KERN_DEBUG, "This is a directory\n");
                mutex_lock(&crypt_stat->cs_mutex);
-               crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED
-                                       | ECRYPTFS_ENCRYPTED);
+               crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
                mutex_unlock(&crypt_stat->cs_mutex);
                rc = 0;
                goto out;
                mutex_unlock(&crypt_stat->cs_mutex);
                rc = 0;
                goto out;
index 274d573..b592938 100644 (file)
@@ -250,8 +250,10 @@ int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
        struct dentry *lower_dir_dentry;
        struct vfsmount *lower_mnt;
        struct inode *lower_inode;
        struct dentry *lower_dir_dentry;
        struct vfsmount *lower_mnt;
        struct inode *lower_inode;
+       struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
        struct ecryptfs_crypt_stat *crypt_stat;
        char *page_virt = NULL;
        struct ecryptfs_crypt_stat *crypt_stat;
        char *page_virt = NULL;
+       u64 file_size;
        int rc = 0;
 
        lower_dir_dentry = lower_dentry->d_parent;
        int rc = 0;
 
        lower_dir_dentry = lower_dentry->d_parent;
@@ -324,7 +326,18 @@ int ecryptfs_lookup_and_interpose_lower(struct dentry *ecryptfs_dentry,
                }
                crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR;
        }
                }
                crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR;
        }
-       ecryptfs_i_size_init(page_virt, ecryptfs_dentry->d_inode);
+       mount_crypt_stat = &ecryptfs_superblock_to_private(
+               ecryptfs_dentry->d_sb)->mount_crypt_stat;
+       if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) {
+               if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
+                       file_size = (crypt_stat->metadata_size
+                                    + i_size_read(lower_dentry->d_inode));
+               else
+                       file_size = i_size_read(lower_dentry->d_inode);
+       } else {
+               file_size = get_unaligned_be64(page_virt);
+       }
+       i_size_write(ecryptfs_dentry->d_inode, (loff_t)file_size);
 out_free_kmem:
        kmem_cache_free(ecryptfs_header_cache_2, page_virt);
        goto out;
 out_free_kmem:
        kmem_cache_free(ecryptfs_header_cache_2, page_virt);
        goto out;
@@ -938,8 +951,7 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia)
                                goto out;
                        }
                        rc = 0;
                                goto out;
                        }
                        rc = 0;
-                       crypt_stat->flags &= ~(ECRYPTFS_I_SIZE_INITIALIZED
-                                               | ECRYPTFS_ENCRYPTED);
+                       crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
                }
        }
        mutex_unlock(&crypt_stat->cs_mutex);
                }
        }
        mutex_unlock(&crypt_stat->cs_mutex);