Linux-Fsdevel Archive on lore.kernel.org
 help / color / Atom feed
From: "Darrick J. Wong" <darrick.wong@oracle.com>
To: Christoph Hellwig <hch@lst.de>
Cc: Goldwyn Rodrigues <rgoldwyn@suse.com>,
	linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 10/19] xfs: pass two imaps to xfs_reflink_allocate_cow
Date: Wed, 18 Sep 2019 10:26:17 -0700
Message-ID: <20190918172617.GB2229799@magnolia> (raw)
In-Reply-To: <20190909182722.16783-11-hch@lst.de>

On Mon, Sep 09, 2019 at 08:27:13PM +0200, Christoph Hellwig wrote:
> xfs_reflink_allocate_cow consumes the source data fork imap, and
> potentially returns the COW fork imap.  Split the arguments in two
> to clear up the calling conventions and to prepare for returning
> a source iomap from ->iomap_begin.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  fs/xfs/xfs_iomap.c   |  8 ++++----
>  fs/xfs/xfs_reflink.c | 30 +++++++++++++++---------------
>  fs/xfs/xfs_reflink.h |  4 ++--
>  3 files changed, 21 insertions(+), 21 deletions(-)
> 
> diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
> index db4764c16142..b228d1dbf59f 100644
> --- a/fs/xfs/xfs_iomap.c
> +++ b/fs/xfs/xfs_iomap.c
> @@ -996,9 +996,8 @@ xfs_file_iomap_begin(
>  			goto out_found;
>  
>  		/* may drop and re-acquire the ilock */
> -		cmap = imap;
> -		error = xfs_reflink_allocate_cow(ip, &cmap, &shared, &lockmode,
> -				directio);
> +		error = xfs_reflink_allocate_cow(ip, &imap, &cmap, &shared,
> +				&lockmode, directio);
>  		if (error)
>  			goto out_unlock;
>  
> @@ -1011,7 +1010,8 @@ xfs_file_iomap_begin(
>  		 * newly allocated address.  If the data fork has a hole, copy
>  		 * the COW fork mapping to avoid allocating to the data fork.
>  		 */
> -		if (directio || imap.br_startblock == HOLESTARTBLOCK)
> +		if (shared &&

Hmm.  At first I thought this was a behavior change but I think it isn't
because prior to this patch we'd set cmap = imap and if _allocate_cow
didn't find a shared extent then it would just return without doing
anything or touching cmap.  In the !shared case this would just set imap
to itself pointlessly.

Now that we pass both imap and cmap to _allocate_cow, in the !shared
case we don't initialized cmap at all, so adding the @shared check is
required for correct operation, right?

If so,
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>

Thanks for cleaning that up, the "mapping could be from another fork on
exit" behavior always bothered me.

--D

> +		    (directio || imap.br_startblock == HOLESTARTBLOCK))
>  			imap = cmap;
>  
>  		end_fsb = imap.br_startoff + imap.br_blockcount;
> diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
> index 73f8cce4722d..673018a618f0 100644
> --- a/fs/xfs/xfs_reflink.c
> +++ b/fs/xfs/xfs_reflink.c
> @@ -308,13 +308,13 @@ static int
>  xfs_find_trim_cow_extent(
>  	struct xfs_inode	*ip,
>  	struct xfs_bmbt_irec	*imap,
> +	struct xfs_bmbt_irec	*cmap,
>  	bool			*shared,
>  	bool			*found)
>  {
>  	xfs_fileoff_t		offset_fsb = imap->br_startoff;
>  	xfs_filblks_t		count_fsb = imap->br_blockcount;
>  	struct xfs_iext_cursor	icur;
> -	struct xfs_bmbt_irec	got;
>  
>  	*found = false;
>  
> @@ -322,23 +322,22 @@ xfs_find_trim_cow_extent(
>  	 * If we don't find an overlapping extent, trim the range we need to
>  	 * allocate to fit the hole we found.
>  	 */
> -	if (!xfs_iext_lookup_extent(ip, ip->i_cowfp, offset_fsb, &icur, &got))
> -		got.br_startoff = offset_fsb + count_fsb;
> -	if (got.br_startoff > offset_fsb) {
> +	if (!xfs_iext_lookup_extent(ip, ip->i_cowfp, offset_fsb, &icur, cmap))
> +		cmap->br_startoff = offset_fsb + count_fsb;
> +	if (cmap->br_startoff > offset_fsb) {
>  		xfs_trim_extent(imap, imap->br_startoff,
> -				got.br_startoff - imap->br_startoff);
> +				cmap->br_startoff - imap->br_startoff);
>  		return xfs_inode_need_cow(ip, imap, shared);
>  	}
>  
>  	*shared = true;
> -	if (isnullstartblock(got.br_startblock)) {
> -		xfs_trim_extent(imap, got.br_startoff, got.br_blockcount);
> +	if (isnullstartblock(cmap->br_startblock)) {
> +		xfs_trim_extent(imap, cmap->br_startoff, cmap->br_blockcount);
>  		return 0;
>  	}
>  
>  	/* real extent found - no need to allocate */
> -	xfs_trim_extent(&got, offset_fsb, count_fsb);
> -	*imap = got;
> +	xfs_trim_extent(cmap, offset_fsb, count_fsb);
>  	*found = true;
>  	return 0;
>  }
> @@ -348,6 +347,7 @@ int
>  xfs_reflink_allocate_cow(
>  	struct xfs_inode	*ip,
>  	struct xfs_bmbt_irec	*imap,
> +	struct xfs_bmbt_irec	*cmap,
>  	bool			*shared,
>  	uint			*lockmode,
>  	bool			convert_now)
> @@ -367,7 +367,7 @@ xfs_reflink_allocate_cow(
>  		xfs_ifork_init_cow(ip);
>  	}
>  
> -	error = xfs_find_trim_cow_extent(ip, imap, shared, &found);
> +	error = xfs_find_trim_cow_extent(ip, imap, cmap, shared, &found);
>  	if (error || !*shared)
>  		return error;
>  	if (found)
> @@ -392,7 +392,7 @@ xfs_reflink_allocate_cow(
>  	/*
>  	 * Check for an overlapping extent again now that we dropped the ilock.
>  	 */
> -	error = xfs_find_trim_cow_extent(ip, imap, shared, &found);
> +	error = xfs_find_trim_cow_extent(ip, imap, cmap, shared, &found);
>  	if (error || !*shared)
>  		goto out_trans_cancel;
>  	if (found) {
> @@ -411,7 +411,7 @@ xfs_reflink_allocate_cow(
>  	nimaps = 1;
>  	error = xfs_bmapi_write(tp, ip, imap->br_startoff, imap->br_blockcount,
>  			XFS_BMAPI_COWFORK | XFS_BMAPI_PREALLOC,
> -			resblks, imap, &nimaps);
> +			resblks, cmap, &nimaps);
>  	if (error)
>  		goto out_unreserve;
>  
> @@ -427,15 +427,15 @@ xfs_reflink_allocate_cow(
>  	if (nimaps == 0)
>  		return -ENOSPC;
>  convert:
> -	xfs_trim_extent(imap, offset_fsb, count_fsb);
> +	xfs_trim_extent(cmap, offset_fsb, count_fsb);
>  	/*
>  	 * COW fork extents are supposed to remain unwritten until we're ready
>  	 * to initiate a disk write.  For direct I/O we are going to write the
>  	 * data and need the conversion, but for buffered writes we're done.
>  	 */
> -	if (!convert_now || imap->br_state == XFS_EXT_NORM)
> +	if (!convert_now || cmap->br_state == XFS_EXT_NORM)
>  		return 0;
> -	trace_xfs_reflink_convert_cow(ip, imap);
> +	trace_xfs_reflink_convert_cow(ip, cmap);
>  	return xfs_reflink_convert_cow_locked(ip, offset_fsb, count_fsb);
>  
>  out_unreserve:
> diff --git a/fs/xfs/xfs_reflink.h b/fs/xfs/xfs_reflink.h
> index 28a43b7f581d..d18ad7f4fb64 100644
> --- a/fs/xfs/xfs_reflink.h
> +++ b/fs/xfs/xfs_reflink.h
> @@ -25,8 +25,8 @@ extern int xfs_reflink_trim_around_shared(struct xfs_inode *ip,
>  bool xfs_inode_need_cow(struct xfs_inode *ip, struct xfs_bmbt_irec *imap,
>  		bool *shared);
>  
> -extern int xfs_reflink_allocate_cow(struct xfs_inode *ip,
> -		struct xfs_bmbt_irec *imap, bool *shared, uint *lockmode,
> +int xfs_reflink_allocate_cow(struct xfs_inode *ip, struct xfs_bmbt_irec *imap,
> +		struct xfs_bmbt_irec *cmap, bool *shared, uint *lockmode,
>  		bool convert_now);
>  extern int xfs_reflink_convert_cow(struct xfs_inode *ip, xfs_off_t offset,
>  		xfs_off_t count);
> -- 
> 2.20.1
> 

  reply index

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-09 18:27 iomap and xfs COW cleanups Christoph Hellwig
2019-09-09 18:27 ` [PATCH 01/19] iomap: better document the IOMAP_F_* flags Christoph Hellwig
2019-09-14  0:42   ` Allison Collins
2019-09-16 18:08   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 02/19] iomap: remove the unused iomap argument to __iomap_write_end Christoph Hellwig
2019-09-14  0:42   ` Allison Collins
2019-09-16 18:10   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 03/19] iomap: always use AOP_FLAG_NOFS in iomap_write_begin Christoph Hellwig
2019-09-16 18:11   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 04/19] iomap: ignore non-shared or non-data blocks in xfs_file_dirty Christoph Hellwig
2019-09-16 18:12   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 05/19] iomap: move the zeroing case out of iomap_read_page_sync Christoph Hellwig
2019-09-16 18:17   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 06/19] iomap: use write_begin to read pages to unshare Christoph Hellwig
2019-09-16 18:34   ` Darrick J. Wong
2019-09-30 11:07     ` Christoph Hellwig
2019-10-08 15:12       ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 07/19] iomap: use a srcmap for a read-modify-write I/O Christoph Hellwig
2019-09-10 12:48   ` Goldwyn Rodrigues
2019-09-10 14:39     ` hch
2019-09-16 17:57       ` Darrick J. Wong
2019-09-16 18:42   ` Darrick J. Wong
2019-09-18 18:15     ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 08/19] xfs: also call xfs_file_iomap_end_delalloc for zeroing operations Christoph Hellwig
2019-09-18 17:09   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 09/19] xfs: remove xfs_reflink_dirty_extents Christoph Hellwig
2019-09-18 17:17   ` Darrick J. Wong
2019-09-18 17:25     ` Christoph Hellwig
2019-09-18 17:31       ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 10/19] xfs: pass two imaps to xfs_reflink_allocate_cow Christoph Hellwig
2019-09-18 17:26   ` Darrick J. Wong [this message]
2019-09-30 11:10     ` Christoph Hellwig
2019-09-09 18:27 ` [PATCH 11/19] xfs: refactor xfs_file_iomap_begin_delay Christoph Hellwig
2019-09-18 17:30   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 12/19] xfs: fill out the srcmap in iomap_begin Christoph Hellwig
2019-09-18 17:52   ` Darrick J. Wong
2019-10-01  6:26     ` Christoph Hellwig
2019-09-09 18:27 ` [PATCH 13/19] xfs: factor out a helper to calculate the end_fsb Christoph Hellwig
2019-09-14  0:42   ` Allison Collins
2019-09-18 17:55   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 14/19] xfs: split out a new set of read-only iomap ops Christoph Hellwig
2019-09-18 17:56   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 15/19] xfs: move xfs_file_iomap_begin_delay around Christoph Hellwig
2019-09-18 17:59   ` Darrick J. Wong
2019-09-30 11:14     ` Christoph Hellwig
2019-09-09 18:27 ` [PATCH 16/19] xfs: split the iomap ops for buffered vs direct writes Christoph Hellwig
2019-09-18 18:00   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 17/19] xfs: rename the whichfork variable in xfs_buffered_write_iomap_begin Christoph Hellwig
2019-09-14  0:42   ` Allison Collins
2019-09-18 18:00   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 18/19] xfs: cleanup xfs_iomap_write_unwritten Christoph Hellwig
2019-09-18 18:06   ` Darrick J. Wong
2019-09-09 18:27 ` [PATCH 19/19] xfs: improve the IOMAP_NOWAIT check for COW inodes Christoph Hellwig
2019-09-18 18:09   ` Darrick J. Wong

Reply instructions:

You may reply publically 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=20190918172617.GB2229799@magnolia \
    --to=darrick.wong@oracle.com \
    --cc=hch@lst.de \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    --cc=rgoldwyn@suse.com \
    /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

Linux-Fsdevel Archive on lore.kernel.org

Archives are clonable:
	git clone --mirror https://lore.kernel.org/linux-fsdevel/0 linux-fsdevel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 linux-fsdevel linux-fsdevel/ https://lore.kernel.org/linux-fsdevel \
		linux-fsdevel@vger.kernel.org
	public-inbox-index linux-fsdevel

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://nntp.lore.kernel.org/org.kernel.vger.linux-fsdevel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git