OLD | NEW |
1 /** | 1 /** |
2 * eCryptfs: Linux filesystem encryption layer | 2 * eCryptfs: Linux filesystem encryption layer |
3 * | 3 * |
4 * Copyright (C) 2007 International Business Machines Corp. | 4 * Copyright (C) 2007 International Business Machines Corp. |
5 * Author(s): Michael A. Halcrow <mahalcro@us.ibm.com> | 5 * Author(s): Michael A. Halcrow <mahalcro@us.ibm.com> |
6 * | 6 * |
7 * This program is free software; you can redistribute it and/or | 7 * This program is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU General Public License as | 8 * modify it under the terms of the GNU General Public License as |
9 * published by the Free Software Foundation; either version 2 of the | 9 * published by the Free Software Foundation; either version 2 of the |
10 * License, or (at your option) any later version. | 10 * License, or (at your option) any later version. |
(...skipping 26 matching lines...) Expand all Loading... |
37 * Returns bytes written on success; less than zero on error | 37 * Returns bytes written on success; less than zero on error |
38 */ | 38 */ |
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 ecryptfs_inode_info *inode_info; |
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 inode_info = ecryptfs_inode_to_private(ecryptfs_inode); |
| 47 mutex_lock(&inode_info->lower_file_mutex); |
47 BUG_ON(!inode_info->lower_file); | 48 BUG_ON(!inode_info->lower_file); |
| 49 inode_info->lower_file->f_pos = offset; |
48 fs_save = get_fs(); | 50 fs_save = get_fs(); |
49 set_fs(get_ds()); | 51 set_fs(get_ds()); |
50 » rc = vfs_write(inode_info->lower_file, data, size, &offset); | 52 » rc = vfs_write(inode_info->lower_file, data, size, |
| 53 » » &inode_info->lower_file->f_pos); |
51 set_fs(fs_save); | 54 set_fs(fs_save); |
| 55 mutex_unlock(&inode_info->lower_file_mutex); |
52 mark_inode_dirty_sync(ecryptfs_inode); | 56 mark_inode_dirty_sync(ecryptfs_inode); |
53 return rc; | 57 return rc; |
54 } | 58 } |
55 | 59 |
56 /** | 60 /** |
57 * ecryptfs_write_lower_page_segment | 61 * ecryptfs_write_lower_page_segment |
58 * @ecryptfs_inode: The eCryptfs inode | 62 * @ecryptfs_inode: The eCryptfs inode |
59 * @page_for_lower: The page containing the data to be written to the | 63 * @page_for_lower: The page containing the data to be written to the |
60 * lower file | 64 * lower file |
61 * @offset_in_page: The offset in the @page_for_lower from which to | 65 * @offset_in_page: The offset in the @page_for_lower from which to |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 * Returns bytes read on success; 0 on EOF; less than zero on error | 228 * Returns bytes read on success; 0 on EOF; less than zero on error |
225 */ | 229 */ |
226 int ecryptfs_read_lower(char *data, loff_t offset, size_t size, | 230 int ecryptfs_read_lower(char *data, loff_t offset, size_t size, |
227 struct inode *ecryptfs_inode) | 231 struct inode *ecryptfs_inode) |
228 { | 232 { |
229 struct ecryptfs_inode_info *inode_info = | 233 struct ecryptfs_inode_info *inode_info = |
230 ecryptfs_inode_to_private(ecryptfs_inode); | 234 ecryptfs_inode_to_private(ecryptfs_inode); |
231 mm_segment_t fs_save; | 235 mm_segment_t fs_save; |
232 ssize_t rc; | 236 ssize_t rc; |
233 | 237 |
| 238 mutex_lock(&inode_info->lower_file_mutex); |
234 BUG_ON(!inode_info->lower_file); | 239 BUG_ON(!inode_info->lower_file); |
| 240 inode_info->lower_file->f_pos = offset; |
235 fs_save = get_fs(); | 241 fs_save = get_fs(); |
236 set_fs(get_ds()); | 242 set_fs(get_ds()); |
237 » rc = vfs_read(inode_info->lower_file, data, size, &offset); | 243 » rc = vfs_read(inode_info->lower_file, data, size, |
| 244 » » &inode_info->lower_file->f_pos); |
238 set_fs(fs_save); | 245 set_fs(fs_save); |
| 246 mutex_unlock(&inode_info->lower_file_mutex); |
239 return rc; | 247 return rc; |
240 } | 248 } |
241 | 249 |
242 /** | 250 /** |
243 * ecryptfs_read_lower_page_segment | 251 * ecryptfs_read_lower_page_segment |
244 * @page_for_ecryptfs: The page into which data for eCryptfs will be | 252 * @page_for_ecryptfs: The page into which data for eCryptfs will be |
245 * written | 253 * written |
246 * @offset_in_page: Offset in @page_for_ecryptfs from which to start | 254 * @offset_in_page: Offset in @page_for_ecryptfs from which to start |
247 * writing | 255 * writing |
248 * @size: The number of bytes to write into @page_for_ecryptfs | 256 * @size: The number of bytes to write into @page_for_ecryptfs |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 SetPageUptodate(ecryptfs_page); | 346 SetPageUptodate(ecryptfs_page); |
339 unlock_page(ecryptfs_page); | 347 unlock_page(ecryptfs_page); |
340 page_cache_release(ecryptfs_page); | 348 page_cache_release(ecryptfs_page); |
341 pos += num_bytes; | 349 pos += num_bytes; |
342 data_offset += num_bytes; | 350 data_offset += num_bytes; |
343 } | 351 } |
344 out: | 352 out: |
345 return rc; | 353 return rc; |
346 } | 354 } |
347 #endif /* 0 */ | 355 #endif /* 0 */ |
OLD | NEW |