diff options
-rw-r--r-- | fs/ecryptfs/crypto.c | 50 |
1 files changed, 14 insertions, 36 deletions
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 9845d2fd2506..9947388ccd8d 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
@@ -40,10 +40,6 @@ | |||
40 | #define DECRYPT 0 | 40 | #define DECRYPT 0 |
41 | #define ENCRYPT 1 | 41 | #define ENCRYPT 1 |
42 | 42 | ||
43 | static int crypt_page_offset(struct ecryptfs_crypt_stat *crypt_stat, | ||
44 | struct page *dst_page, struct page *src_page, | ||
45 | int offset, int size, unsigned char *iv, int op); | ||
46 | |||
47 | /** | 43 | /** |
48 | * ecryptfs_to_hex | 44 | * ecryptfs_to_hex |
49 | * @dst: Buffer to take hex character representation of contents of | 45 | * @dst: Buffer to take hex character representation of contents of |
@@ -436,10 +432,11 @@ static int crypt_extent(struct page *dst_page, | |||
436 | pgoff_t page_index = op == ENCRYPT ? src_page->index : dst_page->index; | 432 | pgoff_t page_index = op == ENCRYPT ? src_page->index : dst_page->index; |
437 | loff_t extent_base; | 433 | loff_t extent_base; |
438 | char extent_iv[ECRYPTFS_MAX_IV_BYTES]; | 434 | char extent_iv[ECRYPTFS_MAX_IV_BYTES]; |
435 | struct scatterlist src_sg, dst_sg; | ||
436 | size_t extent_size = crypt_stat->extent_size; | ||
439 | int rc; | 437 | int rc; |
440 | 438 | ||
441 | extent_base = (((loff_t)page_index) | 439 | extent_base = (((loff_t)page_index) * (PAGE_CACHE_SIZE / extent_size)); |
442 | * (PAGE_CACHE_SIZE / crypt_stat->extent_size)); | ||
443 | rc = ecryptfs_derive_iv(extent_iv, crypt_stat, | 440 | rc = ecryptfs_derive_iv(extent_iv, crypt_stat, |
444 | (extent_base + extent_offset)); | 441 | (extent_base + extent_offset)); |
445 | if (rc) { | 442 | if (rc) { |
@@ -448,9 +445,17 @@ static int crypt_extent(struct page *dst_page, | |||
448 | (unsigned long long)(extent_base + extent_offset), rc); | 445 | (unsigned long long)(extent_base + extent_offset), rc); |
449 | goto out; | 446 | goto out; |
450 | } | 447 | } |
451 | rc = crypt_page_offset(crypt_stat, dst_page, src_page, | 448 | |
452 | (extent_offset * crypt_stat->extent_size), | 449 | sg_init_table(&src_sg, 1); |
453 | crypt_stat->extent_size, extent_iv, op); | 450 | sg_init_table(&dst_sg, 1); |
451 | |||
452 | sg_set_page(&src_sg, src_page, extent_size, | ||
453 | extent_offset * extent_size); | ||
454 | sg_set_page(&dst_sg, dst_page, extent_size, | ||
455 | extent_offset * extent_size); | ||
456 | |||
457 | rc = crypt_scatterlist(crypt_stat, &dst_sg, &src_sg, extent_size, | ||
458 | extent_iv, op); | ||
454 | if (rc < 0) { | 459 | if (rc < 0) { |
455 | printk(KERN_ERR "%s: Error attempting to crypt page with " | 460 | printk(KERN_ERR "%s: Error attempting to crypt page with " |
456 | "page_index = [%ld], extent_offset = [%ld]; " | 461 | "page_index = [%ld], extent_offset = [%ld]; " |
@@ -588,33 +593,6 @@ out: | |||
588 | return rc; | 593 | return rc; |
589 | } | 594 | } |
590 | 595 | ||
591 | /** | ||
592 | * crypt_page_offset | ||
593 | * @crypt_stat: The cryptographic context | ||
594 | * @dst_page: The page to write the result into | ||
595 | * @src_page: The page to read from | ||
596 | * @offset: The byte offset into the dst_page and src_page | ||
597 | * @size: The number of bytes of data | ||
598 | * @iv: The initialization vector to use for the crypto operation | ||
599 | * @op: ENCRYPT or DECRYPT to indicate the desired operation | ||
600 | * | ||
601 | * Returns the number of bytes encrypted or decrypted | ||
602 | */ | ||
603 | static int crypt_page_offset(struct ecryptfs_crypt_stat *crypt_stat, | ||
604 | struct page *dst_page, struct page *src_page, | ||
605 | int offset, int size, unsigned char *iv, int op) | ||
606 | { | ||
607 | struct scatterlist src_sg, dst_sg; | ||
608 | |||
609 | sg_init_table(&src_sg, 1); | ||
610 | sg_init_table(&dst_sg, 1); | ||
611 | |||
612 | sg_set_page(&src_sg, src_page, size, offset); | ||
613 | sg_set_page(&dst_sg, dst_page, size, offset); | ||
614 | |||
615 | return crypt_scatterlist(crypt_stat, &dst_sg, &src_sg, size, iv, op); | ||
616 | } | ||
617 | |||
618 | #define ECRYPTFS_MAX_SCATTERLIST_LEN 4 | 596 | #define ECRYPTFS_MAX_SCATTERLIST_LEN 4 |
619 | 597 | ||
620 | /** | 598 | /** |