All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: Andrey Albershteyn <aalbersh@redhat.com>
Cc: fsverity@lists.linux.dev, linux-fsdevel@vger.kernel.org,
	linux-xfs@vger.kernel.org, david@fromorbit.com,
	ebiggers@kernel.org, hch@lst.de,
	Andrey Albershteyn <aalbersh@kernel.org>
Subject: Re: [PATCH RFC 02/29] iomap: introduce iomap_read/write_region interface
Date: Tue, 29 Jul 2025 15:22:52 -0700	[thread overview]
Message-ID: <20250729222252.GJ2672049@frogsfrogsfrogs> (raw)
In-Reply-To: <20250728-fsverity-v1-2-9e5443af0e34@kernel.org>

On Mon, Jul 28, 2025 at 10:30:06PM +0200, Andrey Albershteyn wrote:
> From: Andrey Albershteyn <aalbersh@redhat.com>
> 
> Interface for writing data beyond EOF into offsetted region in
> page cache.
> 
> Signed-off-by: Andrey Albershteyn <aalbersh@kernel.org>
> ---
>  include/linux/iomap.h  | 16 ++++++++
>  fs/iomap/buffered-io.c | 99 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 114 insertions(+), 1 deletion(-)
> 
> diff --git a/include/linux/iomap.h b/include/linux/iomap.h
> index 4a0b5ebb79e9..73288f28543f 100644
> --- a/include/linux/iomap.h
> +++ b/include/linux/iomap.h
> @@ -83,6 +83,11 @@ struct vm_fault;
>   */
>  #define IOMAP_F_PRIVATE		(1U << 12)
>  
> +/*
> + * Writes happens beyound inode EOF
> + */
> +#define IOMAP_F_BEYOND_EOF	(1U << 13)
> +
>  /*
>   * Flags set by the core iomap code during operations:
>   *
> @@ -533,4 +538,15 @@ int iomap_swapfile_activate(struct swap_info_struct *sis,
>  
>  extern struct bio_set iomap_ioend_bioset;
>  
> +struct ioregion {
> +	struct inode *inode;
> +	loff_t pos;				/* IO position */
> +	const void *buf;			/* Data to be written (in only) */
> +	size_t length;				/* Length of the date */

Length of the data ?

> +	const struct iomap_ops *ops;
> +};

This sounds like a kiocb and a kvec...

> +
> +struct folio *iomap_read_region(struct ioregion *region);
> +int iomap_write_region(struct ioregion *region);

...and these sound a lot like filemap_read and iomap_write_iter.
Why not use those?  You'd get readahead for free.  Though I guess
filemap_read cuts off at i_size so maybe that's why this is necessary?

(and by extension, is this why the existing fsverity implementations
seem to do their own readahead and reading?)

((and now I guess I see why this isn't done through the regular kiocb
interface, because then we'd be exposing post-EOF data hiding to
everyone in the system))

>  #endif /* LINUX_IOMAP_H */
> 
> -- 
> 2.50.0
> 
> 
> diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
> index 7bef232254a3..e959a206cba9 100644
> --- a/fs/iomap/buffered-io.c
> +++ b/fs/iomap/buffered-io.c
> @@ -321,6 +321,7 @@ struct iomap_readpage_ctx {
>  	bool			cur_folio_in_bio;
>  	struct bio		*bio;
>  	struct readahead_control *rac;
> +	int			flags;

What flags go in here?

>  };
>  
>  /**
> @@ -387,7 +388,8 @@ static int iomap_readpage_iter(struct iomap_iter *iter,
>  	if (plen == 0)
>  		goto done;
>  
> -	if (iomap_block_needs_zeroing(iter, pos)) {
> +	if (iomap_block_needs_zeroing(iter, pos) &&
> +	    !(iomap->flags & IOMAP_F_BEYOND_EOF)) {
>  		folio_zero_range(folio, poff, plen);
>  		iomap_set_range_uptodate(folio, poff, plen);
>  		goto done;
> @@ -2007,3 +2009,98 @@ iomap_writepages_unbound(struct address_space *mapping, struct writeback_control
>  	return iomap_submit_ioend(wpc, error);
>  }
>  EXPORT_SYMBOL_GPL(iomap_writepages_unbound);
> +
> +struct folio *
> +iomap_read_region(struct ioregion *region)
> +{
> +	struct inode *inode = region->inode;
> +	fgf_t fgp = FGP_CREAT | FGP_LOCK | fgf_set_order(region->length);
> +	pgoff_t index = (region->pos) >> PAGE_SHIFT;
> +	struct folio *folio = __filemap_get_folio(inode->i_mapping, index, fgp,
> +				    mapping_gfp_mask(inode->i_mapping));
> +	int ret;
> +	struct iomap_iter iter = {
> +		.inode		= folio->mapping->host,
> +		.pos		= region->pos,
> +		.len		= region->length,
> +	};
> +	struct iomap_readpage_ctx ctx = {
> +		.cur_folio	= folio,
> +	};
> +
> +	if (folio_test_uptodate(folio)) {
> +		folio_unlock(folio);
> +		return folio;
> +	}
> +
> +	while ((ret = iomap_iter(&iter, region->ops)) > 0)
> +		iter.status = iomap_read_folio_iter(&iter, &ctx);

Huh, we don't read into region->buf?  Oh, I see, this gets iomap to
install an uptodate folio in the pagecache, and then later we can
just hand it to fsverity.  Maybe?

--D

> +
> +	if (ctx.bio) {
> +		submit_bio(ctx.bio);
> +		WARN_ON_ONCE(!ctx.cur_folio_in_bio);
> +	} else {
> +		WARN_ON_ONCE(ctx.cur_folio_in_bio);
> +		folio_unlock(folio);
> +	}
> +
> +	return folio;
> +}
> +EXPORT_SYMBOL_GPL(iomap_read_region);
> +
> +static int iomap_write_region_iter(struct iomap_iter *iter, const void *buf)
> +{
> +	loff_t pos = iter->pos;
> +	u64 bytes = iomap_length(iter);
> +	int status;
> +
> +	do {
> +		struct folio *folio;
> +		size_t offset;
> +		bool ret;

Is balance_dirty_pages_ratelimited_flags need here if we're at the dirty
thresholds?

> +
> +		bytes = min_t(u64, SIZE_MAX, bytes);
> +		status = iomap_write_begin(iter, &folio, &offset, &bytes);
> +		if (status)
> +			return status;
> +		if (iter->iomap.flags & IOMAP_F_STALE)
> +			break;
> +
> +		offset = offset_in_folio(folio, pos);
> +		if (bytes > folio_size(folio) - offset)
> +			bytes = folio_size(folio) - offset;
> +
> +		memcpy_to_folio(folio, offset, buf, bytes);
> +
> +		ret = iomap_write_end(iter, bytes, bytes, folio);
> +		if (WARN_ON_ONCE(!ret))
> +			return -EIO;
> +
> +		__iomap_put_folio(iter, bytes, folio);
> +		if (WARN_ON_ONCE(!ret))
> +			return -EIO;
> +
> +		status = iomap_iter_advance(iter, &bytes);
> +		if (status)
> +			break;
> +	} while (bytes > 0);
> +
> +	return status;
> +}

Hrm, stripped down version of iomap_write_iter without the isize
updates.

--D

> +
> +int
> +iomap_write_region(struct ioregion *region)
> +{
> +	struct iomap_iter iter = {
> +		.inode		= region->inode,
> +		.pos		= region->pos,
> +		.len		= region->length,
> +	};
> +	ssize_t ret;
> +
> +	while ((ret = iomap_iter(&iter, region->ops)) > 0)
> +		iter.status = iomap_write_region_iter(&iter, region->buf);
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(iomap_write_region);

  reply	other threads:[~2025-07-29 22:22 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-07-28 20:30 [PATCH RFC 00/29] fs-verity support for XFS with post EOF merkle tree Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 01/29] iomap: add iomap_writepages_unbound() to write beyond EOF Andrey Albershteyn
2025-07-29 22:07   ` Darrick J. Wong
2025-07-31 15:04     ` Andrey Albershteyn
2025-07-31 18:43   ` Joanne Koong
2025-08-04 11:34     ` Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 02/29] iomap: introduce iomap_read/write_region interface Andrey Albershteyn
2025-07-29 22:22   ` Darrick J. Wong [this message]
2025-07-31 15:51     ` Andrey Albershteyn
2025-08-11 11:43     ` Christoph Hellwig
2025-09-09 12:30       ` Andrey Albershteyn
2025-09-12  1:14         ` Darrick J. Wong
2025-09-12  7:19           ` Christoph Hellwig
2025-09-12  7:18         ` Christoph Hellwig
2025-09-12 11:56           ` Andrey Albershteyn
2025-09-12 13:09             ` Christoph Hellwig
2025-07-28 20:30 ` [PATCH RFC 03/29] fs: add FS_XFLAG_VERITY for verity files Andrey Albershteyn
2025-07-29  9:53   ` Amir Goldstein
2025-07-29 10:35     ` Andrey Albershteyn
2025-07-29 12:06       ` Amir Goldstein
2025-08-12  7:51   ` Christoph Hellwig
2025-07-28 20:30 ` [PATCH RFC 04/29] fsverity: add per-sb workqueue for post read processing Andrey Albershteyn
2025-08-11 11:45   ` Christoph Hellwig
2025-08-11 17:51     ` Tejun Heo
2025-08-12  7:43       ` Christoph Hellwig
2025-08-12 19:52         ` Tejun Heo
2025-07-28 20:30 ` [PATCH RFC 05/29] fsverity: add tracepoints Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 06/29] fsverity: report validation errors back to the filesystem Andrey Albershteyn
2025-08-11 11:46   ` Christoph Hellwig
2025-08-11 15:31     ` Darrick J. Wong
2025-08-12  7:34       ` Christoph Hellwig
2025-08-12  7:56         ` Christoph Hellwig
2025-07-28 20:30 ` [PATCH RFC 07/29] fsverity: pass super_block to fsverity_enqueue_verify_work Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 08/29] ext4: use a per-superblock fsverity workqueue Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 09/29] f2fs: " Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 10/29] btrfs: " Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 11/29] fsverity: remove system-wide workqueue Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 12/29] fsverity: expose merkle tree geometry to callers Andrey Albershteyn
2025-08-11 11:48   ` Christoph Hellwig
2025-08-11 15:38     ` Darrick J. Wong
2025-08-11 19:06       ` Andrey Albershteyn
2025-08-12  7:42       ` Christoph Hellwig
2025-08-12 19:09         ` Darrick J. Wong
2025-07-28 20:30 ` [PATCH RFC 13/29] iomap: integrate fs-verity verification into iomap's read path Andrey Albershteyn
2025-07-29 23:21   ` Darrick J. Wong
2025-07-31 11:34     ` Andrey Albershteyn
2025-07-31 14:52       ` Darrick J. Wong
2025-07-31 15:01         ` Andrey Albershteyn
2025-07-31 15:08           ` Darrick J. Wong
2025-07-28 20:30 ` [PATCH RFC 14/29] xfs: add attribute type for fs-verity Andrey Albershteyn
2025-08-11 11:50   ` Christoph Hellwig
2025-08-11 19:00     ` Andrey Albershteyn
2025-08-12  7:44       ` Christoph Hellwig
2025-08-12 17:11         ` Andrey Albershteyn
2025-08-12 19:12           ` Darrick J. Wong
2025-07-28 20:30 ` [PATCH RFC 15/29] xfs: add fs-verity ro-compat flag Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 16/29] xfs: add inode on-disk VERITY flag Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 17/29] xfs: initialize fs-verity on file open and cleanup on inode destruction Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 18/29] xfs: don't allow to enable DAX on fs-verity sealed inode Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 19/29] xfs: disable direct read path for fs-verity files Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 20/29] xfs: disable preallocations for fsverity Merkle tree writes Andrey Albershteyn
2025-07-29 22:27   ` Darrick J. Wong
2025-07-31 11:42     ` Andrey Albershteyn
2025-07-31 14:49       ` Darrick J. Wong
2025-07-28 20:30 ` [PATCH RFC 21/29] xfs: add writeback and iomap reading of Merkel tree pages Andrey Albershteyn
2025-07-29 22:33   ` Darrick J. Wong
2025-07-28 20:30 ` [PATCH RFC 22/29] xfs: add fs-verity support Andrey Albershteyn
2025-07-29 23:05   ` Darrick J. Wong
2025-07-31 14:50     ` Andrey Albershteyn
2025-07-31 15:07       ` Darrick J. Wong
2025-07-28 20:30 ` [PATCH RFC 23/29] xfs: add fs-verity ioctls Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 24/29] xfs: advertise fs-verity being available on filesystem Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 25/29] xfs: check and repair the verity inode flag state Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 26/29] xfs: fix scrub trace with null pointer in quotacheck Andrey Albershteyn
2025-07-29 15:28   ` Darrick J. Wong
2025-07-31 14:54     ` Andrey Albershteyn
2025-07-31 16:03       ` Carlos Maiolino
2025-07-28 20:30 ` [PATCH RFC 27/29] xfs: report verity failures through the health system Andrey Albershteyn
2025-07-28 20:30 ` [PATCH RFC 28/29] xfs: add fsverity traces Andrey Albershteyn
2025-07-29 23:06   ` Darrick J. Wong
2025-07-28 20:30 ` [PATCH RFC 29/29] xfs: enable ro-compat fs-verity flag Andrey Albershteyn

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250729222252.GJ2672049@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=aalbersh@kernel.org \
    --cc=aalbersh@redhat.com \
    --cc=david@fromorbit.com \
    --cc=ebiggers@kernel.org \
    --cc=fsverity@lists.linux.dev \
    --cc=hch@lst.de \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.