Commit 4683ff83 authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs crypto: remove alloc_page for bounce_page



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: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 9236cac5
Loading
Loading
Loading
Loading
+12 −21
Original line number Diff line number Diff line
@@ -83,9 +83,6 @@ 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);
		ctx->w.bounce_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);
}

/**
+1 −2
Original line number Diff line number Diff line
@@ -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 {