Index: fs/ecryptfs/mmap.c |
diff --git a/fs/ecryptfs/mmap.c b/fs/ecryptfs/mmap.c |
index 1887e7da194c97a364c96d61cbb713087417be0b..7c7ceba1ef470956eacf9d23cfce01f0a94e5aaf 100644 |
--- a/fs/ecryptfs/mmap.c |
+++ b/fs/ecryptfs/mmap.c |
@@ -69,18 +69,6 @@ static int ecryptfs_writepage(struct page *page, struct writeback_control *wbc) |
{ |
int rc; |
- /* |
- * Refuse to write the page out if we are called from reclaim context |
- * since our writepage() path may potentially allocate memory when |
- * calling into the lower fs vfs_write() which may in turn invoke |
- * us again. |
- */ |
- if (current->flags & PF_MEMALLOC) { |
- redirty_page_for_writepage(wbc, page); |
- rc = 0; |
- goto out; |
- } |
- |
rc = ecryptfs_encrypt_page(page); |
if (rc) { |
ecryptfs_printk(KERN_WARNING, "Error encrypting " |
@@ -89,8 +77,8 @@ static int ecryptfs_writepage(struct page *page, struct writeback_control *wbc) |
goto out; |
} |
SetPageUptodate(page); |
-out: |
unlock_page(page); |
+out: |
return rc; |
} |
@@ -502,7 +490,6 @@ static int ecryptfs_write_end(struct file *file, |
struct ecryptfs_crypt_stat *crypt_stat = |
&ecryptfs_inode_to_private(file->f_path.dentry->d_inode)->crypt_stat; |
int rc; |
- int need_unlock_page = 1; |
if (crypt_stat->flags & ECRYPTFS_NEW_FILE) { |
ecryptfs_printk(KERN_DEBUG, "ECRYPTFS_NEW_FILE flag set in " |
@@ -529,25 +516,25 @@ static int ecryptfs_write_end(struct file *file, |
"zeros in page with index = [0x%.16x]\n", index); |
goto out; |
} |
- set_page_dirty(page); |
- unlock_page(page); |
- need_unlock_page = 0; |
+ rc = ecryptfs_encrypt_page(page); |
+ if (rc) { |
+ ecryptfs_printk(KERN_WARNING, "Error encrypting page (upper " |
+ "index [0x%.16x])\n", index); |
+ goto out; |
+ } |
if (pos + copied > i_size_read(ecryptfs_inode)) { |
i_size_write(ecryptfs_inode, pos + copied); |
ecryptfs_printk(KERN_DEBUG, "Expanded file size to " |
"[0x%.16x]\n", i_size_read(ecryptfs_inode)); |
- balance_dirty_pages_ratelimited(mapping); |
- rc = ecryptfs_write_inode_size_to_metadata(ecryptfs_inode); |
- if (rc) { |
- printk(KERN_ERR "Error writing inode size to metadata; " |
- "rc = [%d]\n", rc); |
- goto out; |
- } |
} |
- rc = copied; |
+ rc = ecryptfs_write_inode_size_to_metadata(ecryptfs_inode); |
+ if (rc) |
+ printk(KERN_ERR "Error writing inode size to metadata; " |
+ "rc = [%d]\n", rc); |
+ else |
+ rc = copied; |
out: |
- if (need_unlock_page) |
- unlock_page(page); |
+ unlock_page(page); |
page_cache_release(page); |
return rc; |
} |