]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/crypto/crypto.c
Merge tag 'xfs-5.6-merge-8' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
[linux.git] / fs / crypto / crypto.c
index 3719efa546c6579b38dbd6fcf2a8b49b5ceb32d5..1ecaac7ee3cb8e0ad958fd9b935eb4d4e0169f23 100644 (file)
@@ -25,8 +25,6 @@
 #include <linux/module.h>
 #include <linux/scatterlist.h>
 #include <linux/ratelimit.h>
-#include <linux/dcache.h>
-#include <linux/namei.h>
 #include <crypto/skcipher.h>
 #include "fscrypt_private.h"
 
@@ -140,7 +138,7 @@ int fscrypt_crypt_block(const struct inode *inode, fscrypt_direction_t rw,
  *             multiple of the filesystem's block size.
  * @offs:      Byte offset within @page of the first block to encrypt.  Must be
  *             a multiple of the filesystem's block size.
- * @gfp_flags: Memory allocation flags
+ * @gfp_flags: Memory allocation flags.  See details below.
  *
  * A new bounce page is allocated, and the specified block(s) are encrypted into
  * it.  In the bounce page, the ciphertext block(s) will be located at the same
@@ -150,6 +148,11 @@ int fscrypt_crypt_block(const struct inode *inode, fscrypt_direction_t rw,
  *
  * This is for use by the filesystem's ->writepages() method.
  *
+ * The bounce page allocation is mempool-backed, so it will always succeed when
+ * @gfp_flags includes __GFP_DIRECT_RECLAIM, e.g. when it's GFP_NOFS.  However,
+ * only the first page of each bio can be allocated this way.  To prevent
+ * deadlocks, for any additional pages a mask like GFP_NOWAIT must be used.
+ *
  * Return: the new encrypted bounce page on success; an ERR_PTR() on failure
  */
 struct page *fscrypt_encrypt_pagecache_blocks(struct page *page,
@@ -286,54 +289,6 @@ int fscrypt_decrypt_block_inplace(const struct inode *inode, struct page *page,
 }
 EXPORT_SYMBOL(fscrypt_decrypt_block_inplace);
 
-/*
- * Validate dentries in encrypted directories to make sure we aren't potentially
- * caching stale dentries after a key has been added.
- */
-static int fscrypt_d_revalidate(struct dentry *dentry, unsigned int flags)
-{
-       struct dentry *dir;
-       int err;
-       int valid;
-
-       /*
-        * Plaintext names are always valid, since fscrypt doesn't support
-        * reverting to ciphertext names without evicting the directory's inode
-        * -- which implies eviction of the dentries in the directory.
-        */
-       if (!(dentry->d_flags & DCACHE_ENCRYPTED_NAME))
-               return 1;
-
-       /*
-        * Ciphertext name; valid if the directory's key is still unavailable.
-        *
-        * Although fscrypt forbids rename() on ciphertext names, we still must
-        * use dget_parent() here rather than use ->d_parent directly.  That's
-        * because a corrupted fs image may contain directory hard links, which
-        * the VFS handles by moving the directory's dentry tree in the dcache
-        * each time ->lookup() finds the directory and it already has a dentry
-        * elsewhere.  Thus ->d_parent can be changing, and we must safely grab
-        * a reference to some ->d_parent to prevent it from being freed.
-        */
-
-       if (flags & LOOKUP_RCU)
-               return -ECHILD;
-
-       dir = dget_parent(dentry);
-       err = fscrypt_get_encryption_info(d_inode(dir));
-       valid = !fscrypt_has_encryption_key(d_inode(dir));
-       dput(dir);
-
-       if (err < 0)
-               return err;
-
-       return valid;
-}
-
-const struct dentry_operations fscrypt_d_ops = {
-       .d_revalidate = fscrypt_d_revalidate,
-};
-
 /**
  * fscrypt_initialize() - allocate major buffers for fs encryption.
  * @cop_flags:  fscrypt operations flags