eCryptfs: Read/write entire page during page IO
authorTyler Hicks <tyhicks@canonical.com>
Mon, 15 Apr 2013 23:16:24 +0000 (16:16 -0700)
committerTyler Hicks <tyhicks@canonical.com>
Sat, 8 Jun 2013 00:28:22 +0000 (17:28 -0700)
When reading and writing encrypted pages, perform IO using the entire
page all at once rather than 4096 bytes at a time.

This only affects architectures where PAGE_CACHE_SIZE is larger than
4096 bytes.

Signed-off-by: Tyler Hicks <tyhicks@canonical.com>
fs/ecryptfs/crypto.c

index e8976c0..4185584 100644 (file)
@@ -490,6 +490,7 @@ int ecryptfs_encrypt_page(struct page *page)
        char *enc_extent_virt;
        struct page *enc_extent_page = NULL;
        loff_t extent_offset;
+       loff_t lower_offset;
        int rc = 0;
 
        ecryptfs_inode = page->mapping->host;
@@ -503,12 +504,10 @@ int ecryptfs_encrypt_page(struct page *page)
                                "encrypted extent\n");
                goto out;
        }
-       enc_extent_virt = kmap(enc_extent_page);
+
        for (extent_offset = 0;
             extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
             extent_offset++) {
-               loff_t offset;
-
                rc = ecryptfs_encrypt_extent(enc_extent_page, crypt_stat, page,
                                             extent_offset);
                if (rc) {
@@ -516,25 +515,24 @@ int ecryptfs_encrypt_page(struct page *page)
                               "rc = [%d]\n", __func__, rc);
                        goto out;
                }
-               ecryptfs_lower_offset_for_extent(
-                       &offset, ((((loff_t)page->index)
-                                  * (PAGE_CACHE_SIZE
-                                     / crypt_stat->extent_size))
-                                 + extent_offset), crypt_stat);
-               rc = ecryptfs_write_lower(ecryptfs_inode, (enc_extent_virt +
-                               extent_offset * crypt_stat->extent_size),
-                               offset, crypt_stat->extent_size);
-               if (rc < 0) {
-                       ecryptfs_printk(KERN_ERR, "Error attempting "
-                                       "to write lower page; rc = [%d]"
-                                       "\n", rc);
-                       goto out;
-               }
+       }
+
+       ecryptfs_lower_offset_for_extent(&lower_offset,
+               page->index * (PAGE_CACHE_SIZE / crypt_stat->extent_size),
+               crypt_stat);
+       enc_extent_virt = kmap(enc_extent_page);
+       rc = ecryptfs_write_lower(ecryptfs_inode, enc_extent_virt, lower_offset,
+                                 PAGE_CACHE_SIZE);
+       kunmap(enc_extent_page);
+       if (rc < 0) {
+               ecryptfs_printk(KERN_ERR,
+                       "Error attempting to write lower page; rc = [%d]\n",
+                       rc);
+               goto out;
        }
        rc = 0;
 out:
        if (enc_extent_page) {
-               kunmap(enc_extent_page);
                __free_page(enc_extent_page);
        }
        return rc;
@@ -599,6 +597,7 @@ int ecryptfs_decrypt_page(struct page *page)
        char *enc_extent_virt;
        struct page *enc_extent_page = NULL;
        unsigned long extent_offset;
+       loff_t lower_offset;
        int rc = 0;
 
        ecryptfs_inode = page->mapping->host;
@@ -612,26 +611,24 @@ int ecryptfs_decrypt_page(struct page *page)
                                "encrypted extent\n");
                goto out;
        }
+
+       ecryptfs_lower_offset_for_extent(&lower_offset,
+               page->index * (PAGE_CACHE_SIZE / crypt_stat->extent_size),
+               crypt_stat);
        enc_extent_virt = kmap(enc_extent_page);
+       rc = ecryptfs_read_lower(enc_extent_virt, lower_offset, PAGE_CACHE_SIZE,
+                                ecryptfs_inode);
+       kunmap(enc_extent_page);
+       if (rc < 0) {
+               ecryptfs_printk(KERN_ERR,
+                       "Error attempting to read lower page; rc = [%d]\n",
+                       rc);
+               goto out;
+       }
+
        for (extent_offset = 0;
             extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
             extent_offset++) {
-               loff_t offset;
-
-               ecryptfs_lower_offset_for_extent(
-                       &offset, ((page->index * (PAGE_CACHE_SIZE
-                                                 / crypt_stat->extent_size))
-                                 + extent_offset), crypt_stat);
-               rc = ecryptfs_read_lower((enc_extent_virt +
-                               extent_offset * crypt_stat->extent_size),
-                               offset, crypt_stat->extent_size,
-                               ecryptfs_inode);
-               if (rc < 0) {
-                       ecryptfs_printk(KERN_ERR, "Error attempting "
-                                       "to read lower page; rc = [%d]"
-                                       "\n", rc);
-                       goto out;
-               }
                rc = ecryptfs_decrypt_extent(page, crypt_stat, enc_extent_page,
                                             extent_offset);
                if (rc) {
@@ -642,7 +639,6 @@ int ecryptfs_decrypt_page(struct page *page)
        }
 out:
        if (enc_extent_page) {
-               kunmap(enc_extent_page);
                __free_page(enc_extent_page);
        }
        return rc;