All of lore.kernel.org
 help / color / mirror / Atom feed
From: Darrick J. Wong <djwong@kernel.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] [PATCH v5 4/9] iomap: Add iomap_get_folio helper
Date: Wed, 4 Jan 2023 09:38:14 -0800	[thread overview]
Message-ID: <Y7W5hiktQFd6CvTY@magnolia> (raw)
In-Reply-To: <20221231150919.659533-5-agruenba@redhat.com>

On Sat, Dec 31, 2022 at 04:09:14PM +0100, Andreas Gruenbacher wrote:
> Add an iomap_get_folio() helper that gets a folio reference based on
> an iomap iterator and an offset into the address space.  Use it in
> iomap_write_begin().
> 
> Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>

Pretty straightforward,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--D

> ---
>  fs/iomap/buffered-io.c | 39 ++++++++++++++++++++++++++++++---------
>  include/linux/iomap.h  |  1 +
>  2 files changed, 31 insertions(+), 9 deletions(-)
> 
> diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
> index 2a9bab4f3c79..b84838d2b5d8 100644
> --- a/fs/iomap/buffered-io.c
> +++ b/fs/iomap/buffered-io.c
> @@ -457,6 +457,33 @@ bool iomap_is_partially_uptodate(struct folio *folio, size_t from, size_t count)
>  }
>  EXPORT_SYMBOL_GPL(iomap_is_partially_uptodate);
>  
> +/**
> + * iomap_get_folio - get a folio reference for writing
> + * @iter: iteration structure
> + * @pos: start offset of write
> + *
> + * Returns a locked reference to the folio at @pos, or an error pointer if the
> + * folio could not be obtained.
> + */
> +struct folio *iomap_get_folio(struct iomap_iter *iter, loff_t pos)
> +{
> +	unsigned fgp = FGP_LOCK | FGP_WRITE | FGP_CREAT | FGP_STABLE | FGP_NOFS;
> +	struct folio *folio;
> +
> +	if (iter->flags & IOMAP_NOWAIT)
> +		fgp |= FGP_NOWAIT;
> +
> +	folio = __filemap_get_folio(iter->inode->i_mapping, pos >> PAGE_SHIFT,
> +			fgp, mapping_gfp_mask(iter->inode->i_mapping));
> +	if (folio)
> +		return folio;
> +
> +	if (iter->flags & IOMAP_NOWAIT)
> +		return ERR_PTR(-EAGAIN);
> +	return ERR_PTR(-ENOMEM);
> +}
> +EXPORT_SYMBOL_GPL(iomap_get_folio);
> +
>  bool iomap_release_folio(struct folio *folio, gfp_t gfp_flags)
>  {
>  	trace_iomap_release_folio(folio->mapping->host, folio_pos(folio),
> @@ -603,12 +630,8 @@ static int iomap_write_begin(struct iomap_iter *iter, loff_t pos,
>  	const struct iomap_page_ops *page_ops = iter->iomap.page_ops;
>  	const struct iomap *srcmap = iomap_iter_srcmap(iter);
>  	struct folio *folio;
> -	unsigned fgp = FGP_LOCK | FGP_WRITE | FGP_CREAT | FGP_STABLE | FGP_NOFS;
>  	int status = 0;
>  
> -	if (iter->flags & IOMAP_NOWAIT)
> -		fgp |= FGP_NOWAIT;
> -
>  	BUG_ON(pos + len > iter->iomap.offset + iter->iomap.length);
>  	if (srcmap != &iter->iomap)
>  		BUG_ON(pos + len > srcmap->offset + srcmap->length);
> @@ -625,12 +648,10 @@ static int iomap_write_begin(struct iomap_iter *iter, loff_t pos,
>  			return status;
>  	}
>  
> -	folio = __filemap_get_folio(iter->inode->i_mapping, pos >> PAGE_SHIFT,
> -			fgp, mapping_gfp_mask(iter->inode->i_mapping));
> -	if (!folio) {
> -		status = (iter->flags & IOMAP_NOWAIT) ? -EAGAIN : -ENOMEM;
> +	folio = iomap_get_folio(iter, pos);
> +	if (IS_ERR(folio)) {
>  		iomap_put_folio(iter, pos, 0, NULL);
> -		return status;
> +		return PTR_ERR(folio);
>  	}
>  
>  	/*
> diff --git a/include/linux/iomap.h b/include/linux/iomap.h
> index 10ec36f373f4..e5732cc5716b 100644
> --- a/include/linux/iomap.h
> +++ b/include/linux/iomap.h
> @@ -261,6 +261,7 @@ int iomap_file_buffered_write_punch_delalloc(struct inode *inode,
>  int iomap_read_folio(struct folio *folio, const struct iomap_ops *ops);
>  void iomap_readahead(struct readahead_control *, const struct iomap_ops *ops);
>  bool iomap_is_partially_uptodate(struct folio *, size_t from, size_t count);
> +struct folio *iomap_get_folio(struct iomap_iter *iter, loff_t pos);
>  bool iomap_release_folio(struct folio *folio, gfp_t gfp_flags);
>  void iomap_invalidate_folio(struct folio *folio, size_t offset, size_t len);
>  int iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
> -- 
> 2.38.1
> 


WARNING: multiple messages have this Message-ID (diff)
From: "Darrick J. Wong" <djwong@kernel.org>
To: Andreas Gruenbacher <agruenba@redhat.com>
Cc: Christoph Hellwig <hch@infradead.org>,
	Alexander Viro <viro@zeniv.linux.org.uk>,
	Matthew Wilcox <willy@infradead.org>,
	linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-ext4@vger.kernel.org, cluster-devel@redhat.com
Subject: Re: [PATCH v5 4/9] iomap: Add iomap_get_folio helper
Date: Wed, 4 Jan 2023 09:38:14 -0800	[thread overview]
Message-ID: <Y7W5hiktQFd6CvTY@magnolia> (raw)
In-Reply-To: <20221231150919.659533-5-agruenba@redhat.com>

On Sat, Dec 31, 2022 at 04:09:14PM +0100, Andreas Gruenbacher wrote:
> Add an iomap_get_folio() helper that gets a folio reference based on
> an iomap iterator and an offset into the address space.  Use it in
> iomap_write_begin().
> 
> Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>

Pretty straightforward,
Reviewed-by: Darrick J. Wong <djwong@kernel.org>

--D

> ---
>  fs/iomap/buffered-io.c | 39 ++++++++++++++++++++++++++++++---------
>  include/linux/iomap.h  |  1 +
>  2 files changed, 31 insertions(+), 9 deletions(-)
> 
> diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
> index 2a9bab4f3c79..b84838d2b5d8 100644
> --- a/fs/iomap/buffered-io.c
> +++ b/fs/iomap/buffered-io.c
> @@ -457,6 +457,33 @@ bool iomap_is_partially_uptodate(struct folio *folio, size_t from, size_t count)
>  }
>  EXPORT_SYMBOL_GPL(iomap_is_partially_uptodate);
>  
> +/**
> + * iomap_get_folio - get a folio reference for writing
> + * @iter: iteration structure
> + * @pos: start offset of write
> + *
> + * Returns a locked reference to the folio at @pos, or an error pointer if the
> + * folio could not be obtained.
> + */
> +struct folio *iomap_get_folio(struct iomap_iter *iter, loff_t pos)
> +{
> +	unsigned fgp = FGP_LOCK | FGP_WRITE | FGP_CREAT | FGP_STABLE | FGP_NOFS;
> +	struct folio *folio;
> +
> +	if (iter->flags & IOMAP_NOWAIT)
> +		fgp |= FGP_NOWAIT;
> +
> +	folio = __filemap_get_folio(iter->inode->i_mapping, pos >> PAGE_SHIFT,
> +			fgp, mapping_gfp_mask(iter->inode->i_mapping));
> +	if (folio)
> +		return folio;
> +
> +	if (iter->flags & IOMAP_NOWAIT)
> +		return ERR_PTR(-EAGAIN);
> +	return ERR_PTR(-ENOMEM);
> +}
> +EXPORT_SYMBOL_GPL(iomap_get_folio);
> +
>  bool iomap_release_folio(struct folio *folio, gfp_t gfp_flags)
>  {
>  	trace_iomap_release_folio(folio->mapping->host, folio_pos(folio),
> @@ -603,12 +630,8 @@ static int iomap_write_begin(struct iomap_iter *iter, loff_t pos,
>  	const struct iomap_page_ops *page_ops = iter->iomap.page_ops;
>  	const struct iomap *srcmap = iomap_iter_srcmap(iter);
>  	struct folio *folio;
> -	unsigned fgp = FGP_LOCK | FGP_WRITE | FGP_CREAT | FGP_STABLE | FGP_NOFS;
>  	int status = 0;
>  
> -	if (iter->flags & IOMAP_NOWAIT)
> -		fgp |= FGP_NOWAIT;
> -
>  	BUG_ON(pos + len > iter->iomap.offset + iter->iomap.length);
>  	if (srcmap != &iter->iomap)
>  		BUG_ON(pos + len > srcmap->offset + srcmap->length);
> @@ -625,12 +648,10 @@ static int iomap_write_begin(struct iomap_iter *iter, loff_t pos,
>  			return status;
>  	}
>  
> -	folio = __filemap_get_folio(iter->inode->i_mapping, pos >> PAGE_SHIFT,
> -			fgp, mapping_gfp_mask(iter->inode->i_mapping));
> -	if (!folio) {
> -		status = (iter->flags & IOMAP_NOWAIT) ? -EAGAIN : -ENOMEM;
> +	folio = iomap_get_folio(iter, pos);
> +	if (IS_ERR(folio)) {
>  		iomap_put_folio(iter, pos, 0, NULL);
> -		return status;
> +		return PTR_ERR(folio);
>  	}
>  
>  	/*
> diff --git a/include/linux/iomap.h b/include/linux/iomap.h
> index 10ec36f373f4..e5732cc5716b 100644
> --- a/include/linux/iomap.h
> +++ b/include/linux/iomap.h
> @@ -261,6 +261,7 @@ int iomap_file_buffered_write_punch_delalloc(struct inode *inode,
>  int iomap_read_folio(struct folio *folio, const struct iomap_ops *ops);
>  void iomap_readahead(struct readahead_control *, const struct iomap_ops *ops);
>  bool iomap_is_partially_uptodate(struct folio *, size_t from, size_t count);
> +struct folio *iomap_get_folio(struct iomap_iter *iter, loff_t pos);
>  bool iomap_release_folio(struct folio *folio, gfp_t gfp_flags);
>  void iomap_invalidate_folio(struct folio *folio, size_t offset, size_t len);
>  int iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len,
> -- 
> 2.38.1
> 

  reply	other threads:[~2023-01-04 17:38 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-31 15:09 [Cluster-devel] [PATCH v5 0/9] Turn iomap_page_ops into iomap_folio_ops Andreas Gruenbacher
2022-12-31 15:09 ` Andreas Gruenbacher
2022-12-31 15:09 ` [Cluster-devel] [PATCH v5 1/9] iomap: Add iomap_put_folio helper Andreas Gruenbacher
2022-12-31 15:09   ` Andreas Gruenbacher
2023-01-04 17:39   ` [Cluster-devel] " Darrick J. Wong
2023-01-04 17:39     ` Darrick J. Wong
2023-01-08 17:25   ` [Cluster-devel] " Christoph Hellwig
2023-01-08 17:25     ` Christoph Hellwig
2022-12-31 15:09 ` [Cluster-devel] [PATCH v5 2/9] iomap/gfs2: Unlock and put folio in page_done handler Andreas Gruenbacher
2022-12-31 15:09   ` Andreas Gruenbacher
2023-01-04 17:40   ` [Cluster-devel] " Darrick J. Wong
2023-01-04 17:40     ` Darrick J. Wong
2023-01-08 17:26   ` [Cluster-devel] " Christoph Hellwig
2023-01-08 17:26     ` Christoph Hellwig
2022-12-31 15:09 ` [Cluster-devel] [PATCH v5 3/9] iomap: Rename page_done handler to put_folio Andreas Gruenbacher
2022-12-31 15:09   ` Andreas Gruenbacher
2023-01-04 17:37   ` [Cluster-devel] " Darrick J. Wong
2023-01-04 17:37     ` Darrick J. Wong
2023-01-04 18:51     ` [Cluster-devel] " Andreas Grünbacher
2023-01-04 18:51       ` Andreas Grünbacher
2023-01-08 17:26   ` [Cluster-devel] " Christoph Hellwig
2023-01-08 17:26     ` Christoph Hellwig
2022-12-31 15:09 ` [Cluster-devel] [PATCH v5 4/9] iomap: Add iomap_get_folio helper Andreas Gruenbacher
2022-12-31 15:09   ` Andreas Gruenbacher
2023-01-04 17:38   ` Darrick J. Wong [this message]
2023-01-04 17:38     ` Darrick J. Wong
2023-01-08 17:26   ` [Cluster-devel] " Christoph Hellwig
2023-01-08 17:26     ` Christoph Hellwig
2022-12-31 15:09 ` [Cluster-devel] [PATCH v5 5/9] iomap/gfs2: Get page in page_prepare handler Andreas Gruenbacher
2022-12-31 15:09   ` Andreas Gruenbacher
2023-01-04 17:45   ` [Cluster-devel] " Darrick J. Wong
2023-01-04 17:45     ` Darrick J. Wong
2023-01-08 17:29   ` [Cluster-devel] " Christoph Hellwig
2023-01-08 17:29     ` Christoph Hellwig
2023-01-08 19:40     ` [Cluster-devel] " Andreas Gruenbacher
2023-01-08 19:40       ` Andreas Gruenbacher
2022-12-31 15:09 ` [Cluster-devel] [PATCH v5 6/9] iomap: Rename page_prepare handler to get_folio Andreas Gruenbacher
2022-12-31 15:09   ` Andreas Gruenbacher
2023-01-04 17:46   ` [Cluster-devel] " Darrick J. Wong
2023-01-04 17:46     ` Darrick J. Wong
2023-01-08 17:31   ` [Cluster-devel] " Christoph Hellwig
2023-01-08 17:31     ` Christoph Hellwig
2022-12-31 15:09 ` [Cluster-devel] [PATCH v5 7/9] iomap/xfs: Eliminate the iomap_valid handler Andreas Gruenbacher
2022-12-31 15:09   ` Andreas Gruenbacher
2023-01-04 17:53   ` [Cluster-devel] " Darrick J. Wong
2023-01-04 17:53     ` Darrick J. Wong
2023-01-04 19:02     ` [Cluster-devel] " Andreas Grünbacher
2023-01-04 19:02       ` Andreas Grünbacher
2023-01-04 19:08     ` [Cluster-devel] " Matthew Wilcox
2023-01-04 19:08       ` Matthew Wilcox
2023-01-08 17:32       ` [Cluster-devel] " Christoph Hellwig
2023-01-08 17:32         ` Christoph Hellwig
2023-01-08 18:50         ` [Cluster-devel] " Andreas Gruenbacher
2023-01-08 18:50           ` Andreas Gruenbacher
2023-01-10 21:56           ` [Cluster-devel] " Darrick J. Wong
2023-01-10 21:56             ` Darrick J. Wong
2022-12-31 15:09 ` [Cluster-devel] [PATCH v5 8/9] iomap: Rename page_ops to folio_ops Andreas Gruenbacher
2022-12-31 15:09   ` Andreas Gruenbacher
2023-01-04 17:53   ` [Cluster-devel] " Darrick J. Wong
2023-01-04 17:53     ` Darrick J. Wong
2023-01-08 17:33   ` [Cluster-devel] " Christoph Hellwig
2023-01-08 17:33     ` Christoph Hellwig
2022-12-31 15:09 ` [Cluster-devel] [PATCH v5 9/9] xfs: Make xfs_iomap_folio_ops static Andreas Gruenbacher
2022-12-31 15:09   ` Andreas Gruenbacher
2023-01-08 17:33   ` [Cluster-devel] " Christoph Hellwig
2023-01-08 17:33     ` Christoph Hellwig

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=Y7W5hiktQFd6CvTY@magnolia \
    --to=djwong@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.