Commit 007f6c3a authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'ecryptfs-3.8-rc2-fixes' of...

Merge tag 'ecryptfs-3.8-rc2-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tyhicks/ecryptfs

Pull ecryptfs fixes from Tyler Hicks:
 "Two self-explanatory fixes and a third patch which improves
  performance: when overwriting a full page in the eCryptfs page cache,
  skip reading in and decrypting the corresponding lower page."

* tag 'ecryptfs-3.8-rc2-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tyhicks/ecryptfs:
  fs/ecryptfs/crypto.c: make ecryptfs_encode_for_filename() static
  eCryptfs: fix to use list_for_each_entry_safe() when delete items
  eCryptfs: Avoid unnecessary disk read and data decryption during writing
parents 58890c06 37028758
...@@ -1935,7 +1935,7 @@ static const unsigned char filename_rev_map[256] = { ...@@ -1935,7 +1935,7 @@ static const unsigned char filename_rev_map[256] = {
* @src: Source location for the filename to encode * @src: Source location for the filename to encode
* @src_size: Size of the source in bytes * @src_size: Size of the source in bytes
*/ */
void ecryptfs_encode_for_filename(unsigned char *dst, size_t *dst_size, static void ecryptfs_encode_for_filename(unsigned char *dst, size_t *dst_size,
unsigned char *src, size_t src_size) unsigned char *src, size_t src_size)
{ {
size_t num_blocks; size_t num_blocks;
......
...@@ -102,11 +102,11 @@ int __init ecryptfs_init_kthread(void) ...@@ -102,11 +102,11 @@ int __init ecryptfs_init_kthread(void)
void ecryptfs_destroy_kthread(void) void ecryptfs_destroy_kthread(void)
{ {
struct ecryptfs_open_req *req; struct ecryptfs_open_req *req, *tmp;
mutex_lock(&ecryptfs_kthread_ctl.mux); mutex_lock(&ecryptfs_kthread_ctl.mux);
ecryptfs_kthread_ctl.flags |= ECRYPTFS_KTHREAD_ZOMBIE; ecryptfs_kthread_ctl.flags |= ECRYPTFS_KTHREAD_ZOMBIE;
list_for_each_entry(req, &ecryptfs_kthread_ctl.req_list, list_for_each_entry_safe(req, tmp, &ecryptfs_kthread_ctl.req_list,
kthread_ctl_list) { kthread_ctl_list) {
list_del(&req->kthread_ctl_list); list_del(&req->kthread_ctl_list);
*req->lower_file = ERR_PTR(-EIO); *req->lower_file = ERR_PTR(-EIO);
......
...@@ -338,7 +338,8 @@ static int ecryptfs_write_begin(struct file *file, ...@@ -338,7 +338,8 @@ static int ecryptfs_write_begin(struct file *file,
if (prev_page_end_size if (prev_page_end_size
>= i_size_read(page->mapping->host)) { >= i_size_read(page->mapping->host)) {
zero_user(page, 0, PAGE_CACHE_SIZE); zero_user(page, 0, PAGE_CACHE_SIZE);
} else { SetPageUptodate(page);
} else if (len < PAGE_CACHE_SIZE) {
rc = ecryptfs_decrypt_page(page); rc = ecryptfs_decrypt_page(page);
if (rc) { if (rc) {
printk(KERN_ERR "%s: Error decrypting " printk(KERN_ERR "%s: Error decrypting "
...@@ -348,10 +349,10 @@ static int ecryptfs_write_begin(struct file *file, ...@@ -348,10 +349,10 @@ static int ecryptfs_write_begin(struct file *file,
ClearPageUptodate(page); ClearPageUptodate(page);
goto out; goto out;
} }
}
SetPageUptodate(page); SetPageUptodate(page);
} }
} }
}
/* 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) {
...@@ -499,6 +500,13 @@ static int ecryptfs_write_end(struct file *file, ...@@ -499,6 +500,13 @@ static int ecryptfs_write_end(struct file *file,
} }
goto out; goto out;
} }
if (!PageUptodate(page)) {
if (copied < PAGE_CACHE_SIZE) {
rc = 0;
goto out;
}
SetPageUptodate(page);
}
/* Fills in zeros if 'to' goes beyond inode size */ /* Fills in zeros if 'to' goes beyond inode size */
rc = fill_zeros_to_end_of_page(page, to); rc = fill_zeros_to_end_of_page(page, to);
if (rc) { if (rc) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment