ecryptfs: remove unnecessary decrypt when extending a file
authorFrank Swiderski <fes@chromium.org>
Mon, 15 Nov 2010 18:43:22 +0000 (10:43 -0800)
committerTyler Hicks <tyhicks@linux.vnet.ibm.com>
Mon, 17 Jan 2011 19:01:25 +0000 (13:01 -0600)
Removes an unecessary page decrypt from ecryptfs_begin_write when the
page is beyond the current file size. Previously, the call to
ecryptfs_decrypt_page would result in a read of 0 bytes, but still
attempt to decrypt an entire page. This patch detects that case and
merely zeros the page before marking it up-to-date.

Signed-off-by: Frank Swiderski <fes@chromium.org>
Signed-off-by: Tyler Hicks <tyhicks@linux.vnet.ibm.com>
fs/ecryptfs/mmap.c

index 4b90113927363ae20c80f5b48aeec98fc192c051..cc64fca89f8dc995f8ca5af82d135c053c6d59b2 100644 (file)
@@ -290,6 +290,7 @@ static int ecryptfs_write_begin(struct file *file,
                return -ENOMEM;
        *pagep = page;
 
+       prev_page_end_size = ((loff_t)index << PAGE_CACHE_SHIFT);
        if (!PageUptodate(page)) {
                struct ecryptfs_crypt_stat *crypt_stat =
                        &ecryptfs_inode_to_private(mapping->host)->crypt_stat;
@@ -335,18 +336,23 @@ static int ecryptfs_write_begin(struct file *file,
                                SetPageUptodate(page);
                        }
                } else {
-                       rc = ecryptfs_decrypt_page(page);
-                       if (rc) {
-                               printk(KERN_ERR "%s: Error decrypting page "
-                                      "at index [%ld]; rc = [%d]\n",
-                                      __func__, page->index, rc);
-                               ClearPageUptodate(page);
-                               goto out;
+                       if (prev_page_end_size
+                           >= i_size_read(page->mapping->host)) {
+                               zero_user(page, 0, PAGE_CACHE_SIZE);
+                       } else {
+                               rc = ecryptfs_decrypt_page(page);
+                               if (rc) {
+                                       printk(KERN_ERR "%s: Error decrypting "
+                                              "page at index [%ld]; "
+                                              "rc = [%d]\n",
+                                              __func__, page->index, rc);
+                                       ClearPageUptodate(page);
+                                       goto out;
+                               }
                        }
                        SetPageUptodate(page);
                }
        }
-       prev_page_end_size = ((loff_t)index << PAGE_CACHE_SHIFT);
        /* If creating a page or more of holes, zero them out via truncate.
         * Note, this will increase i_size. */
        if (index != 0) {