]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge tag 'ecryptfs-3.11-rc1-cleanup' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 11 Jul 2013 17:20:18 +0000 (10:20 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 11 Jul 2013 17:20:18 +0000 (10:20 -0700)
Pull eCryptfs updates from Tyler Hicks:
 "Code cleanups and improved buffer handling during page crypto
  operations:
   - Remove redundant code by merging some encrypt and decrypt functions
   - Get rid of a helper page allocation during page decryption by using
     in-place decryption
   - Better use of entire pages during page crypto operations
   - Several code cleanups"

* tag 'ecryptfs-3.11-rc1-cleanup' of git://git.kernel.org/pub/scm/linux/kernel/git/tyhicks/ecryptfs:
  Use ecryptfs_dentry_to_lower_path in a couple of places
  eCryptfs: Make extent and scatterlist crypt function parameters similar
  eCryptfs: Collapse crypt_page_offset() into crypt_extent()
  eCryptfs: Merge ecryptfs_encrypt_extent() and ecryptfs_decrypt_extent()
  eCryptfs: Combine page_offset crypto functions
  eCryptfs: Combine encrypt_scatterlist() and decrypt_scatterlist()
  eCryptfs: Decrypt pages in-place
  eCryptfs: Accept one offset parameter in page offset crypto functions
  eCryptfs: Simplify lower file offset calculation
  eCryptfs: Read/write entire page during page IO
  eCryptfs: Use entire helper page during page crypto operations
  eCryptfs: Cocci spatch "memdup.spatch"

1  2 
fs/ecryptfs/crypto.c
fs/ecryptfs/file.c

diff --combined fs/ecryptfs/crypto.c
index cfa109a4d5a21ac6f784f1a4e8a16b534c9e8d0d,46a6f6a4a70578e3e120381075cfacc1ef1f7fe7..d10757635b9c9360288e18217b28de298fc48407
  #include <asm/unaligned.h>
  #include "ecryptfs_kernel.h"
  
- static int
- ecryptfs_decrypt_page_offset(struct ecryptfs_crypt_stat *crypt_stat,
-                            struct page *dst_page, int dst_offset,
-                            struct page *src_page, int src_offset, int size,
-                            unsigned char *iv);
- static int
- ecryptfs_encrypt_page_offset(struct ecryptfs_crypt_stat *crypt_stat,
-                            struct page *dst_page, int dst_offset,
-                            struct page *src_page, int src_offset, int size,
-                            unsigned char *iv);
+ #define DECRYPT               0
+ #define ENCRYPT               1
  
  /**
   * ecryptfs_to_hex
@@@ -336,19 -328,20 +328,20 @@@ static void extent_crypt_complete(struc
  }
  
  /**
-  * encrypt_scatterlist
+  * crypt_scatterlist
   * @crypt_stat: Pointer to the crypt_stat struct to initialize.
-  * @dest_sg: Destination of encrypted data
-  * @src_sg: Data to be encrypted
-  * @size: Length of data to be encrypted
-  * @iv: iv to use during encryption
+  * @dst_sg: Destination of the data after performing the crypto operation
+  * @src_sg: Data to be encrypted or decrypted
+  * @size: Length of data
+  * @iv: IV to use
+  * @op: ENCRYPT or DECRYPT to indicate the desired operation
   *
-  * Returns the number of bytes encrypted; negative value on error
+  * Returns the number of bytes encrypted or decrypted; negative value on error
   */
- static int encrypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,
-                              struct scatterlist *dest_sg,
-                              struct scatterlist *src_sg, int size,
-                              unsigned char *iv)
+ static int crypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,
+                            struct scatterlist *dst_sg,
+                            struct scatterlist *src_sg, int size,
+                            unsigned char *iv, int op)
  {
        struct ablkcipher_request *req = NULL;
        struct extent_crypt_result ecr;
                crypt_stat->flags |= ECRYPTFS_KEY_SET;
        }
        mutex_unlock(&crypt_stat->cs_tfm_mutex);
-       ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes.\n", size);
-       ablkcipher_request_set_crypt(req, src_sg, dest_sg, size, iv);
-       rc = crypto_ablkcipher_encrypt(req);
+       ablkcipher_request_set_crypt(req, src_sg, dst_sg, size, iv);
+       rc = op == ENCRYPT ? crypto_ablkcipher_encrypt(req) :
+                            crypto_ablkcipher_decrypt(req);
        if (rc == -EINPROGRESS || rc == -EBUSY) {
                struct extent_crypt_result *ecr = req->base.data;
  
@@@ -407,41 -400,43 +400,43 @@@ out
  }
  
  /**
-  * ecryptfs_lower_offset_for_extent
+  * lower_offset_for_page
   *
   * Convert an eCryptfs page index into a lower byte offset
   */
- static void ecryptfs_lower_offset_for_extent(loff_t *offset, loff_t extent_num,
-                                            struct ecryptfs_crypt_stat *crypt_stat)
+ static loff_t lower_offset_for_page(struct ecryptfs_crypt_stat *crypt_stat,
+                                   struct page *page)
  {
-       (*offset) = ecryptfs_lower_header_size(crypt_stat)
-                   + (crypt_stat->extent_size * extent_num);
+       return ecryptfs_lower_header_size(crypt_stat) +
+              (page->index << PAGE_CACHE_SHIFT);
  }
  
  /**
-  * ecryptfs_encrypt_extent
-  * @enc_extent_page: Allocated page into which to encrypt the data in
-  *                   @page
+  * crypt_extent
   * @crypt_stat: crypt_stat containing cryptographic context for the
   *              encryption operation
-  * @page: Page containing plaintext data extent to encrypt
+  * @dst_page: The page to write the result into
+  * @src_page: The page to read from
   * @extent_offset: Page extent offset for use in generating IV
+  * @op: ENCRYPT or DECRYPT to indicate the desired operation
   *
-  * Encrypts one extent of data.
+  * Encrypts or decrypts one extent of data.
   *
   * Return zero on success; non-zero otherwise
   */
- static int ecryptfs_encrypt_extent(struct page *enc_extent_page,
-                                  struct ecryptfs_crypt_stat *crypt_stat,
-                                  struct page *page,
-                                  unsigned long extent_offset)
+ static int crypt_extent(struct ecryptfs_crypt_stat *crypt_stat,
+                       struct page *dst_page,
+                       struct page *src_page,
+                       unsigned long extent_offset, int op)
  {
+       pgoff_t page_index = op == ENCRYPT ? src_page->index : dst_page->index;
        loff_t extent_base;
        char extent_iv[ECRYPTFS_MAX_IV_BYTES];
+       struct scatterlist src_sg, dst_sg;
+       size_t extent_size = crypt_stat->extent_size;
        int rc;
  
-       extent_base = (((loff_t)page->index)
-                      * (PAGE_CACHE_SIZE / crypt_stat->extent_size));
+       extent_base = (((loff_t)page_index) * (PAGE_CACHE_SIZE / extent_size));
        rc = ecryptfs_derive_iv(extent_iv, crypt_stat,
                                (extent_base + extent_offset));
        if (rc) {
                        (unsigned long long)(extent_base + extent_offset), rc);
                goto out;
        }
-       rc = ecryptfs_encrypt_page_offset(crypt_stat, enc_extent_page, 0,
-                                         page, (extent_offset
-                                                * crypt_stat->extent_size),
-                                         crypt_stat->extent_size, extent_iv);
+       sg_init_table(&src_sg, 1);
+       sg_init_table(&dst_sg, 1);
+       sg_set_page(&src_sg, src_page, extent_size,
+                   extent_offset * extent_size);
+       sg_set_page(&dst_sg, dst_page, extent_size,
+                   extent_offset * extent_size);
+       rc = crypt_scatterlist(crypt_stat, &dst_sg, &src_sg, extent_size,
+                              extent_iv, op);
        if (rc < 0) {
-               printk(KERN_ERR "%s: Error attempting to encrypt page with "
-                      "page->index = [%ld], extent_offset = [%ld]; "
-                      "rc = [%d]\n", __func__, page->index, extent_offset,
-                      rc);
+               printk(KERN_ERR "%s: Error attempting to crypt page with "
+                      "page_index = [%ld], extent_offset = [%ld]; "
+                      "rc = [%d]\n", __func__, page_index, extent_offset, rc);
                goto out;
        }
        rc = 0;
@@@ -489,6 -490,7 +490,7 @@@ int ecryptfs_encrypt_page(struct 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;
                                "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);
+               rc = crypt_extent(crypt_stat, enc_extent_page, page,
+                                 extent_offset, ENCRYPT);
                if (rc) {
                        printk(KERN_ERR "%s: Error encrypting extent; "
                               "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,
-                                         offset, crypt_stat->extent_size);
-               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;
- }
- static int ecryptfs_decrypt_extent(struct page *page,
-                                  struct ecryptfs_crypt_stat *crypt_stat,
-                                  struct page *enc_extent_page,
-                                  unsigned long extent_offset)
- {
-       loff_t extent_base;
-       char extent_iv[ECRYPTFS_MAX_IV_BYTES];
-       int rc;
  
-       extent_base = (((loff_t)page->index)
-                      * (PAGE_CACHE_SIZE / crypt_stat->extent_size));
-       rc = ecryptfs_derive_iv(extent_iv, crypt_stat,
-                               (extent_base + extent_offset));
-       if (rc) {
-               ecryptfs_printk(KERN_ERR, "Error attempting to derive IV for "
-                       "extent [0x%.16llx]; rc = [%d]\n",
-                       (unsigned long long)(extent_base + extent_offset), rc);
-               goto out;
-       }
-       rc = ecryptfs_decrypt_page_offset(crypt_stat, page,
-                                         (extent_offset
-                                          * crypt_stat->extent_size),
-                                         enc_extent_page, 0,
-                                         crypt_stat->extent_size, extent_iv);
+       lower_offset = lower_offset_for_page(crypt_stat, page);
+       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) {
-               printk(KERN_ERR "%s: Error attempting to decrypt to page with "
-                      "page->index = [%ld], extent_offset = [%ld]; "
-                      "rc = [%d]\n", __func__, page->index, extent_offset,
-                      rc);
+               ecryptfs_printk(KERN_ERR,
+                       "Error attempting to write lower page; rc = [%d]\n",
+                       rc);
                goto out;
        }
        rc = 0;
  out:
+       if (enc_extent_page) {
+               __free_page(enc_extent_page);
+       }
        return rc;
  }
  
@@@ -594,43 -556,33 +556,33 @@@ int ecryptfs_decrypt_page(struct page *
  {
        struct inode *ecryptfs_inode;
        struct ecryptfs_crypt_stat *crypt_stat;
-       char *enc_extent_virt;
-       struct page *enc_extent_page = NULL;
+       char *page_virt;
        unsigned long extent_offset;
+       loff_t lower_offset;
        int rc = 0;
  
        ecryptfs_inode = page->mapping->host;
        crypt_stat =
                &(ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat);
        BUG_ON(!(crypt_stat->flags & ECRYPTFS_ENCRYPTED));
-       enc_extent_page = alloc_page(GFP_USER);
-       if (!enc_extent_page) {
-               rc = -ENOMEM;
-               ecryptfs_printk(KERN_ERR, "Error allocating memory for "
-                               "encrypted extent\n");
+       lower_offset = lower_offset_for_page(crypt_stat, page);
+       page_virt = kmap(page);
+       rc = ecryptfs_read_lower(page_virt, lower_offset, PAGE_CACHE_SIZE,
+                                ecryptfs_inode);
+       kunmap(page);
+       if (rc < 0) {
+               ecryptfs_printk(KERN_ERR,
+                       "Error attempting to read lower page; rc = [%d]\n",
+                       rc);
                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;
-               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, 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);
+               rc = crypt_extent(crypt_stat, page, page,
+                                 extent_offset, DECRYPT);
                if (rc) {
                        printk(KERN_ERR "%s: Error encrypting extent; "
                               "rc = [%d]\n", __func__, rc);
                }
        }
  out:
-       if (enc_extent_page) {
-               kunmap(enc_extent_page);
-               __free_page(enc_extent_page);
-       }
-       return rc;
- }
- /**
-  * decrypt_scatterlist
-  * @crypt_stat: Cryptographic context
-  * @dest_sg: The destination scatterlist to decrypt into
-  * @src_sg: The source scatterlist to decrypt from
-  * @size: The number of bytes to decrypt
-  * @iv: The initialization vector to use for the decryption
-  *
-  * Returns the number of bytes decrypted; negative value on error
-  */
- static int decrypt_scatterlist(struct ecryptfs_crypt_stat *crypt_stat,
-                              struct scatterlist *dest_sg,
-                              struct scatterlist *src_sg, int size,
-                              unsigned char *iv)
- {
-       struct ablkcipher_request *req = NULL;
-       struct extent_crypt_result ecr;
-       int rc = 0;
-       BUG_ON(!crypt_stat || !crypt_stat->tfm
-              || !(crypt_stat->flags & ECRYPTFS_STRUCT_INITIALIZED));
-       if (unlikely(ecryptfs_verbosity > 0)) {
-               ecryptfs_printk(KERN_DEBUG, "Key size [%zd]; key:\n",
-                               crypt_stat->key_size);
-               ecryptfs_dump_hex(crypt_stat->key,
-                                 crypt_stat->key_size);
-       }
-       init_completion(&ecr.completion);
-       mutex_lock(&crypt_stat->cs_tfm_mutex);
-       req = ablkcipher_request_alloc(crypt_stat->tfm, GFP_NOFS);
-       if (!req) {
-               mutex_unlock(&crypt_stat->cs_tfm_mutex);
-               rc = -ENOMEM;
-               goto out;
-       }
-       ablkcipher_request_set_callback(req,
-                       CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
-                       extent_crypt_complete, &ecr);
-       /* Consider doing this once, when the file is opened */
-       if (!(crypt_stat->flags & ECRYPTFS_KEY_SET)) {
-               rc = crypto_ablkcipher_setkey(crypt_stat->tfm, crypt_stat->key,
-                                             crypt_stat->key_size);
-               if (rc) {
-                       ecryptfs_printk(KERN_ERR,
-                                       "Error setting key; rc = [%d]\n",
-                                       rc);
-                       mutex_unlock(&crypt_stat->cs_tfm_mutex);
-                       rc = -EINVAL;
-                       goto out;
-               }
-               crypt_stat->flags |= ECRYPTFS_KEY_SET;
-       }
-       mutex_unlock(&crypt_stat->cs_tfm_mutex);
-       ecryptfs_printk(KERN_DEBUG, "Decrypting [%d] bytes.\n", size);
-       ablkcipher_request_set_crypt(req, src_sg, dest_sg, size, iv);
-       rc = crypto_ablkcipher_decrypt(req);
-       if (rc == -EINPROGRESS || rc == -EBUSY) {
-               struct extent_crypt_result *ecr = req->base.data;
-               wait_for_completion(&ecr->completion);
-               rc = ecr->rc;
-               INIT_COMPLETION(ecr->completion);
-       }
- out:
-       ablkcipher_request_free(req);
        return rc;
- }
- /**
-  * ecryptfs_encrypt_page_offset
-  * @crypt_stat: The cryptographic context
-  * @dst_page: The page to encrypt into
-  * @dst_offset: The offset in the page to encrypt into
-  * @src_page: The page to encrypt from
-  * @src_offset: The offset in the page to encrypt from
-  * @size: The number of bytes to encrypt
-  * @iv: The initialization vector to use for the encryption
-  *
-  * Returns the number of bytes encrypted
-  */
- static int
- ecryptfs_encrypt_page_offset(struct ecryptfs_crypt_stat *crypt_stat,
-                            struct page *dst_page, int dst_offset,
-                            struct page *src_page, int src_offset, int size,
-                            unsigned char *iv)
- {
-       struct scatterlist src_sg, dst_sg;
-       sg_init_table(&src_sg, 1);
-       sg_init_table(&dst_sg, 1);
-       sg_set_page(&src_sg, src_page, size, src_offset);
-       sg_set_page(&dst_sg, dst_page, size, dst_offset);
-       return encrypt_scatterlist(crypt_stat, &dst_sg, &src_sg, size, iv);
- }
- /**
-  * ecryptfs_decrypt_page_offset
-  * @crypt_stat: The cryptographic context
-  * @dst_page: The page to decrypt into
-  * @dst_offset: The offset in the page to decrypt into
-  * @src_page: The page to decrypt from
-  * @src_offset: The offset in the page to decrypt from
-  * @size: The number of bytes to decrypt
-  * @iv: The initialization vector to use for the decryption
-  *
-  * Returns the number of bytes decrypted
-  */
- static int
- ecryptfs_decrypt_page_offset(struct ecryptfs_crypt_stat *crypt_stat,
-                            struct page *dst_page, int dst_offset,
-                            struct page *src_page, int src_offset, int size,
-                            unsigned char *iv)
- {
-       struct scatterlist src_sg, dst_sg;
-       sg_init_table(&src_sg, 1);
-       sg_set_page(&src_sg, src_page, size, src_offset);
-       sg_init_table(&dst_sg, 1);
-       sg_set_page(&dst_sg, dst_page, size, dst_offset);
-       return decrypt_scatterlist(crypt_stat, &dst_sg, &src_sg, size, iv);
  }
  
  #define ECRYPTFS_MAX_SCATTERLIST_LEN 4
   */
  int ecryptfs_decode_and_decrypt_filename(char **plaintext_name,
                                         size_t *plaintext_name_size,
 -                                       struct dentry *ecryptfs_dir_dentry,
 +                                       struct super_block *sb,
                                         const char *name, size_t name_size)
  {
        struct ecryptfs_mount_crypt_stat *mount_crypt_stat =
 -              &ecryptfs_superblock_to_private(
 -                      ecryptfs_dir_dentry->d_sb)->mount_crypt_stat;
 +              &ecryptfs_superblock_to_private(sb)->mount_crypt_stat;
        char *decoded_name;
        size_t decoded_name_size;
        size_t packet_size;
diff --combined fs/ecryptfs/file.c
index 24f1105fda3ab5edfccc7a748f97dd624bf6f0fb,0943f6f20b1cd649694dc9d642228135f1773361..992cf95830b5792a5d510f7d588049d27c139a94
@@@ -49,7 -49,7 +49,7 @@@ static ssize_t ecryptfs_read_update_ati
                                unsigned long nr_segs, loff_t pos)
  {
        ssize_t rc;
-       struct path lower;
+       struct path *path;
        struct file *file = iocb->ki_filp;
  
        rc = generic_file_aio_read(iocb, iov, nr_segs, pos);
        if (-EIOCBQUEUED == rc)
                rc = wait_on_sync_kiocb(iocb);
        if (rc >= 0) {
-               lower.dentry = ecryptfs_dentry_to_lower(file->f_path.dentry);
-               lower.mnt = ecryptfs_dentry_to_lower_mnt(file->f_path.dentry);
-               touch_atime(&lower);
+               path = ecryptfs_dentry_to_lower_path(file->f_path.dentry);
+               touch_atime(path);
        }
        return rc;
  }
  
  struct ecryptfs_getdents_callback {
 -      void *dirent;
 -      struct dentry *dentry;
 -      filldir_t filldir;
 +      struct dir_context ctx;
 +      struct dir_context *caller;
 +      struct super_block *sb;
        int filldir_called;
        int entries_written;
  };
@@@ -88,7 -87,7 +87,7 @@@ ecryptfs_filldir(void *dirent, const ch
  
        buf->filldir_called++;
        rc = ecryptfs_decode_and_decrypt_filename(&name, &name_size,
 -                                                buf->dentry, lower_name,
 +                                                buf->sb, lower_name,
                                                  lower_namelen);
        if (rc) {
                printk(KERN_ERR "%s: Error attempting to decode and decrypt "
                       rc);
                goto out;
        }
 -      rc = buf->filldir(buf->dirent, name, name_size, offset, ino, d_type);
 +      buf->caller->pos = buf->ctx.pos;
 +      rc = !dir_emit(buf->caller, name, name_size, ino, d_type);
        kfree(name);
 -      if (rc >= 0)
 +      if (!rc)
                buf->entries_written++;
  out:
        return rc;
  /**
   * ecryptfs_readdir
   * @file: The eCryptfs directory file
 - * @dirent: Directory entry handle
 - * @filldir: The filldir callback function
 + * @ctx: The actor to feed the entries to
   */
 -static int ecryptfs_readdir(struct file *file, void *dirent, filldir_t filldir)
 +static int ecryptfs_readdir(struct file *file, struct dir_context *ctx)
  {
        int rc;
        struct file *lower_file;
 -      struct inode *inode;
 -      struct ecryptfs_getdents_callback buf;
 -
 +      struct inode *inode = file_inode(file);
 +      struct ecryptfs_getdents_callback buf = {
 +              .ctx.actor = ecryptfs_filldir,
 +              .caller = ctx,
 +              .sb = inode->i_sb,
 +      };
        lower_file = ecryptfs_file_to_lower(file);
 -      lower_file->f_pos = file->f_pos;
 -      inode = file_inode(file);
 -      memset(&buf, 0, sizeof(buf));
 -      buf.dirent = dirent;
 -      buf.dentry = file->f_path.dentry;
 -      buf.filldir = filldir;
 -      buf.filldir_called = 0;
 -      buf.entries_written = 0;
 -      rc = vfs_readdir(lower_file, ecryptfs_filldir, (void *)&buf);
 -      file->f_pos = lower_file->f_pos;
 +      lower_file->f_pos = ctx->pos;
 +      rc = iterate_dir(lower_file, &buf.ctx);
 +      ctx->pos = buf.ctx.pos;
        if (rc < 0)
                goto out;
        if (buf.filldir_called && !buf.entries_written)
@@@ -340,7 -343,7 +339,7 @@@ ecryptfs_compat_ioctl(struct file *file
  #endif
  
  const struct file_operations ecryptfs_dir_fops = {
 -      .readdir = ecryptfs_readdir,
 +      .iterate = ecryptfs_readdir,
        .read = generic_read_dir,
        .unlocked_ioctl = ecryptfs_unlocked_ioctl,
  #ifdef CONFIG_COMPAT
@@@ -361,7 -364,7 +360,7 @@@ const struct file_operations ecryptfs_m
        .aio_read = ecryptfs_read_update_atime,
        .write = do_sync_write,
        .aio_write = generic_file_aio_write,
 -      .readdir = ecryptfs_readdir,
 +      .iterate = ecryptfs_readdir,
        .unlocked_ioctl = ecryptfs_unlocked_ioctl,
  #ifdef CONFIG_COMPAT
        .compat_ioctl = ecryptfs_compat_ioctl,