0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/fs.h>
0010 #include <linux/pagemap.h>
0011 #include <linux/sched/signal.h>
0012
0013 #include "ecryptfs_kernel.h"
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data,
0028 loff_t offset, size_t size)
0029 {
0030 struct file *lower_file;
0031 ssize_t rc;
0032
0033 lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file;
0034 if (!lower_file)
0035 return -EIO;
0036 rc = kernel_write(lower_file, data, size, &offset);
0037 mark_inode_dirty_sync(ecryptfs_inode);
0038 return rc;
0039 }
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057 int ecryptfs_write_lower_page_segment(struct inode *ecryptfs_inode,
0058 struct page *page_for_lower,
0059 size_t offset_in_page, size_t size)
0060 {
0061 char *virt;
0062 loff_t offset;
0063 int rc;
0064
0065 offset = ((((loff_t)page_for_lower->index) << PAGE_SHIFT)
0066 + offset_in_page);
0067 virt = kmap(page_for_lower);
0068 rc = ecryptfs_write_lower(ecryptfs_inode, virt, offset, size);
0069 if (rc > 0)
0070 rc = 0;
0071 kunmap(page_for_lower);
0072 return rc;
0073 }
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093 int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset,
0094 size_t size)
0095 {
0096 struct page *ecryptfs_page;
0097 struct ecryptfs_crypt_stat *crypt_stat;
0098 char *ecryptfs_page_virt;
0099 loff_t ecryptfs_file_size = i_size_read(ecryptfs_inode);
0100 loff_t data_offset = 0;
0101 loff_t pos;
0102 int rc = 0;
0103
0104 crypt_stat = &ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat;
0105
0106
0107
0108
0109 if (offset > ecryptfs_file_size)
0110 pos = ecryptfs_file_size;
0111 else
0112 pos = offset;
0113 while (pos < (offset + size)) {
0114 pgoff_t ecryptfs_page_idx = (pos >> PAGE_SHIFT);
0115 size_t start_offset_in_page = (pos & ~PAGE_MASK);
0116 size_t num_bytes = (PAGE_SIZE - start_offset_in_page);
0117 loff_t total_remaining_bytes = ((offset + size) - pos);
0118
0119 if (fatal_signal_pending(current)) {
0120 rc = -EINTR;
0121 break;
0122 }
0123
0124 if (num_bytes > total_remaining_bytes)
0125 num_bytes = total_remaining_bytes;
0126 if (pos < offset) {
0127
0128 loff_t total_remaining_zeros = (offset - pos);
0129
0130 if (num_bytes > total_remaining_zeros)
0131 num_bytes = total_remaining_zeros;
0132 }
0133 ecryptfs_page = ecryptfs_get_locked_page(ecryptfs_inode,
0134 ecryptfs_page_idx);
0135 if (IS_ERR(ecryptfs_page)) {
0136 rc = PTR_ERR(ecryptfs_page);
0137 printk(KERN_ERR "%s: Error getting page at "
0138 "index [%ld] from eCryptfs inode "
0139 "mapping; rc = [%d]\n", __func__,
0140 ecryptfs_page_idx, rc);
0141 goto out;
0142 }
0143 ecryptfs_page_virt = kmap_atomic(ecryptfs_page);
0144
0145
0146
0147
0148
0149
0150
0151 if (pos < offset || !start_offset_in_page) {
0152
0153
0154 memset(((char *)ecryptfs_page_virt
0155 + start_offset_in_page), 0,
0156 PAGE_SIZE - start_offset_in_page);
0157 }
0158
0159
0160 if (pos >= offset) {
0161 memcpy(((char *)ecryptfs_page_virt
0162 + start_offset_in_page),
0163 (data + data_offset), num_bytes);
0164 data_offset += num_bytes;
0165 }
0166 kunmap_atomic(ecryptfs_page_virt);
0167 flush_dcache_page(ecryptfs_page);
0168 SetPageUptodate(ecryptfs_page);
0169 unlock_page(ecryptfs_page);
0170 if (crypt_stat->flags & ECRYPTFS_ENCRYPTED)
0171 rc = ecryptfs_encrypt_page(ecryptfs_page);
0172 else
0173 rc = ecryptfs_write_lower_page_segment(ecryptfs_inode,
0174 ecryptfs_page,
0175 start_offset_in_page,
0176 data_offset);
0177 put_page(ecryptfs_page);
0178 if (rc) {
0179 printk(KERN_ERR "%s: Error encrypting "
0180 "page; rc = [%d]\n", __func__, rc);
0181 goto out;
0182 }
0183 pos += num_bytes;
0184 }
0185 if (pos > ecryptfs_file_size) {
0186 i_size_write(ecryptfs_inode, pos);
0187 if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) {
0188 int rc2;
0189
0190 rc2 = ecryptfs_write_inode_size_to_metadata(
0191 ecryptfs_inode);
0192 if (rc2) {
0193 printk(KERN_ERR "Problem with "
0194 "ecryptfs_write_inode_size_to_metadata; "
0195 "rc = [%d]\n", rc2);
0196 if (!rc)
0197 rc = rc2;
0198 goto out;
0199 }
0200 }
0201 }
0202 out:
0203 return rc;
0204 }
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219 int ecryptfs_read_lower(char *data, loff_t offset, size_t size,
0220 struct inode *ecryptfs_inode)
0221 {
0222 struct file *lower_file;
0223 lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file;
0224 if (!lower_file)
0225 return -EIO;
0226 return kernel_read(lower_file, data, size, &offset);
0227 }
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246 int ecryptfs_read_lower_page_segment(struct page *page_for_ecryptfs,
0247 pgoff_t page_index,
0248 size_t offset_in_page, size_t size,
0249 struct inode *ecryptfs_inode)
0250 {
0251 char *virt;
0252 loff_t offset;
0253 int rc;
0254
0255 offset = ((((loff_t)page_index) << PAGE_SHIFT) + offset_in_page);
0256 virt = kmap(page_for_ecryptfs);
0257 rc = ecryptfs_read_lower(virt, offset, size, ecryptfs_inode);
0258 if (rc > 0)
0259 rc = 0;
0260 kunmap(page_for_ecryptfs);
0261 flush_dcache_page(page_for_ecryptfs);
0262 return rc;
0263 }