Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
mmap.c
Go to the documentation of this file.
1 
28 #include <linux/pagemap.h>
29 #include <linux/writeback.h>
30 #include <linux/page-flags.h>
31 #include <linux/mount.h>
32 #include <linux/file.h>
33 #include <linux/crypto.h>
34 #include <linux/scatterlist.h>
35 #include <linux/slab.h>
36 #include <asm/unaligned.h>
37 #include "ecryptfs_kernel.h"
38 
47 struct page *ecryptfs_get_locked_page(struct inode *inode, loff_t index)
48 {
49  struct page *page = read_mapping_page(inode->i_mapping, index, NULL);
50  if (!IS_ERR(page))
51  lock_page(page);
52  return page;
53 }
54 
65 static int ecryptfs_writepage(struct page *page, struct writeback_control *wbc)
66 {
67  int rc;
68 
69  rc = ecryptfs_encrypt_page(page);
70  if (rc) {
71  ecryptfs_printk(KERN_WARNING, "Error encrypting "
72  "page (upper index [0x%.16lx])\n", page->index);
73  ClearPageUptodate(page);
74  goto out;
75  }
76  SetPageUptodate(page);
77 out:
78  unlock_page(page);
79  return rc;
80 }
81 
82 static void strip_xattr_flag(char *page_virt,
83  struct ecryptfs_crypt_stat *crypt_stat)
84 {
85  if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) {
86  size_t written;
87 
88  crypt_stat->flags &= ~ECRYPTFS_METADATA_IN_XATTR;
89  ecryptfs_write_crypt_stat_flags(page_virt, crypt_stat,
90  &written);
91  crypt_stat->flags |= ECRYPTFS_METADATA_IN_XATTR;
92  }
93 }
94 
121 static int
122 ecryptfs_copy_up_encrypted_with_header(struct page *page,
123  struct ecryptfs_crypt_stat *crypt_stat)
124 {
125  loff_t extent_num_in_page = 0;
126  loff_t num_extents_per_page = (PAGE_CACHE_SIZE
127  / crypt_stat->extent_size);
128  int rc = 0;
129 
130  while (extent_num_in_page < num_extents_per_page) {
131  loff_t view_extent_num = ((((loff_t)page->index)
132  * num_extents_per_page)
133  + extent_num_in_page);
134  size_t num_header_extents_at_front =
135  (crypt_stat->metadata_size / crypt_stat->extent_size);
136 
137  if (view_extent_num < num_header_extents_at_front) {
138  /* This is a header extent */
139  char *page_virt;
140 
141  page_virt = kmap_atomic(page);
142  memset(page_virt, 0, PAGE_CACHE_SIZE);
143  /* TODO: Support more than one header extent */
144  if (view_extent_num == 0) {
145  size_t written;
146 
148  page_virt, page->mapping->host);
149  strip_xattr_flag(page_virt + 16, crypt_stat);
150  ecryptfs_write_header_metadata(page_virt + 20,
151  crypt_stat,
152  &written);
153  }
154  kunmap_atomic(page_virt);
155  flush_dcache_page(page);
156  if (rc) {
157  printk(KERN_ERR "%s: Error reading xattr "
158  "region; rc = [%d]\n", __func__, rc);
159  goto out;
160  }
161  } else {
162  /* This is an encrypted data extent */
163  loff_t lower_offset =
164  ((view_extent_num * crypt_stat->extent_size)
165  - crypt_stat->metadata_size);
166 
168  page, (lower_offset >> PAGE_CACHE_SHIFT),
169  (lower_offset & ~PAGE_CACHE_MASK),
170  crypt_stat->extent_size, page->mapping->host);
171  if (rc) {
172  printk(KERN_ERR "%s: Error attempting to read "
173  "extent at offset [%lld] in the lower "
174  "file; rc = [%d]\n", __func__,
175  lower_offset, rc);
176  goto out;
177  }
178  }
179  extent_num_in_page++;
180  }
181 out:
182  return rc;
183 }
184 
194 static int ecryptfs_readpage(struct file *file, struct page *page)
195 {
196  struct ecryptfs_crypt_stat *crypt_stat =
197  &ecryptfs_inode_to_private(page->mapping->host)->crypt_stat;
198  int rc = 0;
199 
200  if (!crypt_stat || !(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
201  rc = ecryptfs_read_lower_page_segment(page, page->index, 0,
203  page->mapping->host);
204  } else if (crypt_stat->flags & ECRYPTFS_VIEW_AS_ENCRYPTED) {
205  if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) {
206  rc = ecryptfs_copy_up_encrypted_with_header(page,
207  crypt_stat);
208  if (rc) {
209  printk(KERN_ERR "%s: Error attempting to copy "
210  "the encrypted content from the lower "
211  "file whilst inserting the metadata "
212  "from the xattr into the header; rc = "
213  "[%d]\n", __func__, rc);
214  goto out;
215  }
216 
217  } else {
219  page, page->index, 0, PAGE_CACHE_SIZE,
220  page->mapping->host);
221  if (rc) {
222  printk(KERN_ERR "Error reading page; rc = "
223  "[%d]\n", rc);
224  goto out;
225  }
226  }
227  } else {
228  rc = ecryptfs_decrypt_page(page);
229  if (rc) {
230  ecryptfs_printk(KERN_ERR, "Error decrypting page; "
231  "rc = [%d]\n", rc);
232  goto out;
233  }
234  }
235 out:
236  if (rc)
237  ClearPageUptodate(page);
238  else
239  SetPageUptodate(page);
240  ecryptfs_printk(KERN_DEBUG, "Unlocking page with index = [0x%.16lx]\n",
241  page->index);
242  unlock_page(page);
243  return rc;
244 }
245 
249 static int fill_zeros_to_end_of_page(struct page *page, unsigned int to)
250 {
251  struct inode *inode = page->mapping->host;
252  int end_byte_in_page;
253 
254  if ((i_size_read(inode) / PAGE_CACHE_SIZE) != page->index)
255  goto out;
256  end_byte_in_page = i_size_read(inode) % PAGE_CACHE_SIZE;
257  if (to > end_byte_in_page)
258  end_byte_in_page = to;
259  zero_user_segment(page, end_byte_in_page, PAGE_CACHE_SIZE);
260 out:
261  return 0;
262 }
263 
278 static int ecryptfs_write_begin(struct file *file,
279  struct address_space *mapping,
280  loff_t pos, unsigned len, unsigned flags,
281  struct page **pagep, void **fsdata)
282 {
283  pgoff_t index = pos >> PAGE_CACHE_SHIFT;
284  struct page *page;
285  loff_t prev_page_end_size;
286  int rc = 0;
287 
288  page = grab_cache_page_write_begin(mapping, index, flags);
289  if (!page)
290  return -ENOMEM;
291  *pagep = page;
292 
293  prev_page_end_size = ((loff_t)index << PAGE_CACHE_SHIFT);
294  if (!PageUptodate(page)) {
295  struct ecryptfs_crypt_stat *crypt_stat =
296  &ecryptfs_inode_to_private(mapping->host)->crypt_stat;
297 
298  if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
300  page, index, 0, PAGE_CACHE_SIZE, mapping->host);
301  if (rc) {
302  printk(KERN_ERR "%s: Error attemping to read "
303  "lower page segment; rc = [%d]\n",
304  __func__, rc);
305  ClearPageUptodate(page);
306  goto out;
307  } else
308  SetPageUptodate(page);
309  } else if (crypt_stat->flags & ECRYPTFS_VIEW_AS_ENCRYPTED) {
310  if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR) {
311  rc = ecryptfs_copy_up_encrypted_with_header(
312  page, crypt_stat);
313  if (rc) {
314  printk(KERN_ERR "%s: Error attempting "
315  "to copy the encrypted content "
316  "from the lower file whilst "
317  "inserting the metadata from "
318  "the xattr into the header; rc "
319  "= [%d]\n", __func__, rc);
320  ClearPageUptodate(page);
321  goto out;
322  }
323  SetPageUptodate(page);
324  } else {
326  page, index, 0, PAGE_CACHE_SIZE,
327  mapping->host);
328  if (rc) {
329  printk(KERN_ERR "%s: Error reading "
330  "page; rc = [%d]\n",
331  __func__, rc);
332  ClearPageUptodate(page);
333  goto out;
334  }
335  SetPageUptodate(page);
336  }
337  } else {
338  if (prev_page_end_size
339  >= i_size_read(page->mapping->host)) {
340  zero_user(page, 0, PAGE_CACHE_SIZE);
341  } else {
342  rc = ecryptfs_decrypt_page(page);
343  if (rc) {
344  printk(KERN_ERR "%s: Error decrypting "
345  "page at index [%ld]; "
346  "rc = [%d]\n",
347  __func__, page->index, rc);
348  ClearPageUptodate(page);
349  goto out;
350  }
351  }
352  SetPageUptodate(page);
353  }
354  }
355  /* If creating a page or more of holes, zero them out via truncate.
356  * Note, this will increase i_size. */
357  if (index != 0) {
358  if (prev_page_end_size > i_size_read(page->mapping->host)) {
359  rc = ecryptfs_truncate(file->f_path.dentry,
360  prev_page_end_size);
361  if (rc) {
362  printk(KERN_ERR "%s: Error on attempt to "
363  "truncate to (higher) offset [%lld];"
364  " rc = [%d]\n", __func__,
365  prev_page_end_size, rc);
366  goto out;
367  }
368  }
369  }
370  /* Writing to a new page, and creating a small hole from start
371  * of page? Zero it out. */
372  if ((i_size_read(mapping->host) == prev_page_end_size)
373  && (pos != 0))
374  zero_user(page, 0, PAGE_CACHE_SIZE);
375 out:
376  if (unlikely(rc)) {
377  unlock_page(page);
378  page_cache_release(page);
379  *pagep = NULL;
380  }
381  return rc;
382 }
383 
391 static int ecryptfs_write_inode_size_to_header(struct inode *ecryptfs_inode)
392 {
393  char *file_size_virt;
394  int rc;
395 
396  file_size_virt = kmalloc(sizeof(u64), GFP_KERNEL);
397  if (!file_size_virt) {
398  rc = -ENOMEM;
399  goto out;
400  }
401  put_unaligned_be64(i_size_read(ecryptfs_inode), file_size_virt);
402  rc = ecryptfs_write_lower(ecryptfs_inode, file_size_virt, 0,
403  sizeof(u64));
404  kfree(file_size_virt);
405  if (rc < 0)
406  printk(KERN_ERR "%s: Error writing file size to header; "
407  "rc = [%d]\n", __func__, rc);
408  else
409  rc = 0;
410 out:
411  return rc;
412 }
413 
415 
416 static int ecryptfs_write_inode_size_to_xattr(struct inode *ecryptfs_inode)
417 {
418  ssize_t size;
419  void *xattr_virt;
420  struct dentry *lower_dentry =
421  ecryptfs_inode_to_private(ecryptfs_inode)->lower_file->f_dentry;
422  struct inode *lower_inode = lower_dentry->d_inode;
423  int rc;
424 
425  if (!lower_inode->i_op->getxattr || !lower_inode->i_op->setxattr) {
427  "No support for setting xattr in lower filesystem\n");
428  rc = -ENOSYS;
429  goto out;
430  }
431  xattr_virt = kmem_cache_alloc(ecryptfs_xattr_cache, GFP_KERNEL);
432  if (!xattr_virt) {
433  printk(KERN_ERR "Out of memory whilst attempting to write "
434  "inode size to xattr\n");
435  rc = -ENOMEM;
436  goto out;
437  }
438  mutex_lock(&lower_inode->i_mutex);
439  size = lower_inode->i_op->getxattr(lower_dentry, ECRYPTFS_XATTR_NAME,
440  xattr_virt, PAGE_CACHE_SIZE);
441  if (size < 0)
442  size = 8;
443  put_unaligned_be64(i_size_read(ecryptfs_inode), xattr_virt);
444  rc = lower_inode->i_op->setxattr(lower_dentry, ECRYPTFS_XATTR_NAME,
445  xattr_virt, size, 0);
446  mutex_unlock(&lower_inode->i_mutex);
447  if (rc)
448  printk(KERN_ERR "Error whilst attempting to write inode size "
449  "to lower file xattr; rc = [%d]\n", rc);
450  kmem_cache_free(ecryptfs_xattr_cache, xattr_virt);
451 out:
452  return rc;
453 }
454 
455 int ecryptfs_write_inode_size_to_metadata(struct inode *ecryptfs_inode)
456 {
457  struct ecryptfs_crypt_stat *crypt_stat;
458 
459  crypt_stat = &ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat;
460  BUG_ON(!(crypt_stat->flags & ECRYPTFS_ENCRYPTED));
461  if (crypt_stat->flags & ECRYPTFS_METADATA_IN_XATTR)
462  return ecryptfs_write_inode_size_to_xattr(ecryptfs_inode);
463  else
464  return ecryptfs_write_inode_size_to_header(ecryptfs_inode);
465 }
466 
477 static int ecryptfs_write_end(struct file *file,
478  struct address_space *mapping,
479  loff_t pos, unsigned len, unsigned copied,
480  struct page *page, void *fsdata)
481 {
482  pgoff_t index = pos >> PAGE_CACHE_SHIFT;
483  unsigned from = pos & (PAGE_CACHE_SIZE - 1);
484  unsigned to = from + copied;
485  struct inode *ecryptfs_inode = mapping->host;
486  struct ecryptfs_crypt_stat *crypt_stat =
487  &ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat;
488  int rc;
489 
490  ecryptfs_printk(KERN_DEBUG, "Calling fill_zeros_to_end_of_page"
491  "(page w/ index = [0x%.16lx], to = [%d])\n", index, to);
492  if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) {
493  rc = ecryptfs_write_lower_page_segment(ecryptfs_inode, page, 0,
494  to);
495  if (!rc) {
496  rc = copied;
497  fsstack_copy_inode_size(ecryptfs_inode,
498  ecryptfs_inode_to_lower(ecryptfs_inode));
499  }
500  goto out;
501  }
502  /* Fills in zeros if 'to' goes beyond inode size */
503  rc = fill_zeros_to_end_of_page(page, to);
504  if (rc) {
505  ecryptfs_printk(KERN_WARNING, "Error attempting to fill "
506  "zeros in page with index = [0x%.16lx]\n", index);
507  goto out;
508  }
509  rc = ecryptfs_encrypt_page(page);
510  if (rc) {
511  ecryptfs_printk(KERN_WARNING, "Error encrypting page (upper "
512  "index [0x%.16lx])\n", index);
513  goto out;
514  }
515  if (pos + copied > i_size_read(ecryptfs_inode)) {
516  i_size_write(ecryptfs_inode, pos + copied);
517  ecryptfs_printk(KERN_DEBUG, "Expanded file size to "
518  "[0x%.16llx]\n",
519  (unsigned long long)i_size_read(ecryptfs_inode));
520  }
521  rc = ecryptfs_write_inode_size_to_metadata(ecryptfs_inode);
522  if (rc)
523  printk(KERN_ERR "Error writing inode size to metadata; "
524  "rc = [%d]\n", rc);
525  else
526  rc = copied;
527 out:
528  unlock_page(page);
529  page_cache_release(page);
530  return rc;
531 }
532 
533 static sector_t ecryptfs_bmap(struct address_space *mapping, sector_t block)
534 {
535  int rc = 0;
536  struct inode *inode;
537  struct inode *lower_inode;
538 
539  inode = (struct inode *)mapping->host;
540  lower_inode = ecryptfs_inode_to_lower(inode);
541  if (lower_inode->i_mapping->a_ops->bmap)
542  rc = lower_inode->i_mapping->a_ops->bmap(lower_inode->i_mapping,
543  block);
544  return rc;
545 }
546 
548  .writepage = ecryptfs_writepage,
549  .readpage = ecryptfs_readpage,
550  .write_begin = ecryptfs_write_begin,
551  .write_end = ecryptfs_write_end,
552  .bmap = ecryptfs_bmap,
553 };