Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 24562486 authored by Frank Swiderski's avatar Frank Swiderski Committed by Tyler Hicks
Browse files

ecryptfs: remove unnecessary decrypt when extending a file



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: default avatarFrank Swiderski <fes@chromium.org>
Signed-off-by: default avatarTyler Hicks <tyhicks@linux.vnet.ibm.com>
parent f24b3887
Loading
Loading
Loading
Loading
+14 −8
Original line number Diff line number Diff line
@@ -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;
@@ -334,19 +335,24 @@ static int ecryptfs_write_begin(struct file *file,
				}
				SetPageUptodate(page);
			}
		} else {
			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",
					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) {