diff options
Diffstat (limited to 'fs/ecryptfs/read_write.c')
-rw-r--r-- | fs/ecryptfs/read_write.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c index 85d43096311..54eb14caad7 100644 --- a/fs/ecryptfs/read_write.c +++ b/fs/ecryptfs/read_write.c | |||
@@ -39,15 +39,16 @@ | |||
39 | int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data, | 39 | int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data, |
40 | loff_t offset, size_t size) | 40 | loff_t offset, size_t size) |
41 | { | 41 | { |
42 | struct ecryptfs_inode_info *inode_info; | 42 | struct file *lower_file; |
43 | mm_segment_t fs_save; | 43 | mm_segment_t fs_save; |
44 | ssize_t rc; | 44 | ssize_t rc; |
45 | 45 | ||
46 | inode_info = ecryptfs_inode_to_private(ecryptfs_inode); | 46 | lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file; |
47 | BUG_ON(!inode_info->lower_file); | 47 | if (!lower_file) |
48 | return -EIO; | ||
48 | fs_save = get_fs(); | 49 | fs_save = get_fs(); |
49 | set_fs(get_ds()); | 50 | set_fs(get_ds()); |
50 | rc = vfs_write(inode_info->lower_file, data, size, &offset); | 51 | rc = vfs_write(lower_file, data, size, &offset); |
51 | set_fs(fs_save); | 52 | set_fs(fs_save); |
52 | mark_inode_dirty_sync(ecryptfs_inode); | 53 | mark_inode_dirty_sync(ecryptfs_inode); |
53 | return rc; | 54 | return rc; |
@@ -131,6 +132,11 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, | |||
131 | size_t num_bytes = (PAGE_CACHE_SIZE - start_offset_in_page); | 132 | size_t num_bytes = (PAGE_CACHE_SIZE - start_offset_in_page); |
132 | size_t total_remaining_bytes = ((offset + size) - pos); | 133 | size_t total_remaining_bytes = ((offset + size) - pos); |
133 | 134 | ||
135 | if (fatal_signal_pending(current)) { | ||
136 | rc = -EINTR; | ||
137 | break; | ||
138 | } | ||
139 | |||
134 | if (num_bytes > total_remaining_bytes) | 140 | if (num_bytes > total_remaining_bytes) |
135 | num_bytes = total_remaining_bytes; | 141 | num_bytes = total_remaining_bytes; |
136 | if (pos < offset) { | 142 | if (pos < offset) { |
@@ -192,15 +198,19 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, | |||
192 | } | 198 | } |
193 | pos += num_bytes; | 199 | pos += num_bytes; |
194 | } | 200 | } |
195 | if ((offset + size) > ecryptfs_file_size) { | 201 | if (pos > ecryptfs_file_size) { |
196 | i_size_write(ecryptfs_inode, (offset + size)); | 202 | i_size_write(ecryptfs_inode, pos); |
197 | if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) { | 203 | if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) { |
198 | rc = ecryptfs_write_inode_size_to_metadata( | 204 | int rc2; |
205 | |||
206 | rc2 = ecryptfs_write_inode_size_to_metadata( | ||
199 | ecryptfs_inode); | 207 | ecryptfs_inode); |
200 | if (rc) { | 208 | if (rc2) { |
201 | printk(KERN_ERR "Problem with " | 209 | printk(KERN_ERR "Problem with " |
202 | "ecryptfs_write_inode_size_to_metadata; " | 210 | "ecryptfs_write_inode_size_to_metadata; " |
203 | "rc = [%d]\n", rc); | 211 | "rc = [%d]\n", rc2); |
212 | if (!rc) | ||
213 | rc = rc2; | ||
204 | goto out; | 214 | goto out; |
205 | } | 215 | } |
206 | } | 216 | } |
@@ -225,15 +235,16 @@ out: | |||
225 | int ecryptfs_read_lower(char *data, loff_t offset, size_t size, | 235 | int ecryptfs_read_lower(char *data, loff_t offset, size_t size, |
226 | struct inode *ecryptfs_inode) | 236 | struct inode *ecryptfs_inode) |
227 | { | 237 | { |
228 | struct ecryptfs_inode_info *inode_info = | 238 | struct file *lower_file; |
229 | ecryptfs_inode_to_private(ecryptfs_inode); | ||
230 | mm_segment_t fs_save; | 239 | mm_segment_t fs_save; |
231 | ssize_t rc; | 240 | ssize_t rc; |
232 | 241 | ||
233 | BUG_ON(!inode_info->lower_file); | 242 | lower_file = ecryptfs_inode_to_private(ecryptfs_inode)->lower_file; |
243 | if (!lower_file) | ||
244 | return -EIO; | ||
234 | fs_save = get_fs(); | 245 | fs_save = get_fs(); |
235 | set_fs(get_ds()); | 246 | set_fs(get_ds()); |
236 | rc = vfs_read(inode_info->lower_file, data, size, &offset); | 247 | rc = vfs_read(lower_file, data, size, &offset); |
237 | set_fs(fs_save); | 248 | set_fs(fs_save); |
238 | return rc; | 249 | return rc; |
239 | } | 250 | } |