fscrypt: Delay bounce page pool allocation until needed
authorDavid Gstir <david@sigma-star.at>
Tue, 6 Dec 2016 22:53:57 +0000 (23:53 +0100)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 11 Dec 2016 21:33:11 +0000 (16:33 -0500)
Since fscrypt users can now indicated if fscrypt_encrypt_page() should
use a bounce page, we can delay the bounce page pool initialization util
it is really needed. That is until fscrypt_operations has no
FS_CFLG_OWN_PAGES flag set.

Signed-off-by: David Gstir <david@sigma-star.at>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/crypto/crypto.c
fs/crypto/fscrypt_private.h
fs/crypto/keyinfo.c
include/linux/fscrypto.h

index 5ffc59436397de621de2308700e63a8c2b9c4450..bc1d4781b9ecdf18002d3d81ec1ddf8cc3fc09dc 100644 (file)
@@ -525,17 +525,22 @@ static void fscrypt_destroy(void)
 
 /**
  * fscrypt_initialize() - allocate major buffers for fs encryption.
+ * @cop_flags:  fscrypt operations flags
  *
  * We only call this when we start accessing encrypted files, since it
  * results in memory getting allocated that wouldn't otherwise be used.
  *
  * Return: Zero on success, non-zero otherwise.
  */
-int fscrypt_initialize(void)
+int fscrypt_initialize(unsigned int cop_flags)
 {
        int i, res = -ENOMEM;
 
-       if (fscrypt_bounce_page_pool)
+       /*
+        * No need to allocate a bounce page pool if there already is one or
+        * this FS won't use it.
+        */
+       if (cop_flags & FS_CFLG_OWN_PAGES || fscrypt_bounce_page_pool)
                return 0;
 
        mutex_lock(&fscrypt_init_mutex);
index c98b2a7fb6d3aa7f3a224b3f22684d00a5ad0724..7ba10cd45a2e54e518589783fcea28223dc9ebc6 100644 (file)
@@ -85,7 +85,7 @@ struct fscrypt_completion_result {
 
 
 /* crypto.c */
-int fscrypt_initialize(void);
+int fscrypt_initialize(unsigned int cop_flags);
 
 /* keyinfo.c */
 extern int fscrypt_get_crypt_info(struct inode *);
index 35d3317a27b3354565088261e5dfa2443bb64efb..6eeea1dcba41c2fa75c479ce1a3fa16f7cd2e7a5 100644 (file)
@@ -188,7 +188,7 @@ int fscrypt_get_crypt_info(struct inode *inode)
        u8 *raw_key = NULL;
        int res;
 
-       res = fscrypt_initialize();
+       res = fscrypt_initialize(inode->i_sb->s_cop->flags);
        if (res)
                return res;
 
index 188b4fa59cbf19b68445df7a01250cbd2e449cd7..1adc1c758d31fb295d5cd0bc881c9e809b4950fc 100644 (file)
@@ -168,7 +168,6 @@ static inline void fscrypt_set_d_op(struct dentry *dentry)
 #if IS_ENABLED(CONFIG_FS_ENCRYPTION)
 /* crypto.c */
 extern struct kmem_cache *fscrypt_info_cachep;
-
 extern struct fscrypt_ctx *fscrypt_get_ctx(const struct inode *, gfp_t);
 extern void fscrypt_release_ctx(struct fscrypt_ctx *);
 extern struct page *fscrypt_encrypt_page(const struct inode *, struct page *,