diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-01-02 17:33:50 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-01-02 17:33:50 -0800 | 
| commit | 007f6c3a63e0831ff5a34bde072db08e917134c8 (patch) | |
| tree | f9c7b1cbd91f719165ce97463652c66ee81d3704 /fs | |
| parent | 58890c06691462ca29900d1116b28c7a3e131252 (diff) | |
| parent | 37028758f92d0a3eb74bcfbecf6bc477072e9e28 (diff) | |
| download | linux-007f6c3a63e0831ff5a34bde072db08e917134c8.tar.bz2 | |
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
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/ecryptfs/crypto.c | 2 | ||||
| -rw-r--r-- | fs/ecryptfs/kthread.c | 6 | ||||
| -rw-r--r-- | fs/ecryptfs/mmap.c | 12 | 
3 files changed, 14 insertions, 6 deletions
| diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index ea9931281557..a7b0c2dfb3db 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c @@ -1935,7 +1935,7 @@ static const unsigned char filename_rev_map[256] = {   * @src: Source location for the filename to encode   * @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)  {  	size_t num_blocks; diff --git a/fs/ecryptfs/kthread.c b/fs/ecryptfs/kthread.c index 809e67d05ca3..f1ea610362c6 100644 --- a/fs/ecryptfs/kthread.c +++ b/fs/ecryptfs/kthread.c @@ -102,12 +102,12 @@ int __init ecryptfs_init_kthread(void)  void ecryptfs_destroy_kthread(void)  { -	struct ecryptfs_open_req *req; +	struct ecryptfs_open_req *req, *tmp;  	mutex_lock(&ecryptfs_kthread_ctl.mux);  	ecryptfs_kthread_ctl.flags |= ECRYPTFS_KTHREAD_ZOMBIE; -	list_for_each_entry(req, &ecryptfs_kthread_ctl.req_list, -			    kthread_ctl_list) { +	list_for_each_entry_safe(req, tmp, &ecryptfs_kthread_ctl.req_list, +				 kthread_ctl_list) {  		list_del(&req->kthread_ctl_list);  		*req->lower_file = ERR_PTR(-EIO);  		complete(&req->done); diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c index bd1d57f98f74..564a1fa34b99 100644 --- a/fs/ecryptfs/mmap.c +++ b/fs/ecryptfs/mmap.c @@ -338,7 +338,8 @@ static int ecryptfs_write_begin(struct file *file,  			if (prev_page_end_size  			    >= i_size_read(page->mapping->host)) {  				zero_user(page, 0, PAGE_CACHE_SIZE); -			} else { +				SetPageUptodate(page); +			} else if (len < PAGE_CACHE_SIZE) {  				rc = ecryptfs_decrypt_page(page);  				if (rc) {  					printk(KERN_ERR "%s: Error decrypting " @@ -348,8 +349,8 @@ static int ecryptfs_write_begin(struct file *file,  					ClearPageUptodate(page);  					goto out;  				} +				SetPageUptodate(page);  			} -			SetPageUptodate(page);  		}  	}  	/* If creating a page or more of holes, zero them out via truncate. @@ -499,6 +500,13 @@ static int ecryptfs_write_end(struct file *file,  		}  		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 */  	rc = fill_zeros_to_end_of_page(page, to);  	if (rc) { |