diff options
author | Frank Swiderski <fes@chromium.org> | 2010-11-15 13:43:22 -0500 |
---|---|---|
committer | Tyler Hicks <tyhicks@linux.vnet.ibm.com> | 2011-01-17 14:01:25 -0500 |
commit | 24562486be76cf223b8d911f45e1d26eb3364b13 (patch) | |
tree | 7ce33c533c12b4dc66d8afd836c7996d5769e325 /fs/ecryptfs | |
parent | f24b38874e1e37bb70291bbc4c5c3c13f5f9dac8 (diff) |
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>
Diffstat (limited to 'fs/ecryptfs')
-rw-r--r-- | fs/ecryptfs/mmap.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c index 4b9011392736..cc64fca89f8d 100644 --- a/fs/ecryptfs/mmap.c +++ b/fs/ecryptfs/mmap.c | |||
@@ -290,6 +290,7 @@ static int ecryptfs_write_begin(struct file *file, | |||
290 | return -ENOMEM; | 290 | return -ENOMEM; |
291 | *pagep = page; | 291 | *pagep = page; |
292 | 292 | ||
293 | prev_page_end_size = ((loff_t)index << PAGE_CACHE_SHIFT); | ||
293 | if (!PageUptodate(page)) { | 294 | if (!PageUptodate(page)) { |
294 | struct ecryptfs_crypt_stat *crypt_stat = | 295 | struct ecryptfs_crypt_stat *crypt_stat = |
295 | &ecryptfs_inode_to_private(mapping->host)->crypt_stat; | 296 | &ecryptfs_inode_to_private(mapping->host)->crypt_stat; |
@@ -335,18 +336,23 @@ static int ecryptfs_write_begin(struct file *file, | |||
335 | SetPageUptodate(page); | 336 | SetPageUptodate(page); |
336 | } | 337 | } |
337 | } else { | 338 | } else { |
338 | rc = ecryptfs_decrypt_page(page); | 339 | if (prev_page_end_size |
339 | if (rc) { | 340 | >= i_size_read(page->mapping->host)) { |
340 | printk(KERN_ERR "%s: Error decrypting page " | 341 | zero_user(page, 0, PAGE_CACHE_SIZE); |
341 | "at index [%ld]; rc = [%d]\n", | 342 | } else { |
342 | __func__, page->index, rc); | 343 | rc = ecryptfs_decrypt_page(page); |
343 | ClearPageUptodate(page); | 344 | if (rc) { |
344 | goto out; | 345 | printk(KERN_ERR "%s: Error decrypting " |
346 | "page at index [%ld]; " | ||
347 | "rc = [%d]\n", | ||
348 | __func__, page->index, rc); | ||
349 | ClearPageUptodate(page); | ||
350 | goto out; | ||
351 | } | ||
345 | } | 352 | } |
346 | SetPageUptodate(page); | 353 | SetPageUptodate(page); |
347 | } | 354 | } |
348 | } | 355 | } |
349 | prev_page_end_size = ((loff_t)index << PAGE_CACHE_SHIFT); | ||
350 | /* If creating a page or more of holes, zero them out via truncate. | 356 | /* If creating a page or more of holes, zero them out via truncate. |
351 | * Note, this will increase i_size. */ | 357 | * Note, this will increase i_size. */ |
352 | if (index != 0) { | 358 | if (index != 0) { |