[PATCH 3/7] ecryptfs: use kzalloc() for the header buffer

From: Tal Zussman

Date: Wed Oct 14 2026 - 21:37:05 EST


ecryptfs_write_metadata() is only called when a file is created,
where ecryptfs_set_default_sizes() has set metadata_size to
ECRYPTFS_MINIMUM_HEADER_EXTENT_SIZE (8 KiB), or PAGE_SIZE if that is
larger. That is an acceptable size for kmalloc(), and the buffer is
only written out with kernel_write() or as an xattr, so it doesn't
need to be page-aligned. Allocate it with kzalloc() and remove
ecryptfs_get_zeroed_pages().

Signed-off-by: Tal Zussman <tz2294@xxxxxxxxxxxx>
---
fs/ecryptfs/crypto.c | 19 +++----------------
1 file changed, 3 insertions(+), 16 deletions(-)

diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
index 9b8b0c5a81cd..6a014872e919 100644
--- a/fs/ecryptfs/crypto.c
+++ b/fs/ecryptfs/crypto.c
@@ -998,17 +998,6 @@ ecryptfs_write_metadata_to_xattr(struct dentry *ecryptfs_dentry,
return rc;
}

-static unsigned long ecryptfs_get_zeroed_pages(gfp_t gfp_mask,
- unsigned int order)
-{
- struct page *page;
-
- page = alloc_pages(gfp_mask | __GFP_ZERO, order);
- if (page)
- return (unsigned long) page_address(page);
- return 0;
-}
-
/**
* ecryptfs_write_metadata
* @ecryptfs_dentry: The eCryptfs dentry, which should be negative
@@ -1027,7 +1016,6 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry,
{
struct ecryptfs_crypt_stat *crypt_stat =
&ecryptfs_inode_to_private(ecryptfs_inode)->crypt_stat;
- unsigned int order;
char *virt;
size_t virt_len;
size_t size = 0;
@@ -1046,15 +1034,14 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry,
goto out;
}
virt_len = crypt_stat->metadata_size;
- order = get_order(virt_len);
/* Released in this function */
- virt = (char *)ecryptfs_get_zeroed_pages(GFP_KERNEL, order);
+ virt = kzalloc(virt_len, GFP_KERNEL);
if (!virt) {
printk(KERN_ERR "%s: Out of memory\n", __func__);
rc = -ENOMEM;
goto out;
}
- /* Zeroed page ensures the in-header unencrypted i_size is set to 0 */
+ /* Zeroed buffer ensures the in-header unencrypted i_size is set to 0 */
rc = ecryptfs_write_headers_virt(virt, virt_len, &size, crypt_stat,
ecryptfs_dentry);
if (unlikely(rc)) {
@@ -1074,7 +1061,7 @@ int ecryptfs_write_metadata(struct dentry *ecryptfs_dentry,
goto out_free;
}
out_free:
- free_pages((unsigned long)virt, order);
+ kfree(virt);
out:
return rc;
}

--
2.39.5