aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ecryptfs/inode.c
diff options
context:
space:
mode:
authorMichael Halcrow <mhalcrow@us.ibm.com>2007-02-12 03:53:47 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-02-12 12:48:36 -0500
commite77a56ddceeec87575a13a60fc1a394af6a1f4bc (patch)
tree8be21cc4afbc0596716bc9d4d8dd145dd8c74252 /fs/ecryptfs/inode.c
parentdd2a3b7ad98f8482cae481cad89dfed5eee48365 (diff)
[PATCH] eCryptfs: Encrypted passthrough
Provide an option to provide a view of the encrypted files such that the metadata is always in the header of the files, regardless of whether the metadata is actually in the header or in the extended attribute. This mode of operation is useful for applications like incremental backup utilities that do not preserve the extended attributes when directly accessing the lower files. With this option enabled, the files under the eCryptfs mount point will be read-only. Signed-off-by: Michael Halcrow <mhalcrow@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/ecryptfs/inode.c')
-rw-r--r--fs/ecryptfs/inode.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
index 6b45b2908f17..bbc1b4f666fe 100644
--- a/fs/ecryptfs/inode.c
+++ b/fs/ecryptfs/inode.c
@@ -289,6 +289,7 @@ static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry,
289 char *encoded_name; 289 char *encoded_name;
290 unsigned int encoded_namelen; 290 unsigned int encoded_namelen;
291 struct ecryptfs_crypt_stat *crypt_stat = NULL; 291 struct ecryptfs_crypt_stat *crypt_stat = NULL;
292 struct ecryptfs_mount_crypt_stat *mount_crypt_stat;
292 char *page_virt = NULL; 293 char *page_virt = NULL;
293 struct inode *lower_inode; 294 struct inode *lower_inode;
294 u64 file_size; 295 u64 file_size;
@@ -388,8 +389,18 @@ static struct dentry *ecryptfs_lookup(struct inode *dir, struct dentry *dentry,
388 } 389 }
389 crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR; 390 crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR;
390 } 391 }
391 memcpy(&file_size, page_virt, sizeof(file_size)); 392 mount_crypt_stat = &ecryptfs_superblock_to_private(
392 file_size = be64_to_cpu(file_size); 393 dentry->d_sb)->mount_crypt_stat;
394 if (mount_crypt_stat->flags & ECRYPTFS_ENCRYPTED_VIEW_ENABLED) {
395 if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
396 file_size = (crypt_stat->header_extent_size
397 + i_size_read(lower_dentry->d_inode));
398 else
399 file_size = i_size_read(lower_dentry->d_inode);
400 } else {
401 memcpy(&file_size, page_virt, sizeof(file_size));
402 file_size = be64_to_cpu(file_size);
403 }
393 i_size_write(dentry->d_inode, (loff_t)file_size); 404 i_size_write(dentry->d_inode, (loff_t)file_size);
394 kmem_cache_free(ecryptfs_header_cache_2, page_virt); 405 kmem_cache_free(ecryptfs_header_cache_2, page_virt);
395 goto out; 406 goto out;