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: Frank Swiderski <fes@chromium.org> Signed-off-by: Tyler Hicks <tyhicks@linux.vnet.ibm.com>
This commit is contained in:
committed by
Tyler Hicks
parent
f24b38874e
commit
24562486be
@@ -290,6 +290,7 @@ static int ecryptfs_write_begin(struct file *file,
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
*pagep = page;
|
*pagep = page;
|
||||||
|
|
||||||
|
prev_page_end_size = ((loff_t)index << PAGE_CACHE_SHIFT);
|
||||||
if (!PageUptodate(page)) {
|
if (!PageUptodate(page)) {
|
||||||
struct ecryptfs_crypt_stat *crypt_stat =
|
struct ecryptfs_crypt_stat *crypt_stat =
|
||||||
&ecryptfs_inode_to_private(mapping->host)->crypt_stat;
|
&ecryptfs_inode_to_private(mapping->host)->crypt_stat;
|
||||||
@@ -335,18 +336,23 @@ static int ecryptfs_write_begin(struct file *file,
|
|||||||
SetPageUptodate(page);
|
SetPageUptodate(page);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
rc = ecryptfs_decrypt_page(page);
|
if (prev_page_end_size
|
||||||
if (rc) {
|
>= i_size_read(page->mapping->host)) {
|
||||||
printk(KERN_ERR "%s: Error decrypting page "
|
zero_user(page, 0, PAGE_CACHE_SIZE);
|
||||||
"at index [%ld]; rc = [%d]\n",
|
} else {
|
||||||
__func__, page->index, rc);
|
rc = ecryptfs_decrypt_page(page);
|
||||||
ClearPageUptodate(page);
|
if (rc) {
|
||||||
goto out;
|
printk(KERN_ERR "%s: Error decrypting "
|
||||||
|
"page at index [%ld]; "
|
||||||
|
"rc = [%d]\n",
|
||||||
|
__func__, page->index, rc);
|
||||||
|
ClearPageUptodate(page);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
SetPageUptodate(page);
|
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.
|
/* If creating a page or more of holes, zero them out via truncate.
|
||||||
* Note, this will increase i_size. */
|
* Note, this will increase i_size. */
|
||||||
if (index != 0) {
|
if (index != 0) {
|
||||||
|
Reference in New Issue
Block a user