aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ecryptfs/read_write.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ecryptfs/read_write.c')
-rw-r--r--fs/ecryptfs/read_write.c37
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 @@
39int ecryptfs_write_lower(struct inode *ecryptfs_inode, char *data, 39int 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:
225int ecryptfs_read_lower(char *data, loff_t offset, size_t size, 235int 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}