Commit 40e13e18 authored by Eric Biggers's avatar Eric Biggers
Browse files

fscrypt: make the bounce page pool opt-in instead of opt-out

Replace FS_CFLG_OWN_PAGES with a bit flag 'needs_bounce_pages' which has
the opposite meaning.  I.e., filesystems now opt into the bounce page
pool instead of opt out.  Make fscrypt_alloc_bounce_page() check that
the bounce page pool has been initialized.

I believe the opt-in makes more sense, since nothing else in
fscrypt_operations is opt-out, and these days filesystems can choose to
use blk-crypto which doesn't need the fscrypt bounce page pool.  Also, I
happen to be planning to add two more flags, and I wanted to fix the
"FS_CFLG_" name anyway as it wasn't prefixed with "FSCRYPT_".

Link: https://lore.kernel.org/r/20230925055451.59499-3-ebiggers@kernel.org


Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
parent 5970fbad
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -133,6 +133,7 @@ static const union fscrypt_policy *ceph_get_dummy_policy(struct super_block *sb)
}

static struct fscrypt_operations ceph_fscrypt_ops = {
	.needs_bounce_pages	= 1,
	.get_context		= ceph_crypt_get_context,
	.set_context		= ceph_crypt_set_context,
	.get_dummy_policy	= ceph_get_dummy_policy,
+8 −1
Original line number Diff line number Diff line
@@ -49,6 +49,13 @@ EXPORT_SYMBOL(fscrypt_enqueue_decrypt_work);

struct page *fscrypt_alloc_bounce_page(gfp_t gfp_flags)
{
	if (WARN_ON_ONCE(!fscrypt_bounce_page_pool)) {
		/*
		 * Oops, the filesystem called a function that uses the bounce
		 * page pool, but it didn't set needs_bounce_pages.
		 */
		return NULL;
	}
	return mempool_alloc(fscrypt_bounce_page_pool, gfp_flags);
}

@@ -325,7 +332,7 @@ int fscrypt_initialize(struct super_block *sb)
		return 0;

	/* No need to allocate a bounce page pool if this FS won't use it. */
	if (sb->s_cop->flags & FS_CFLG_OWN_PAGES)
	if (!sb->s_cop->needs_bounce_pages)
		return 0;

	mutex_lock(&fscrypt_init_mutex);
+1 −0
Original line number Diff line number Diff line
@@ -240,6 +240,7 @@ static void ext4_get_ino_and_lblk_bits(struct super_block *sb,
}

const struct fscrypt_operations ext4_cryptops = {
	.needs_bounce_pages	= 1,
	.legacy_key_prefix	= "ext4:",
	.get_context		= ext4_get_context,
	.set_context		= ext4_set_context,
+1 −0
Original line number Diff line number Diff line
@@ -3231,6 +3231,7 @@ static struct block_device **f2fs_get_devices(struct super_block *sb,
}

static const struct fscrypt_operations f2fs_cryptops = {
	.needs_bounce_pages	= 1,
	.legacy_key_prefix	= "f2fs:",
	.get_context		= f2fs_get_context,
	.set_context		= f2fs_set_context,
+0 −1
Original line number Diff line number Diff line
@@ -88,7 +88,6 @@ int ubifs_decrypt(const struct inode *inode, struct ubifs_data_node *dn,
}

const struct fscrypt_operations ubifs_crypt_operations = {
	.flags			= FS_CFLG_OWN_PAGES,
	.legacy_key_prefix	= "ubifs:",
	.get_context		= ubifs_crypt_get_context,
	.set_context		= ubifs_crypt_set_context,
Loading