diff options
Diffstat (limited to 'fs/ecryptfs')
| -rw-r--r-- | fs/ecryptfs/crypto.c | 21 | ||||
| -rw-r--r-- | fs/ecryptfs/inode.c | 9 | ||||
| -rw-r--r-- | fs/ecryptfs/mmap.c | 11 | ||||
| -rw-r--r-- | fs/ecryptfs/read_write.c | 32 |
4 files changed, 41 insertions, 32 deletions
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index 8b65f289ee00..b91851f1cda3 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
| @@ -483,15 +483,7 @@ int ecryptfs_encrypt_page(struct page *page) | |||
| 483 | ecryptfs_inode = page->mapping->host; | 483 | ecryptfs_inode = page->mapping->host; |
| 484 | crypt_stat = | 484 | crypt_stat = |
| 485 | &(ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat); | 485 | &(ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat); |
| 486 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { | 486 | BUG_ON(!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)); |
| 487 | rc = ecryptfs_write_lower_page_segment(ecryptfs_inode, page, | ||
| 488 | 0, PAGE_CACHE_SIZE); | ||
| 489 | if (rc) | ||
| 490 | printk(KERN_ERR "%s: Error attempting to copy " | ||
| 491 | "page at index [%ld]\n", __func__, | ||
| 492 | page->index); | ||
| 493 | goto out; | ||
| 494 | } | ||
| 495 | enc_extent_page = alloc_page(GFP_USER); | 487 | enc_extent_page = alloc_page(GFP_USER); |
| 496 | if (!enc_extent_page) { | 488 | if (!enc_extent_page) { |
| 497 | rc = -ENOMEM; | 489 | rc = -ENOMEM; |
| @@ -620,16 +612,7 @@ int ecryptfs_decrypt_page(struct page *page) | |||
| 620 | ecryptfs_inode = page->mapping->host; | 612 | ecryptfs_inode = page->mapping->host; |
| 621 | crypt_stat = | 613 | crypt_stat = |
| 622 | &(ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat); | 614 | &(ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat); |
| 623 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { | 615 | BUG_ON(!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)); |
| 624 | rc = ecryptfs_read_lower_page_segment(page, page->index, 0, | ||
| 625 | PAGE_CACHE_SIZE, | ||
| 626 | ecryptfs_inode); | ||
| 627 | if (rc) | ||
| 628 | printk(KERN_ERR "%s: Error attempting to copy " | ||
| 629 | "page at index [%ld]\n", __func__, | ||
| 630 | page->index); | ||
| 631 | goto out; | ||
| 632 | } | ||
| 633 | enc_extent_page = alloc_page(GFP_USER); | 616 | enc_extent_page = alloc_page(GFP_USER); |
| 634 | if (!enc_extent_page) { | 617 | if (!enc_extent_page) { |
| 635 | rc = -ENOMEM; | 618 | rc = -ENOMEM; |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 55b3145b8072..5ed86e25b8a2 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
| @@ -814,6 +814,13 @@ int ecryptfs_truncate(struct dentry *dentry, loff_t new_length) | |||
| 814 | size_t num_zeros = (PAGE_CACHE_SIZE | 814 | size_t num_zeros = (PAGE_CACHE_SIZE |
| 815 | - (new_length & ~PAGE_CACHE_MASK)); | 815 | - (new_length & ~PAGE_CACHE_MASK)); |
| 816 | 816 | ||
| 817 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { | ||
| 818 | rc = vmtruncate(inode, new_length); | ||
| 819 | if (rc) | ||
| 820 | goto out_free; | ||
| 821 | rc = vmtruncate(lower_dentry->d_inode, new_length); | ||
| 822 | goto out_free; | ||
| 823 | } | ||
| 817 | if (num_zeros) { | 824 | if (num_zeros) { |
| 818 | char *zeros_virt; | 825 | char *zeros_virt; |
| 819 | 826 | ||
| @@ -915,8 +922,6 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia) | |||
| 915 | } | 922 | } |
| 916 | rc = 0; | 923 | rc = 0; |
| 917 | crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED); | 924 | crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED); |
| 918 | mutex_unlock(&crypt_stat->cs_mutex); | ||
| 919 | goto out; | ||
| 920 | } | 925 | } |
| 921 | } | 926 | } |
| 922 | mutex_unlock(&crypt_stat->cs_mutex); | 927 | mutex_unlock(&crypt_stat->cs_mutex); |
diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c index 46cec2b69796..5c6bab9786e3 100644 --- a/fs/ecryptfs/mmap.c +++ b/fs/ecryptfs/mmap.c | |||
| @@ -449,6 +449,7 @@ int ecryptfs_write_inode_size_to_metadata(struct inode *ecryptfs_inode) | |||
| 449 | struct ecryptfs_crypt_stat *crypt_stat; | 449 | struct ecryptfs_crypt_stat *crypt_stat; |
| 450 | 450 | ||
| 451 | crypt_stat = &ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat; | 451 | crypt_stat = &ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat; |
| 452 | BUG_ON(!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)); | ||
| 452 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) | 453 | if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) |
| 453 | return ecryptfs_write_inode_size_to_xattr(ecryptfs_inode); | 454 | return ecryptfs_write_inode_size_to_xattr(ecryptfs_inode); |
| 454 | else | 455 | else |
| @@ -490,6 +491,16 @@ static int ecryptfs_write_end(struct file *file, | |||
| 490 | ecryptfs_printk(KERN_DEBUG, "Not a new file\n"); | 491 | ecryptfs_printk(KERN_DEBUG, "Not a new file\n"); |
| 491 | ecryptfs_printk(KERN_DEBUG, "Calling fill_zeros_to_end_of_page" | 492 | ecryptfs_printk(KERN_DEBUG, "Calling fill_zeros_to_end_of_page" |
| 492 | "(page w/ index = [0x%.16x], to = [%d])\n", index, to); | 493 | "(page w/ index = [0x%.16x], to = [%d])\n", index, to); |
| 494 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { | ||
| 495 | rc = ecryptfs_write_lower_page_segment(ecryptfs_inode, page, 0, | ||
| 496 | to); | ||
| 497 | if (!rc) { | ||
| 498 | rc = copied; | ||
| 499 | fsstack_copy_inode_size(ecryptfs_inode, | ||
| 500 | ecryptfs_inode_to_lower(ecryptfs_inode)); | ||
| 501 | } | ||
| 502 | goto out; | ||
| 503 | } | ||
| 493 | /* Fills in zeros if 'to' goes beyond inode size */ | 504 | /* Fills in zeros if 'to' goes beyond inode size */ |
| 494 | rc = fill_zeros_to_end_of_page(page, to); | 505 | rc = fill_zeros_to_end_of_page(page, to); |
| 495 | if (rc) { | 506 | if (rc) { |
diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index 75c2ea9fee35..a137c6ea2fee 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c | |||
| @@ -117,13 +117,15 @@ int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset, | |||
| 117 | size_t size) | 117 | size_t size) |
| 118 | { | 118 | { |
| 119 | struct page *ecryptfs_page; | 119 | struct page *ecryptfs_page; |
| 120 | struct ecryptfs_crypt_stat *crypt_stat; | ||
| 121 | struct inode *ecryptfs_inode = ecryptfs_file->f_dentry->d_inode; | ||
| 120 | char *ecryptfs_page_virt; | 122 | char *ecryptfs_page_virt; |
| 121 | loff_t ecryptfs_file_size = | 123 | loff_t ecryptfs_file_size = i_size_read(ecryptfs_inode); |
| 122 | i_size_read(ecryptfs_file->f_dentry->d_inode); | ||
| 123 | loff_t data_offset = 0; | 124 | loff_t data_offset = 0; |
| 124 | loff_t pos; | 125 | loff_t pos; |
| 125 | int rc = 0; | 126 | int rc = 0; |
| 126 | 127 | ||
| 128 | crypt_stat = &ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat; | ||
| 127 | /* | 129 | /* |
| 128 | * if we are writing beyond current size, then start pos | 130 | * if we are writing beyond current size, then start pos |
| 129 | * at the current size - we'll fill in zeros from there. | 131 | * at the current size - we'll fill in zeros from there. |
| @@ -184,7 +186,13 @@ int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset, | |||
| 184 | flush_dcache_page(ecryptfs_page); | 186 | flush_dcache_page(ecryptfs_page); |
| 185 | SetPageUptodate(ecryptfs_page); | 187 | SetPageUptodate(ecryptfs_page); |
| 186 | unlock_page(ecryptfs_page); | 188 | unlock_page(ecryptfs_page); |
| 187 | rc = ecryptfs_encrypt_page(ecryptfs_page); | 189 | if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) |
| 190 | rc = ecryptfs_encrypt_page(ecryptfs_page); | ||
| 191 | else | ||
| 192 | rc = ecryptfs_write_lower_page_segment(ecryptfs_inode, | ||
| 193 | ecryptfs_page, | ||
| 194 | start_offset_in_page, | ||
| 195 | data_offset); | ||
| 188 | page_cache_release(ecryptfs_page); | 196 | page_cache_release(ecryptfs_page); |
| 189 | if (rc) { | 197 | if (rc) { |
| 190 | printk(KERN_ERR "%s: Error encrypting " | 198 | printk(KERN_ERR "%s: Error encrypting " |
| @@ -194,14 +202,16 @@ int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset, | |||
| 194 | pos += num_bytes; | 202 | pos += num_bytes; |
| 195 | } | 203 | } |
| 196 | if ((offset + size) > ecryptfs_file_size) { | 204 | if ((offset + size) > ecryptfs_file_size) { |
| 197 | i_size_write(ecryptfs_file->f_dentry->d_inode, (offset + size)); | 205 | i_size_write(ecryptfs_inode, (offset + size)); |
| 198 | rc = ecryptfs_write_inode_size_to_metadata( | 206 | if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) { |
| 199 | ecryptfs_file->f_dentry->d_inode); | 207 | rc = ecryptfs_write_inode_size_to_metadata( |
| 200 | if (rc) { | 208 | ecryptfs_inode); |
| 201 | printk(KERN_ERR "Problem with " | 209 | if (rc) { |
| 202 | "ecryptfs_write_inode_size_to_metadata; " | 210 | printk(KERN_ERR "Problem with " |
| 203 | "rc = [%d]\n", rc); | 211 | "ecryptfs_write_inode_size_to_metadata; " |
| 204 | goto out; | 212 | "rc = [%d]\n", rc); |
| 213 | goto out; | ||
| 214 | } | ||
| 205 | } | 215 | } |
| 206 | } | 216 | } |
| 207 | out: | 217 | out: |
