linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Josef Bacik <josef@toxicpanda.com>
To: Naohiro Aota <naohiro.aota@wdc.com>,
	linux-btrfs@vger.kernel.org, dsterba@suse.com
Cc: hare@suse.com, linux-fsdevel@vger.kernel.org,
	Jens Axboe <axboe@kernel.dk>,
	Christoph Hellwig <hch@infradead.org>,
	"Darrick J. Wong" <darrick.wong@oracle.com>,
	kernel test robot <lkp@intel.com>
Subject: Re: [PATCH v11 22/40] btrfs: split ordered extent when bio is sent
Date: Tue, 12 Jan 2021 10:59:00 -0500	[thread overview]
Message-ID: <1b259084-ec86-d9c3-740b-9463f3d044af@toxicpanda.com> (raw)
In-Reply-To: <e2332c7ecb8e4b1a98a769db75ceac899ab1c3c0.1608608848.git.naohiro.aota@wdc.com>

On 12/21/20 10:49 PM, Naohiro Aota wrote:
> For a zone append write, the device decides the location the data is
> written to. Therefore we cannot ensure that two bios are written
> consecutively on the device. In order to ensure that a ordered extent maps
> to a contiguous region on disk, we need to maintain a "one bio == one
> ordered extent" rule.
> 
> This commit implements the splitting of an ordered extent and extent map
> on bio submission to adhere to the rule.
> 
> [testbot] made extract_ordered_extent static
> Reported-by: kernel test robot <lkp@intel.com>
> Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
> ---
>   fs/btrfs/inode.c        | 89 +++++++++++++++++++++++++++++++++++++++++
>   fs/btrfs/ordered-data.c | 76 +++++++++++++++++++++++++++++++++++
>   fs/btrfs/ordered-data.h |  2 +
>   3 files changed, 167 insertions(+)
> 
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index 37782b4cfd28..15e0c7714c7f 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -2217,6 +2217,86 @@ static blk_status_t btrfs_submit_bio_start(struct inode *inode, struct bio *bio,
>   	return btrfs_csum_one_bio(BTRFS_I(inode), bio, 0, 0);
>   }
>   
> +static int extract_ordered_extent(struct inode *inode, struct bio *bio,
> +				  loff_t file_offset)
> +{
> +	struct btrfs_ordered_extent *ordered;
> +	struct extent_map *em = NULL, *em_new = NULL;
> +	struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
> +	u64 start = (u64)bio->bi_iter.bi_sector << SECTOR_SHIFT;
> +	u64 len = bio->bi_iter.bi_size;
> +	u64 end = start + len;
> +	u64 ordered_end;
> +	u64 pre, post;
> +	int ret = 0;
> +
> +	ordered = btrfs_lookup_ordered_extent(BTRFS_I(inode), file_offset);
> +	if (WARN_ON_ONCE(!ordered))
> +		return -EIO;
> +
> +	/* No need to split */
> +	if (ordered->disk_num_bytes == len)
> +		goto out;
> +
> +	/* We cannot split once end_bio'd ordered extent */
> +	if (WARN_ON_ONCE(ordered->bytes_left != ordered->disk_num_bytes)) {
> +		ret = -EINVAL;
> +		goto out;
> +	}
> +
> +	/* We cannot split a compressed ordered extent */
> +	if (WARN_ON_ONCE(ordered->disk_num_bytes != ordered->num_bytes)) {
> +		ret = -EINVAL;
> +		goto out;
> +	}
> +
> +	/* We cannot split a waited ordered extent */
> +	if (WARN_ON_ONCE(wq_has_sleeper(&ordered->wait))) {
> +		ret = -EINVAL;
> +		goto out;
> +	}
> +
> +	ordered_end = ordered->disk_bytenr + ordered->disk_num_bytes;
> +	/* bio must be in one ordered extent */
> +	if (WARN_ON_ONCE(start < ordered->disk_bytenr || end > ordered_end)) {
> +		ret = -EINVAL;
> +		goto out;
> +	}
> +
> +	/* Checksum list should be empty */
> +	if (WARN_ON_ONCE(!list_empty(&ordered->list))) {
> +		ret = -EINVAL;
> +		goto out;
> +	}
> +
> +	pre = start - ordered->disk_bytenr;
> +	post = ordered_end - end;
> +
> +	btrfs_split_ordered_extent(ordered, pre, post);
> +
> +	read_lock(&em_tree->lock);
> +	em = lookup_extent_mapping(em_tree, ordered->file_offset, len);
> +	if (!em) {
> +		read_unlock(&em_tree->lock);
> +		ret = -EIO;
> +		goto out;
> +	}
> +	read_unlock(&em_tree->lock);
> +
> +	ASSERT(!test_bit(EXTENT_FLAG_COMPRESSED, &em->flags));
> +	em_new = create_io_em(BTRFS_I(inode), em->start + pre, len,
> +			      em->start + pre, em->block_start + pre, len,
> +			      len, len, BTRFS_COMPRESS_NONE,
> +			      BTRFS_ORDERED_REGULAR);
> +	free_extent_map(em_new);
> +
> +out:
> +	free_extent_map(em);
> +	btrfs_put_ordered_extent(ordered);
> +
> +	return ret;
> +}
> +
>   /*
>    * extent_io.c submission hook. This does the right thing for csum calculation
>    * on write, or reading the csums from the tree before a read.
> @@ -2252,6 +2332,15 @@ blk_status_t btrfs_submit_data_bio(struct inode *inode, struct bio *bio,
>   	if (btrfs_is_free_space_inode(BTRFS_I(inode)))
>   		metadata = BTRFS_WQ_ENDIO_FREE_SPACE;
>   
> +	if (bio_op(bio) == REQ_OP_ZONE_APPEND) {
> +		struct page *page = bio_first_bvec_all(bio)->bv_page;
> +		loff_t file_offset = page_offset(page);
> +
> +		ret = extract_ordered_extent(inode, bio, file_offset);
> +		if (ret)
> +			goto out;
> +	}
> +
>   	if (btrfs_op(bio) != BTRFS_MAP_WRITE) {
>   		ret = btrfs_bio_wq_end_io(fs_info, bio, metadata);
>   		if (ret)
> diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c
> index 79d366a36223..4f8f48e7a482 100644
> --- a/fs/btrfs/ordered-data.c
> +++ b/fs/btrfs/ordered-data.c
> @@ -898,6 +898,82 @@ void btrfs_lock_and_flush_ordered_range(struct btrfs_inode *inode, u64 start,
>   	}
>   }
>   
> +static void clone_ordered_extent(struct btrfs_ordered_extent *ordered, u64 pos,
> +				 u64 len)
> +{
> +	struct inode *inode = ordered->inode;
> +	u64 file_offset = ordered->file_offset + pos;
> +	u64 disk_bytenr = ordered->disk_bytenr + pos;
> +	u64 num_bytes = len;
> +	u64 disk_num_bytes = len;
> +	int type;
> +	unsigned long flags_masked =
> +		ordered->flags & ~(1 << BTRFS_ORDERED_DIRECT);
> +	int compress_type = ordered->compress_type;
> +	unsigned long weight;
> +
> +	weight = hweight_long(flags_masked);
> +	WARN_ON_ONCE(weight > 1);
> +	if (!weight)
> +		type = 0;
> +	else
> +		type = __ffs(flags_masked);
> +
> +	if (test_bit(BTRFS_ORDERED_COMPRESSED, &ordered->flags)) {
> +		WARN_ON_ONCE(1);
> +		btrfs_add_ordered_extent_compress(BTRFS_I(inode), file_offset,
> +						  disk_bytenr, num_bytes,
> +						  disk_num_bytes, type,
> +						  compress_type);
> +	} else if (test_bit(BTRFS_ORDERED_DIRECT, &ordered->flags)) {
> +		btrfs_add_ordered_extent_dio(BTRFS_I(inode), file_offset,
> +					     disk_bytenr, num_bytes,
> +					     disk_num_bytes, type);
> +	} else {
> +		btrfs_add_ordered_extent(BTRFS_I(inode), file_offset,
> +					 disk_bytenr, num_bytes, disk_num_bytes,
> +					 type);
> +	}
> +}

You're completely ignoring errors here which isn't ok.  Thanks,

Josef

  reply	other threads:[~2021-01-12 15:59 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-22  3:48 [PATCH v11 00/40] btrfs: zoned block device support Naohiro Aota
2020-12-22  3:48 ` [PATCH v11 01/40] block: add bio_add_zone_append_page Naohiro Aota
2020-12-22  3:48   ` [PATCH v11 02/40] iomap: support REQ_OP_ZONE_APPEND Naohiro Aota
2021-01-04 22:30     ` Darrick J. Wong
2021-01-13  9:34       ` Johannes Thumshirn
2020-12-22  3:48   ` [PATCH v11 03/40] btrfs: defer loading zone info after opening trees Naohiro Aota
2021-01-11 19:16     ` Josef Bacik
2020-12-22  3:48   ` [PATCH v11 04/40] btrfs: change superblock location on conventional zone Naohiro Aota
2021-01-11 19:47     ` Josef Bacik
2021-01-14 15:10       ` Naohiro Aota
2020-12-22  3:48   ` [PATCH v11 05/40] btrfs: release path before calling into btrfs_load_block_group_zone_info Naohiro Aota
2021-01-11 20:01     ` Josef Bacik
2021-01-12  8:05       ` Johannes Thumshirn
2020-12-22  3:48   ` [PATCH v11 06/40] btrfs: do not load fs_info->zoned from incompat flag Naohiro Aota
2021-01-11 20:08     ` Josef Bacik
2021-01-12  8:00       ` Johannes Thumshirn
2020-12-22  3:49   ` [PATCH v11 07/40] btrfs: disallow fitrim in ZONED mode Naohiro Aota
2021-01-11 20:12     ` Josef Bacik
2021-01-12 10:19       ` Johannes Thumshirn
2020-12-22  3:49   ` [PATCH v11 08/40] btrfs: emulated zoned mode on non-zoned devices Naohiro Aota
2021-01-11 20:54     ` Josef Bacik
2021-01-13 17:58     ` David Sterba
2021-01-13 18:23       ` Johannes Thumshirn
2020-12-22  3:49   ` [PATCH v11 09/40] btrfs: implement zoned chunk allocator Naohiro Aota
2021-01-11 21:24     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 10/40] btrfs: verify device extent is aligned to zone Naohiro Aota
2020-12-22  3:49   ` [PATCH v11 11/40] btrfs: load zone's allocation offset Naohiro Aota
2020-12-22  3:49   ` [PATCH v11 12/40] btrfs: calculate allocation offset for conventional zones Naohiro Aota
2021-01-12 15:12     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 13/40] btrfs: track unusable bytes for zones Naohiro Aota
2021-01-12 15:45     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 14/40] btrfs: do sequential extent allocation in ZONED mode Naohiro Aota
2020-12-22  3:49   ` [PATCH v11 15/40] btrfs: redirty released extent buffers " Naohiro Aota
2021-01-12 15:51     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 16/40] btrfs: advance allocation pointer after tree log node Naohiro Aota
2021-01-12 15:52     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 17/40] btrfs: enable to mount ZONED incompat flag Naohiro Aota
2020-12-22  3:49   ` [PATCH v11 18/40] btrfs: reset zones of unused block groups Naohiro Aota
2021-01-12 15:54     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 19/40] btrfs: extract page adding function Naohiro Aota
2021-01-11 16:22     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 20/40] btrfs: use bio_add_zone_append_page for zoned btrfs Naohiro Aota
2021-01-12 15:55     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 21/40] btrfs: handle REQ_OP_ZONE_APPEND as writing Naohiro Aota
2020-12-22  3:49   ` [PATCH v11 22/40] btrfs: split ordered extent when bio is sent Naohiro Aota
2021-01-12 15:59     ` Josef Bacik [this message]
2021-01-13 10:05       ` Johannes Thumshirn
2021-01-15  7:08     ` Su Yue
2020-12-22  3:49   ` [PATCH v11 23/40] btrfs: extend btrfs_rmap_block for specifying a device Naohiro Aota
2021-01-12 16:00     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 24/40] btrfs: cache if block-group is on a sequential zone Naohiro Aota
2021-01-12 16:01     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 25/40] btrfs: use ZONE_APPEND write for ZONED btrfs Naohiro Aota
2020-12-22  3:49   ` [PATCH v11 26/40] btrfs: enable zone append writing for direct IO Naohiro Aota
2020-12-22  3:49   ` [PATCH v11 27/40] btrfs: introduce dedicated data write path for ZONED mode Naohiro Aota
2021-01-12 19:24     ` Josef Bacik
2021-01-13 10:41       ` Naohiro Aota
2021-01-12 19:28     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 28/40] btrfs: serialize meta IOs on " Naohiro Aota
2020-12-22  3:49   ` [PATCH v11 29/40] btrfs: wait existing extents before truncating Naohiro Aota
2020-12-22  3:49   ` [PATCH v11 30/40] btrfs: avoid async metadata checksum on ZONED mode Naohiro Aota
2020-12-22  3:49   ` [PATCH v11 31/40] btrfs: mark block groups to copy for device-replace Naohiro Aota
2021-01-12 19:30     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 32/40] btrfs: implement cloning for ZONED device-replace Naohiro Aota
2021-01-12 19:36     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 33/40] btrfs: implement copying " Naohiro Aota
2021-01-12 19:37     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 34/40] btrfs: support dev-replace in ZONED mode Naohiro Aota
2021-01-12 19:37     ` Josef Bacik
2021-01-12 19:40     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 35/40] btrfs: enable relocation " Naohiro Aota
2021-01-12 19:43     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 36/40] btrfs: relocate block group to repair IO failure in ZONED Naohiro Aota
2020-12-22  3:49   ` [PATCH v11 37/40] btrfs: split alloc_log_tree() Naohiro Aota
2021-01-12 19:44     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 38/40] btrfs: extend zoned allocator to use dedicated tree-log block group Naohiro Aota
2021-01-12 19:48     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 39/40] btrfs: serialize log transaction on ZONED mode Naohiro Aota
2021-01-12 19:50     ` Josef Bacik
2020-12-22  3:49   ` [PATCH v11 40/40] btrfs: reorder log node allocation Naohiro Aota
2020-12-22 13:35   ` [PATCH v11 01/40] block: add bio_add_zone_append_page Christoph Hellwig
2021-01-12 13:48     ` Johannes Thumshirn
2020-12-22 13:38 ` [PATCH v11 00/40] btrfs: zoned block device support Christoph Hellwig
2021-01-11 10:17   ` Johannes Thumshirn
2021-01-12 10:23     ` hch
2021-01-12 10:26       ` Johannes Thumshirn

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=1b259084-ec86-d9c3-740b-9463f3d044af@toxicpanda.com \
    --to=josef@toxicpanda.com \
    --cc=axboe@kernel.dk \
    --cc=darrick.wong@oracle.com \
    --cc=dsterba@suse.com \
    --cc=hare@suse.com \
    --cc=hch@infradead.org \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=lkp@intel.com \
    --cc=naohiro.aota@wdc.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
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).