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) { |
