diff options
author | Michael Halcrow <mhalcrow@us.ibm.com> | 2007-02-12 03:53:47 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-12 12:48:36 -0500 |
commit | e77a56ddceeec87575a13a60fc1a394af6a1f4bc (patch) | |
tree | 8be21cc4afbc0596716bc9d4d8dd145dd8c74252 /fs/ecryptfs/crypto.c | |
parent | dd2a3b7ad98f8482cae481cad89dfed5eee48365 (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/crypto.c')
-rw-r--r-- | fs/ecryptfs/crypto.c | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 96fa40a48b4f..44c2ec2e9e6a 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
@@ -1256,9 +1256,10 @@ out: | |||
1256 | } | 1256 | } |
1257 | 1257 | ||
1258 | 1258 | ||
1259 | static void | 1259 | void |
1260 | write_header_metadata(char *virt, struct ecryptfs_crypt_stat *crypt_stat, | 1260 | ecryptfs_write_header_metadata(char *virt, |
1261 | size_t *written) | 1261 | struct ecryptfs_crypt_stat *crypt_stat, |
1262 | size_t *written) | ||
1262 | { | 1263 | { |
1263 | u32 header_extent_size; | 1264 | u32 header_extent_size; |
1264 | u16 num_header_extents_at_front; | 1265 | u16 num_header_extents_at_front; |
@@ -1320,7 +1321,8 @@ static int ecryptfs_write_headers_virt(char *page_virt, size_t *size, | |||
1320 | offset += written; | 1321 | offset += written; |
1321 | write_ecryptfs_flags((page_virt + offset), crypt_stat, &written); | 1322 | write_ecryptfs_flags((page_virt + offset), crypt_stat, &written); |
1322 | offset += written; | 1323 | offset += written; |
1323 | write_header_metadata((page_virt + offset), crypt_stat, &written); | 1324 | ecryptfs_write_header_metadata((page_virt + offset), crypt_stat, |
1325 | &written); | ||
1324 | offset += written; | 1326 | offset += written; |
1325 | rc = ecryptfs_generate_key_packet_set((page_virt + offset), crypt_stat, | 1327 | rc = ecryptfs_generate_key_packet_set((page_virt + offset), crypt_stat, |
1326 | ecryptfs_dentry, &written, | 1328 | ecryptfs_dentry, &written, |
@@ -1606,7 +1608,12 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry, | |||
1606 | ssize_t bytes_read; | 1608 | ssize_t bytes_read; |
1607 | struct ecryptfs_crypt_stat *crypt_stat = | 1609 | struct ecryptfs_crypt_stat *crypt_stat = |
1608 | &ecryptfs_inode_to_private(ecryptfs_dentry->d_inode)->crypt_stat; | 1610 | &ecryptfs_inode_to_private(ecryptfs_dentry->d_inode)->crypt_stat; |
1611 | struct ecryptfs_mount_crypt_stat *mount_crypt_stat = | ||
1612 | &ecryptfs_superblock_to_private( | ||
1613 | ecryptfs_dentry->d_sb)->mount_crypt_stat; | ||
1609 | 1614 | ||
1615 | ecryptfs_copy_mount_wide_flags_to_inode_flags(crypt_stat, | ||
1616 | mount_crypt_stat); | ||
1610 | /* Read the first page from the underlying file */ | 1617 | /* Read the first page from the underlying file */ |
1611 | page_virt = kmem_cache_alloc(ecryptfs_header_cache_1, GFP_USER); | 1618 | page_virt = kmem_cache_alloc(ecryptfs_header_cache_1, GFP_USER); |
1612 | if (!page_virt) { | 1619 | if (!page_virt) { |