f2fs crypto: remove alloc_page for bounce_page
authorJaegeuk Kim <jaegeuk@kernel.org>
Mon, 1 Jun 2015 19:39:30 +0000 (12:39 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Mon, 1 Jun 2015 23:21:10 +0000 (16:21 -0700)
We don't need to call alloc_page() prior to mempool_alloc(), since the
mempool_alloc() calls alloc_page() internally.
And, if __GFP_WAIT is set, it never fails on page allocation, so let's
give GFP_NOWAIT and handle ENOMEM by writepage().

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/crypto.c
fs/f2fs/f2fs_crypto.h

index 2c7819aebcc5e4057345a7bf511480fb4b53b3d5..be6af181e0f288611d0e805ae059b9b488aecf45 100644 (file)
@@ -83,10 +83,7 @@ void f2fs_release_crypto_ctx(struct f2fs_crypto_ctx *ctx)
        unsigned long flags;
 
        if (ctx->flags & F2FS_WRITE_PATH_FL && ctx->w.bounce_page) {
-               if (ctx->flags & F2FS_BOUNCE_PAGE_REQUIRES_FREE_ENCRYPT_FL)
-                       __free_page(ctx->w.bounce_page);
-               else
-                       mempool_free(ctx->w.bounce_page, f2fs_bounce_page_pool);
+               mempool_free(ctx->w.bounce_page, f2fs_bounce_page_pool);
                ctx->w.bounce_page = NULL;
        }
        ctx->w.control_page = NULL;
@@ -408,34 +405,28 @@ struct page *f2fs_encrypt(struct inode *inode,
                return (struct page *)ctx;
 
        /* The encryption operation will require a bounce page. */
-       ciphertext_page = alloc_page(GFP_NOFS);
+       ciphertext_page = mempool_alloc(f2fs_bounce_page_pool, GFP_NOWAIT);
        if (!ciphertext_page) {
-               /*
-                * This is a potential bottleneck, but at least we'll have
-                * forward progress.
-                */
-               ciphertext_page = mempool_alloc(f2fs_bounce_page_pool,
-                                                       GFP_NOFS);
-               if (WARN_ON_ONCE(!ciphertext_page))
-                       ciphertext_page = mempool_alloc(f2fs_bounce_page_pool,
-                                               GFP_NOFS | __GFP_WAIT);
-               ctx->flags &= ~F2FS_BOUNCE_PAGE_REQUIRES_FREE_ENCRYPT_FL;
-       } else {
-               ctx->flags |= F2FS_BOUNCE_PAGE_REQUIRES_FREE_ENCRYPT_FL;
+               err = -ENOMEM;
+               goto err_out;
        }
+
        ctx->flags |= F2FS_WRITE_PATH_FL;
        ctx->w.bounce_page = ciphertext_page;
        ctx->w.control_page = plaintext_page;
        err = f2fs_page_crypto(ctx, inode, F2FS_ENCRYPT, plaintext_page->index,
                                        plaintext_page, ciphertext_page);
-       if (err) {
-               f2fs_release_crypto_ctx(ctx);
-               return ERR_PTR(err);
-       }
+       if (err)
+               goto err_out;
+
        SetPagePrivate(ciphertext_page);
        set_page_private(ciphertext_page, (unsigned long)ctx);
        lock_page(ciphertext_page);
        return ciphertext_page;
+
+err_out:
+       f2fs_release_crypto_ctx(ctx);
+       return ERR_PTR(err);
 }
 
 /**
index be59d91928fdecd72bec88d99e52ef0ca3771157..c2c1c2b63b25529cfd9cda4bcfb82de77f99f156 100644 (file)
@@ -84,8 +84,7 @@ struct f2fs_crypt_info {
 };
 
 #define F2FS_CTX_REQUIRES_FREE_ENCRYPT_FL             0x00000001
-#define F2FS_BOUNCE_PAGE_REQUIRES_FREE_ENCRYPT_FL     0x00000002
-#define F2FS_WRITE_PATH_FL                           0x00000004
+#define F2FS_WRITE_PATH_FL                           0x00000002
 
 struct f2fs_crypto_ctx {
        union {