diff options
author | Tyler Hicks <tyhicks@linux.vnet.ibm.com> | 2010-02-11 08:10:38 -0500 |
---|---|---|
committer | Tyler Hicks <tyhicks@linux.vnet.ibm.com> | 2010-03-23 13:29:49 -0400 |
commit | 157f1071354db1aed885816094888e0e257c9d0a (patch) | |
tree | 711d00d7dce97f846342db0a27b4a61c6b1966a4 /fs/ecryptfs/crypto.c | |
parent | 220bf991b0366cc50a94feede3d7341fa5710ee4 (diff) |
eCryptfs: Fix metadata in xattr feature regression
Fixes regression in 8faece5f906725c10e7a1f6caf84452abadbdc7b
When using the ecryptfs_xattr_metadata mount option, eCryptfs stores the
metadata (normally stored at the front of the file) in the user.ecryptfs
xattr. This causes ecryptfs_crypt_stat.num_header_bytes_at_front to be
0, since there is no header data at the front of the file. This results
in too much memory being requested and ENOMEM being returned from
ecryptfs_write_metadata().
This patch fixes the problem by using the num_header_bytes_at_front
variable for specifying the max size of the metadata, despite whether it
is stored in the header or xattr.
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Tyler Hicks <tyhicks@linux.vnet.ibm.com>
Diffstat (limited to 'fs/ecryptfs/crypto.c')
-rw-r--r-- | fs/ecryptfs/crypto.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 7cb0a59f4b9d..c907f6f49351 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
@@ -381,8 +381,8 @@ out: | |||
381 | static void ecryptfs_lower_offset_for_extent(loff_t *offset, loff_t extent_num, | 381 | static void ecryptfs_lower_offset_for_extent(loff_t *offset, loff_t extent_num, |
382 | struct ecryptfs_crypt_stat *crypt_stat) | 382 | struct ecryptfs_crypt_stat *crypt_stat) |
383 | { | 383 | { |
384 | (*offset) = (crypt_stat->num_header_bytes_at_front | 384 | (*offset) = ecryptfs_lower_header_size(crypt_stat) |
385 | + (crypt_stat->extent_size * extent_num)); | 385 | + (crypt_stat->extent_size * extent_num); |
386 | } | 386 | } |
387 | 387 | ||
388 | /** | 388 | /** |
@@ -834,7 +834,8 @@ void ecryptfs_set_default_sizes(struct ecryptfs_crypt_stat *crypt_stat) | |||
834 | set_extent_mask_and_shift(crypt_stat); | 834 | set_extent_mask_and_shift(crypt_stat); |
835 | crypt_stat->iv_bytes = ECRYPTFS_DEFAULT_IV_BYTES; | 835 | crypt_stat->iv_bytes = ECRYPTFS_DEFAULT_IV_BYTES; |
836 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) | 836 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) |
837 | crypt_stat->num_header_bytes_at_front = 0; | 837 | crypt_stat->num_header_bytes_at_front = |
838 | ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE; | ||
838 | else { | 839 | else { |
839 | if (PAGE_CACHE_SIZE <= ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE) | 840 | if (PAGE_CACHE_SIZE <= ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE) |
840 | crypt_stat->num_header_bytes_at_front = | 841 | crypt_stat->num_header_bytes_at_front = |