diff options
| -rw-r--r-- | fs/ecryptfs/ecryptfs_kernel.h | 3 | ||||
| -rw-r--r-- | fs/ecryptfs/inode.c | 48 | ||||
| -rw-r--r-- | fs/ecryptfs/read_write.c | 5 |
3 files changed, 11 insertions, 45 deletions
diff --git a/fs/ecryptfs/ecryptfs_kernel.h b/fs/ecryptfs/ecryptfs_kernel.h index 84dd2f88d00a..0032a9f5a3a9 100644 --- a/fs/ecryptfs/ecryptfs_kernel.h +++ b/fs/ecryptfs/ecryptfs_kernel.h | |||
| @@ -731,8 +731,7 @@ int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data, | |||
| 731 | int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode, | 731 | int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode, |
| 732 | struct page *page_for_lower, | 732 | struct page *page_for_lower, |
| 733 | size_t offset_in_page, size_t size); | 733 | size_t offset_in_page, size_t size); |
| 734 | int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset, | 734 | int ecryptfs_write(struct inode *inode, char *data, loff_t offset, size_t size); |
| 735 | size_t size); | ||
| 736 | int ecryptfs_read_lower(char *data, loff_t offset, size_t size, | 735 | int ecryptfs_read_lower(char *data, loff_t offset, size_t size, |
| 737 | struct inode *ecryptfs_inode); | 736 | struct inode *ecryptfs_inode); |
| 738 | int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs, | 737 | int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs, |
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index e2d4418affac..65dee2f336ae 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
| @@ -142,19 +142,10 @@ out: | |||
| 142 | static int grow_file(struct dentry *ecryptfs_dentry) | 142 | static int grow_file(struct dentry *ecryptfs_dentry) |
| 143 | { | 143 | { |
| 144 | struct inode *ecryptfs_inode = ecryptfs_dentry->d_inode; | 144 | struct inode *ecryptfs_inode = ecryptfs_dentry->d_inode; |
| 145 | struct file fake_file; | ||
| 146 | struct ecryptfs_file_info tmp_file_info; | ||
| 147 | char zero_virt[] = { 0x00 }; | 145 | char zero_virt[] = { 0x00 }; |
| 148 | int rc = 0; | 146 | int rc = 0; |
| 149 | 147 | ||
| 150 | memset(&fake_file, 0, sizeof(fake_file)); | 148 | rc = ecryptfs_write(ecryptfs_inode, zero_virt, 0, 1); |
| 151 | fake_file.f_path.dentry = ecryptfs_dentry; | ||
| 152 | memset(&tmp_file_info, 0, sizeof(tmp_file_info)); | ||
| 153 | ecryptfs_set_file_private(&fake_file, &tmp_file_info); | ||
| 154 | ecryptfs_set_file_lower( | ||
| 155 | &fake_file, | ||
| 156 | ecryptfs_inode_to_private(ecryptfs_inode)->lower_file); | ||
| 157 | rc = ecryptfs_write(&fake_file, zero_virt, 0, 1); | ||
| 158 | i_size_write(ecryptfs_inode, 0); | 149 | i_size_write(ecryptfs_inode, 0); |
| 159 | rc = ecryptfs_write_inode_size_to_metadata(ecryptfs_inode); | 150 | rc = ecryptfs_write_inode_size_to_metadata(ecryptfs_inode); |
| 160 | ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat.flags |= | 151 | ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat.flags |= |
| @@ -784,8 +775,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 784 | { | 775 | { |
| 785 | int rc = 0; | 776 | int rc = 0; |
| 786 | struct inode *inode = dentry->d_inode; | 777 | struct inode *inode = dentry->d_inode; |
| 787 | struct dentry *lower_dentry; | ||
| 788 | struct file fake_ecryptfs_file; | ||
| 789 | struct ecryptfs_crypt_stat *crypt_stat; | 778 | struct ecryptfs_crypt_stat *crypt_stat; |
| 790 | loff_t i_size = i_size_read(inode); | 779 | loff_t i_size = i_size_read(inode); |
| 791 | loff_t lower_size_before_truncate; | 780 | loff_t lower_size_before_truncate; |
| @@ -796,23 +785,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 796 | goto out; | 785 | goto out; |
| 797 | } | 786 | } |
| 798 | crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat; | 787 | crypt_stat = &ecryptfs_inode_to_private(dentry->d_inode)->crypt_stat; |
| 799 | /* Set up a fake ecryptfs file, this is used to interface with | ||
| 800 | * the file in the underlying filesystem so that the | ||
| 801 | * truncation has an effect there as well. */ | ||
| 802 | memset(&fake_ecryptfs_file, 0, sizeof(fake_ecryptfs_file)); | ||
| 803 | fake_ecryptfs_file.f_path.dentry = dentry; | ||
| 804 | /* Released at out_free: label */ | ||
| 805 | ecryptfs_set_file_private(&fake_ecryptfs_file, | ||
| 806 | kmem_cache_alloc(ecryptfs_file_info_cache, | ||
| 807 | GFP_KERNEL)); | ||
| 808 | if (unlikely(!ecryptfs_file_to_private(&fake_ecryptfs_file))) { | ||
| 809 | rc = -ENOMEM; | ||
| 810 | goto out; | ||
| 811 | } | ||
| 812 | lower_dentry = ecryptfs_dentry_to_lower(dentry); | ||
| 813 | ecryptfs_set_file_lower( | ||
| 814 | &fake_ecryptfs_file, | ||
| 815 | ecryptfs_inode_to_private(dentry->d_inode)->lower_file); | ||
| 816 | /* Switch on growing or shrinking file */ | 788 | /* Switch on growing or shrinking file */ |
| 817 | if (ia->ia_size > i_size) { | 789 | if (ia->ia_size > i_size) { |
| 818 | char zero[] = { 0x00 }; | 790 | char zero[] = { 0x00 }; |
| @@ -822,7 +794,7 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 822 | * this triggers code that will fill in 0's throughout | 794 | * this triggers code that will fill in 0's throughout |
| 823 | * the intermediate portion of the previous end of the | 795 | * the intermediate portion of the previous end of the |
| 824 | * file and the new and of the file */ | 796 | * file and the new and of the file */ |
| 825 | rc = ecryptfs_write(&fake_ecryptfs_file, zero, | 797 | rc = ecryptfs_write(inode, zero, |
| 826 | (ia->ia_size - 1), 1); | 798 | (ia->ia_size - 1), 1); |
| 827 | } else { /* ia->ia_size < i_size_read(inode) */ | 799 | } else { /* ia->ia_size < i_size_read(inode) */ |
| 828 | /* We're chopping off all the pages down to the page | 800 | /* We're chopping off all the pages down to the page |
| @@ -835,10 +807,10 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 835 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { | 807 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { |
| 836 | rc = vmtruncate(inode, ia->ia_size); | 808 | rc = vmtruncate(inode, ia->ia_size); |
| 837 | if (rc) | 809 | if (rc) |
| 838 | goto out_free; | 810 | goto out; |
| 839 | lower_ia->ia_size = ia->ia_size; | 811 | lower_ia->ia_size = ia->ia_size; |
| 840 | lower_ia->ia_valid |= ATTR_SIZE; | 812 | lower_ia->ia_valid |= ATTR_SIZE; |
| 841 | goto out_free; | 813 | goto out; |
| 842 | } | 814 | } |
| 843 | if (num_zeros) { | 815 | if (num_zeros) { |
| 844 | char *zeros_virt; | 816 | char *zeros_virt; |
| @@ -846,16 +818,16 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 846 | zeros_virt = kzalloc(num_zeros, GFP_KERNEL); | 818 | zeros_virt = kzalloc(num_zeros, GFP_KERNEL); |
| 847 | if (!zeros_virt) { | 819 | if (!zeros_virt) { |
| 848 | rc = -ENOMEM; | 820 | rc = -ENOMEM; |
| 849 | goto out_free; | 821 | goto out; |
| 850 | } | 822 | } |
| 851 | rc = ecryptfs_write(&fake_ecryptfs_file, zeros_virt, | 823 | rc = ecryptfs_write(inode, zeros_virt, |
| 852 | ia->ia_size, num_zeros); | 824 | ia->ia_size, num_zeros); |
| 853 | kfree(zeros_virt); | 825 | kfree(zeros_virt); |
| 854 | if (rc) { | 826 | if (rc) { |
| 855 | printk(KERN_ERR "Error attempting to zero out " | 827 | printk(KERN_ERR "Error attempting to zero out " |
| 856 | "the remainder of the end page on " | 828 | "the remainder of the end page on " |
| 857 | "reducing truncate; rc = [%d]\n", rc); | 829 | "reducing truncate; rc = [%d]\n", rc); |
| 858 | goto out_free; | 830 | goto out; |
| 859 | } | 831 | } |
| 860 | } | 832 | } |
| 861 | vmtruncate(inode, ia->ia_size); | 833 | vmtruncate(inode, ia->ia_size); |
| @@ -864,7 +836,7 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 864 | printk(KERN_ERR "Problem with " | 836 | printk(KERN_ERR "Problem with " |
| 865 | "ecryptfs_write_inode_size_to_metadata; " | 837 | "ecryptfs_write_inode_size_to_metadata; " |
| 866 | "rc = [%d]\n", rc); | 838 | "rc = [%d]\n", rc); |
| 867 | goto out_free; | 839 | goto out; |
| 868 | } | 840 | } |
| 869 | /* We are reducing the size of the ecryptfs file, and need to | 841 | /* We are reducing the size of the ecryptfs file, and need to |
| 870 | * know if we need to reduce the size of the lower file. */ | 842 | * know if we need to reduce the size of the lower file. */ |
| @@ -878,10 +850,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, | |||
| 878 | } else | 850 | } else |
| 879 | lower_ia->ia_valid &= ~ATTR_SIZE; | 851 | lower_ia->ia_valid &= ~ATTR_SIZE; |
| 880 | } | 852 | } |
| 881 | out_free: | ||
| 882 | if (ecryptfs_file_to_private(&fake_ecryptfs_file)) | ||
| 883 | kmem_cache_free(ecryptfs_file_info_cache, | ||
| 884 | ecryptfs_file_to_private(&fake_ecryptfs_file)); | ||
| 885 | out: | 853 | out: |
| 886 | return rc; | 854 | return rc; |
| 887 | } | 855 | } |
diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index 3cc17a96cf24..db184ef15d3d 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c | |||
| @@ -93,7 +93,7 @@ int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode, | |||
| 93 | 93 | ||
| 94 | /** | 94 | /** |
| 95 | * ecryptfs_write | 95 | * ecryptfs_write |
| 96 | * @ecryptfs_file: The eCryptfs file into which to write | 96 | * @ecryptfs_inode: The eCryptfs file into which to write |
| 97 | * @data: Virtual address where data to write is located | 97 | * @data: Virtual address where data to write is located |
| 98 | * @offset: Offset in the eCryptfs file at which to begin writing the | 98 | * @offset: Offset in the eCryptfs file at which to begin writing the |
| 99 | * data from @data | 99 | * data from @data |
| @@ -109,12 +109,11 @@ int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode, | |||
| 109 | * | 109 | * |
| 110 | * Returns zero on success; non-zero otherwise | 110 | * Returns zero on success; non-zero otherwise |
| 111 | */ | 111 | */ |
| 112 | int ecryptfs_write(struct file *ecryptfs_file, char *data, loff_t offset, | 112 | int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, |
| 113 | size_t size) | 113 | size_t size) |
| 114 | { | 114 | { |
| 115 | struct page *ecryptfs_page; | 115 | struct page *ecryptfs_page; |
| 116 | struct ecryptfs_crypt_stat *crypt_stat; | 116 | struct ecryptfs_crypt_stat *crypt_stat; |
| 117 | struct inode *ecryptfs_inode = ecryptfs_file->f_dentry->d_inode; | ||
| 118 | char *ecryptfs_page_virt; | 117 | char *ecryptfs_page_virt; |
| 119 | loff_t ecryptfs_file_size = i_size_read(ecryptfs_inode); | 118 | loff_t ecryptfs_file_size = i_size_read(ecryptfs_inode); |
| 120 | loff_t data_offset = 0; | 119 | loff_t data_offset = 0; |
