/** * fscrypt_initialize() - allocate major buffers for fs encryption. * * 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 i, res = -ENOMEM; if (fscrypt_bounce_page_pool) return 0; mutex_lock(&fscrypt_init_mutex); if (fscrypt_bounce_page_pool) goto already_initialized; for (i = 0; i < num_prealloc_crypto_ctxs; i++) { struct fscrypt_ctx *ctx; ctx = kmem_cache_zalloc(fscrypt_ctx_cachep, GFP_NOFS); if (!ctx) goto fail; list_add(&ctx->free_list, &fscrypt_free_ctxs); } fscrypt_bounce_page_pool = mempool_create_page_pool(num_prealloc_crypto_pages, 0); if (!fscrypt_bounce_page_pool) goto fail; already_initialized: mutex_unlock(&fscrypt_init_mutex); return 0; fail: fscrypt_destroy(); mutex_unlock(&fscrypt_init_mutex); return res; }
/** * 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(unsigned int cop_flags) { int i, res = -ENOMEM; /* No need to allocate a bounce page pool if this FS won't use it. */ if (cop_flags & FS_CFLG_OWN_PAGES) return 0; mutex_lock(&fscrypt_init_mutex); if (fscrypt_bounce_page_pool) goto already_initialized; for (i = 0; i < num_prealloc_crypto_ctxs; i++) { struct fscrypt_ctx *ctx; ctx = kmem_cache_zalloc(fscrypt_ctx_cachep, GFP_NOFS); if (!ctx) goto fail; list_add(&ctx->free_list, &fscrypt_free_ctxs); } fscrypt_bounce_page_pool = mempool_create_page_pool(num_prealloc_crypto_pages, 0); if (!fscrypt_bounce_page_pool) goto fail; already_initialized: mutex_unlock(&fscrypt_init_mutex); return 0; fail: fscrypt_destroy(); mutex_unlock(&fscrypt_init_mutex); return res; }
/** * fscrypt_exit() - Shutdown the fs encryption system */ static void __exit fscrypt_exit(void) { fscrypt_destroy(); if (fscrypt_read_workqueue) destroy_workqueue(fscrypt_read_workqueue); kmem_cache_destroy(fscrypt_ctx_cachep); kmem_cache_destroy(fscrypt_info_cachep); }