[PATCH 09/13] fsverity: box up the write_merkle_tree_block parameters too

Darrick J. Wong
2024-03-30T00:35:02Z

From: Darrick J. Wong <djwong@kernel.org>

Box up the tree write request parameters into a structure so that we can
add more in the next few patches.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
fs/btrfs/verity.c | 6 ++++--
fs/ext4/verity.c | 7 +++++--
fs/f2fs/verity.c | 7 +++++--
fs/verity/enable.c | 5 ++++-
include/linux/fsverity.h | 21 ++++++++++++++++++---
5 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/fs/btrfs/verity.c b/fs/btrfs/verity.c
index a3235571bf02d..576547c0f9e54 100644
--- a/fs/btrfs/verity.c
+++ b/fs/btrfs/verity.c
@@ -790,9 +790,11 @@ static struct page *btrfs_read_merkle_tree_page(struct inode *inode,
*
* Returns 0 on success or negative error code on failure
*/
-static int btrfs_write_merkle_tree_block(struct inode *inode, const void *buf,
- u64 pos, unsigned int size)
+static int btrfs_write_merkle_tree_block(const struct fsverity_writemerkle *req,
+ const void *buf, u64 pos,
+ unsigned int size)
{
+ struct inode *inode = req->inode;
loff_t merkle_pos = merkle_file_pos(inode);

if (merkle_pos < 0)
diff --git a/fs/ext4/verity.c b/fs/ext4/verity.c
index a8ae8c912cb5d..27eb2d51cce2f 100644
--- a/fs/ext4/verity.c
+++ b/fs/ext4/verity.c
@@ -382,9 +382,12 @@ static struct page *ext4_read_merkle_tree_page(struct inode *inode,
return folio_file_page(folio, index);
}

-static int ext4_write_merkle_tree_block(struct inode *inode, const void *buf,
- u64 pos, unsigned int size)
+static int ext4_write_merkle_tree_block(const struct fsverity_writemerkle *req,
+ const void *buf, u64 pos,
+ unsigned int size)
{
+ struct inode *inode = req->inode;
+
pos += ext4_verity_metadata_pos(inode);

return pagecache_write(inode, buf, size, pos);
diff --git a/fs/f2fs/verity.c b/fs/f2fs/verity.c
index 595d702c2c5c4..f8d974818f3bb 100644
--- a/fs/f2fs/verity.c
+++ b/fs/f2fs/verity.c
@@ -279,9 +279,12 @@ static struct page *f2fs_read_merkle_tree_page(struct inode *inode,
return folio_file_page(folio, index);
}

-static int f2fs_write_merkle_tree_block(struct inode *inode, const void *buf,
- u64 pos, unsigned int size)
+static int f2fs_write_merkle_tree_block(const struct fsverity_writemerkle *req,
+ const void *buf, u64 pos,
+ unsigned int size)
{
+ struct inode *inode = req->inode;
+
pos += f2fs_verity_metadata_pos(inode);

return pagecache_write(inode, buf, size, pos);
diff --git a/fs/verity/enable.c b/fs/verity/enable.c
index 1d4a6de960149..233b20fb12ff5 100644
--- a/fs/verity/enable.c
+++ b/fs/verity/enable.c
@@ -50,10 +50,13 @@ static int write_merkle_tree_block(struct inode *inode, const u8 *buf,
unsigned long index,
const struct merkle_tree_params *params)
{
+ struct fsverity_writemerkle req = {
+ .inode = inode,
+ };
u64 pos = (u64)index << params->log_blocksize;
int err;

- err = inode->i_sb->s_vop->write_merkle_tree_block(inode, buf, pos,
+ err = inode->i_sb->s_vop->write_merkle_tree_block(&req, buf, pos,
params->block_size);
if (err)
fsverity_err(inode, "Error %d writing Merkle tree block %lu",
diff --git a/include/linux/fsverity.h b/include/linux/fsverity.h
index 5b1485a842983..5dacd30d65353 100644
--- a/include/linux/fsverity.h
+++ b/include/linux/fsverity.h
@@ -75,6 +75,20 @@ struct fsverity_readmerkle {
u8 log_blocksize;
};

+/**
+ * struct fsverity_writemerkle - Request to write a Merkle Tree block buffer
+ * @inode: the inode to read
+ * @level: level of the block; level 0 are the leaves
+ * @num_levels: number of levels in the tree total
+ * @log_blocksize: log2 of the size of the block
+ */
+struct fsverity_writemerkle {
+ struct inode *inode;
+ int level;
+ int num_levels;
+ u8 log_blocksize;
+};
+
/* Verity operations for filesystems */
struct fsverity_operations {

@@ -185,7 +199,7 @@ struct fsverity_operations {
/**
* Write a Merkle tree block to the given inode.
*
- * @inode: the inode for which the Merkle tree is being built
+ * @req: write request; see struct fsverity_writemerkle
* @buf: the Merkle tree block to write
* @pos: the position of the block in the Merkle tree (in bytes)
* @size: the Merkle tree block size (in bytes)
@@ -195,8 +209,9 @@ struct fsverity_operations {
*
* Return: 0 on success, -errno on failure
*/
- int (*write_merkle_tree_block)(struct inode *inode, const void *buf,
- u64 pos, unsigned int size);
+ int (*write_merkle_tree_block)(const struct fsverity_writemerkle *req,
+ const void *buf, u64 pos,
+ unsigned int size);

/**
* Release the reference to a Merkle tree block