All of lore.kernel.org
 help / color / mirror / Atom feed
From: Liu Bo <bo.li.liu@oracle.com>
To: Chandan Rajendra <chandan@linux.vnet.ibm.com>
Cc: clm@fb.com, jbacik@fb.com, dsterba@suse.cz,
	linux-btrfs@vger.kernel.org, chandan@mykolab.com
Subject: Re: [RFC PATCH V11 09/21] Btrfs: subpagesize-blocksize: Direct I/O read: Work on sectorsized blocks.
Date: Wed, 1 Jul 2015 22:45:00 +0800	[thread overview]
Message-ID: <20150701144459.GD7847@localhost.localdomain> (raw)
In-Reply-To: <1433172176-8742-10-git-send-email-chandan@linux.vnet.ibm.com>

On Mon, Jun 01, 2015 at 08:52:44PM +0530, Chandan Rajendra wrote:
> The direct I/O read's endio and corresponding repair functions work on
> page sized blocks. Fix this.
> 
> Signed-off-by: Chandan Rajendra <chandan@linux.vnet.ibm.com>
> ---
>  fs/btrfs/inode.c | 94 ++++++++++++++++++++++++++++++++++++++++++--------------
>  1 file changed, 71 insertions(+), 23 deletions(-)
> 
> diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
> index ac6a3f3..958e4e6 100644
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@ -7643,9 +7643,9 @@ static int btrfs_check_dio_repairable(struct inode *inode,
>  }
>  
>  static int dio_read_error(struct inode *inode, struct bio *failed_bio,
> -			  struct page *page, u64 start, u64 end,
> -			  int failed_mirror, bio_end_io_t *repair_endio,
> -			  void *repair_arg)
> +			struct page *page, unsigned int pgoff,
> +			u64 start, u64 end, int failed_mirror,
> +			bio_end_io_t *repair_endio, void *repair_arg)
>  {
>  	struct io_failure_record *failrec;
>  	struct bio *bio;
> @@ -7666,7 +7666,9 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio,
>  		return -EIO;
>  	}
>  
> -	if (failed_bio->bi_vcnt > 1)
> +	if ((failed_bio->bi_vcnt > 1)
> +		|| (failed_bio->bi_io_vec->bv_len
> +			> BTRFS_I(inode)->root->sectorsize))
>  		read_mode = READ_SYNC | REQ_FAILFAST_DEV;
>  	else
>  		read_mode = READ_SYNC;
> @@ -7674,7 +7676,7 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio,
>  	isector = start - btrfs_io_bio(failed_bio)->logical;
>  	isector >>= inode->i_sb->s_blocksize_bits;
>  	bio = btrfs_create_repair_bio(inode, failed_bio, failrec, page,
> -				      0, isector, repair_endio, repair_arg);
> +				pgoff, isector, repair_endio, repair_arg);
>  	if (!bio) {
>  		free_io_failure(inode, failrec);
>  		return -EIO;
> @@ -7704,12 +7706,17 @@ struct btrfs_retry_complete {
>  static void btrfs_retry_endio_nocsum(struct bio *bio, int err)
>  {
>  	struct btrfs_retry_complete *done = bio->bi_private;
> +	struct inode *inode;
>  	struct bio_vec *bvec;
>  	int i;
>  
>  	if (err)
>  		goto end;
>  
> +	BUG_ON(bio->bi_vcnt != 1);
> +	inode = bio->bi_io_vec->bv_page->mapping->host;
> +	BUG_ON(bio->bi_io_vec->bv_len != BTRFS_I(inode)->root->sectorsize);
> +
>  	done->uptodate = 1;
>  	bio_for_each_segment_all(bvec, bio, i)
>  		clean_io_failure(done->inode, done->start, bvec->bv_page, 0);
> @@ -7724,22 +7731,30 @@ static int __btrfs_correct_data_nocsum(struct inode *inode,
>  	struct bio_vec *bvec;
>  	struct btrfs_retry_complete done;
>  	u64 start;
> +	unsigned int pgoff;
> +	u32 sectorsize;
> +	int nr_sectors;
>  	int i;
>  	int ret;
>  
> +	sectorsize = BTRFS_I(inode)->root->sectorsize;
> +
>  	start = io_bio->logical;
>  	done.inode = inode;
>  
>  	bio_for_each_segment_all(bvec, &io_bio->bio, i) {
> -try_again:
> +		nr_sectors = bvec->bv_len >> inode->i_sb->s_blocksize_bits;
> +		pgoff = bvec->bv_offset;
> +
> +next_block_or_try_again:
>  		done.uptodate = 0;
>  		done.start = start;
>  		init_completion(&done.done);
>  
> -		ret = dio_read_error(inode, &io_bio->bio, bvec->bv_page, start,
> -				     start + bvec->bv_len - 1,
> -				     io_bio->mirror_num,
> -				     btrfs_retry_endio_nocsum, &done);
> +		ret = dio_read_error(inode, &io_bio->bio, bvec->bv_page,
> +				pgoff, start, start + sectorsize - 1,
> +				io_bio->mirror_num,
> +				btrfs_retry_endio_nocsum, &done);
>  		if (ret)
>  			return ret;
>  
> @@ -7747,10 +7762,15 @@ try_again:
>  
>  		if (!done.uptodate) {
>  			/* We might have another mirror, so try again */
> -			goto try_again;
> +			goto next_block_or_try_again;
>  		}
>  
> -		start += bvec->bv_len;
> +		start += sectorsize;
> +
> +		if (nr_sectors--) {
> +			pgoff += sectorsize;
> +			goto next_block_or_try_again;
> +		}
>  	}
>  
>  	return 0;
> @@ -7760,7 +7780,9 @@ static void btrfs_retry_endio(struct bio *bio, int err)
>  {
>  	struct btrfs_retry_complete *done = bio->bi_private;
>  	struct btrfs_io_bio *io_bio = btrfs_io_bio(bio);
> +	struct inode * inode;
>  	struct bio_vec *bvec;
> +	u64 start;
>  	int uptodate;
>  	int ret;
>  	int i;
> @@ -7769,13 +7791,20 @@ static void btrfs_retry_endio(struct bio *bio, int err)
>  		goto end;
>  
>  	uptodate = 1;
> +
> +	start = done->start;
> +
> +	BUG_ON(bio->bi_vcnt != 1);
> +	inode = bio->bi_io_vec->bv_page->mapping->host;
> +	BUG_ON(bio->bi_io_vec->bv_len != BTRFS_I(inode)->root->sectorsize);
> +
>  	bio_for_each_segment_all(bvec, bio, i) {
>  		ret = __readpage_endio_check(done->inode, io_bio, i,
> -					     bvec->bv_page, 0,
> -					     done->start, bvec->bv_len);
> +					bvec->bv_page, bvec->bv_offset,
> +					done->start, bvec->bv_len);
>  		if (!ret)
>  			clean_io_failure(done->inode, done->start,
> -					 bvec->bv_page, 0);
> +					bvec->bv_page, bvec->bv_offset);
>  		else
>  			uptodate = 0;
>  	}
> @@ -7793,16 +7822,30 @@ static int __btrfs_subio_endio_read(struct inode *inode,
>  	struct btrfs_retry_complete done;
>  	u64 start;
>  	u64 offset = 0;
> +	u32 sectorsize;
> +	int nr_sectors;
> +	unsigned int pgoff;
> +	int csum_pos;
>  	int i;
>  	int ret;
> +	unsigned char blocksize_bits;
> +
> +	blocksize_bits = inode->i_sb->s_blocksize_bits;
> +	sectorsize = BTRFS_I(inode)->root->sectorsize;
>  
>  	err = 0;
>  	start = io_bio->logical;
>  	done.inode = inode;
>  
>  	bio_for_each_segment_all(bvec, &io_bio->bio, i) {
> -		ret = __readpage_endio_check(inode, io_bio, i, bvec->bv_page,
> -					     0, start, bvec->bv_len);
> +		nr_sectors = bvec->bv_len >> blocksize_bits;
> +		pgoff = bvec->bv_offset;
> +next_block:
> +		csum_pos = offset >> blocksize_bits;
> +
> +		ret = __readpage_endio_check(inode, io_bio, csum_pos,
> +					bvec->bv_page, pgoff, start,
> +					sectorsize);
>  		if (likely(!ret))
>  			goto next;
>  try_again:
> @@ -7810,10 +7853,10 @@ try_again:
>  		done.start = start;
>  		init_completion(&done.done);
>  
> -		ret = dio_read_error(inode, &io_bio->bio, bvec->bv_page, start,
> -				     start + bvec->bv_len - 1,
> -				     io_bio->mirror_num,
> -				     btrfs_retry_endio, &done);
> +		ret = dio_read_error(inode, &io_bio->bio, bvec->bv_page,
> +				pgoff, start, start + sectorsize - 1,
> +				io_bio->mirror_num,
> +				btrfs_retry_endio, &done);
>  		if (ret) {
>  			err = ret;
>  			goto next;
> @@ -7826,8 +7869,13 @@ try_again:
>  			goto try_again;
>  		}
>  next:
> -		offset += bvec->bv_len;
> -		start += bvec->bv_len;
> +		offset += sectorsize;
> +		start += sectorsize;
> +

It'd better to put a ASSERT(nr_sectors) in case some crazy things
happen.

Thanks,

-liubo
> +		if (--nr_sectors) {
> +			pgoff += sectorsize;
> +			goto next_block;
> +		}
>  	}
>  
>  	return err;
> -- 
> 2.1.0
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

  reply	other threads:[~2015-07-01 14:45 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-01 15:22 [RFC PATCH V11 00/21] Btrfs: Subpagesize-blocksize: Allow I/O on blocks whose size is less than page size Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 01/21] Btrfs: subpagesize-blocksize: Fix whole page read Chandan Rajendra
2015-06-19  4:45   ` Liu Bo
2015-06-19  9:45     ` Chandan Rajendra
2015-06-23  8:37       ` Liu Bo
2016-02-10 10:44         ` David Sterba
2016-02-10 10:39       ` David Sterba
2016-02-11  5:42         ` Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 02/21] Btrfs: subpagesize-blocksize: Fix whole page write Chandan Rajendra
2015-06-26  9:50   ` Liu Bo
2015-06-29  8:54     ` Chandan Rajendra
2015-07-01 14:27       ` Liu Bo
2015-06-01 15:22 ` [RFC PATCH V11 03/21] Btrfs: subpagesize-blocksize: __btrfs_buffered_write: Reserve/release extents aligned to block size Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 04/21] Btrfs: subpagesize-blocksize: Define extent_buffer_head Chandan Rajendra
2015-07-01 14:33   ` Liu Bo
2015-06-01 15:22 ` [RFC PATCH V11 05/21] Btrfs: subpagesize-blocksize: Read tree blocks whose size is < PAGE_SIZE Chandan Rajendra
2015-07-01 14:40   ` Liu Bo
2015-07-03 10:02     ` Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 06/21] Btrfs: subpagesize-blocksize: Write only dirty extent buffers belonging to a page Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 07/21] Btrfs: subpagesize-blocksize: Allow mounting filesystems where sectorsize != PAGE_SIZE Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 08/21] Btrfs: subpagesize-blocksize: Compute and look up csums based on sectorsized blocks Chandan Rajendra
2015-07-01 14:37   ` Liu Bo
2015-06-01 15:22 ` [RFC PATCH V11 09/21] Btrfs: subpagesize-blocksize: Direct I/O read: Work " Chandan Rajendra
2015-07-01 14:45   ` Liu Bo [this message]
2015-07-03 10:05     ` Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 10/21] Btrfs: subpagesize-blocksize: fallocate: Work with sectorsized units Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 11/21] Btrfs: subpagesize-blocksize: btrfs_page_mkwrite: Reserve space in " Chandan Rajendra
2015-07-06  3:18   ` Liu Bo
2015-06-01 15:22 ` [RFC PATCH V11 12/21] Btrfs: subpagesize-blocksize: Search for all ordered extents that could span across a page Chandan Rajendra
2015-07-01 14:47   ` Liu Bo
2015-07-03 10:08     ` Chandan Rajendra
2015-07-06  3:17       ` Liu Bo
2015-07-06 10:49         ` Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 13/21] Btrfs: subpagesize-blocksize: Deal with partial ordered extent allocations Chandan Rajendra
2015-07-06 10:06   ` Liu Bo
2015-07-07 13:38     ` Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 14/21] Btrfs: subpagesize-blocksize: Explicitly Track I/O status of blocks of an ordered extent Chandan Rajendra
2015-07-20  8:34   ` Liu Bo
2015-07-20 12:54     ` Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 15/21] Btrfs: subpagesize-blocksize: Revert commit fc4adbff823f76577ece26dcb88bf6f8392dbd43 Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 16/21] Btrfs: subpagesize-blocksize: Prevent writes to an extent buffer when PG_writeback flag is set Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 17/21] Btrfs: subpagesize-blocksize: Use (eb->start, seq) as search key for tree modification log Chandan Rajendra
2015-07-20 14:46   ` Liu Bo
2015-06-01 15:22 ` [RFC PATCH V11 18/21] Btrfs: subpagesize-blocksize: btrfs_submit_direct_hook: Handle map_length < bio vector length Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 19/21] Revert "btrfs: fix lockups from btrfs_clear_path_blocking" Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 20/21] Btrfs: subpagesize-blockssize: Limit inline extents to root->sectorsize Chandan Rajendra
2015-06-01 15:22 ` [RFC PATCH V11 21/21] Btrfs: subpagesize-blocksize: Fix block size returned to user space Chandan Rajendra

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=20150701144459.GD7847@localhost.localdomain \
    --to=bo.li.liu@oracle.com \
    --cc=chandan@linux.vnet.ibm.com \
    --cc=chandan@mykolab.com \
    --cc=clm@fb.com \
    --cc=dsterba@suse.cz \
    --cc=jbacik@fb.com \
    --cc=linux-btrfs@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.