All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: viro@zeniv.linux.org.uk, brauner@kernel.org, axboe@kernel.dk,
	linux-fsdevel@vger.kernel.org, linux-block@vger.kernel.org,
	syzbot+4a08ffdf3667b36650a1@syzkaller.appspotmail.com
Subject: Re: [PATCH] iomap: handle error conditions more gracefully in iomap_to_bh
Date: Tue, 5 Sep 2023 08:39:53 -0700	[thread overview]
Message-ID: <20230905153953.GG28202@frogsfrogsfrogs> (raw)
In-Reply-To: <20230905124120.325518-1-hch@lst.de>

On Tue, Sep 05, 2023 at 02:41:20PM +0200, Christoph Hellwig wrote:
> iomap_to_bh currently BUG()s when the passed in block number is not
> in the iomap.  For file systems that have proper synchronization this
> should never happen and so far hasn't in mainline, but for block devices
> size changes aren't fully synchronized against ongoing I/O.  Instead
> of BUG()ing in this case, return -EIO to the caller, which already has
> proper error handling.  While we're at it, also return -EIO for an
> unknown iomap state instead of returning garbage.
> 
> Fixes: 487c607df790 ("block: use iomap for writes to block devices")
> Reported-by: syzbot+4a08ffdf3667b36650a1@syzkaller.appspotmail.com
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---

Looks like a good improvement.  Who should this go through, me (iomap)
or viro/brauner (vfs*) ?

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

(lol is email down again?)

--D

>  fs/buffer.c | 25 ++++++++++++++-----------
>  1 file changed, 14 insertions(+), 11 deletions(-)
> 
> diff --git a/fs/buffer.c b/fs/buffer.c
> index 2379564e5aeadf..a6785cd07081cb 100644
> --- a/fs/buffer.c
> +++ b/fs/buffer.c
> @@ -2011,7 +2011,7 @@ void folio_zero_new_buffers(struct folio *folio, size_t from, size_t to)
>  }
>  EXPORT_SYMBOL(folio_zero_new_buffers);
>  
> -static void
> +static int
>  iomap_to_bh(struct inode *inode, sector_t block, struct buffer_head *bh,
>  		const struct iomap *iomap)
>  {
> @@ -2025,7 +2025,8 @@ iomap_to_bh(struct inode *inode, sector_t block, struct buffer_head *bh,
>  	 * current block, then do not map the buffer and let the caller
>  	 * handle it.
>  	 */
> -	BUG_ON(offset >= iomap->offset + iomap->length);
> +	if (offset >= iomap->offset + iomap->length)
> +		return -EIO;
>  
>  	switch (iomap->type) {
>  	case IOMAP_HOLE:
> @@ -2037,7 +2038,7 @@ iomap_to_bh(struct inode *inode, sector_t block, struct buffer_head *bh,
>  		if (!buffer_uptodate(bh) ||
>  		    (offset >= i_size_read(inode)))
>  			set_buffer_new(bh);
> -		break;
> +		return 0;
>  	case IOMAP_DELALLOC:
>  		if (!buffer_uptodate(bh) ||
>  		    (offset >= i_size_read(inode)))
> @@ -2045,7 +2046,7 @@ iomap_to_bh(struct inode *inode, sector_t block, struct buffer_head *bh,
>  		set_buffer_uptodate(bh);
>  		set_buffer_mapped(bh);
>  		set_buffer_delay(bh);
> -		break;
> +		return 0;
>  	case IOMAP_UNWRITTEN:
>  		/*
>  		 * For unwritten regions, we always need to ensure that regions
> @@ -2062,7 +2063,10 @@ iomap_to_bh(struct inode *inode, sector_t block, struct buffer_head *bh,
>  		bh->b_blocknr = (iomap->addr + offset - iomap->offset) >>
>  				inode->i_blkbits;
>  		set_buffer_mapped(bh);
> -		break;
> +		return 0;
> +	default:
> +		WARN_ON_ONCE(1);
> +		return -EIO;
>  	}
>  }
>  
> @@ -2103,13 +2107,12 @@ int __block_write_begin_int(struct folio *folio, loff_t pos, unsigned len,
>  			clear_buffer_new(bh);
>  		if (!buffer_mapped(bh)) {
>  			WARN_ON(bh->b_size != blocksize);
> -			if (get_block) {
> +			if (get_block)
>  				err = get_block(inode, block, bh, 1);
> -				if (err)
> -					break;
> -			} else {
> -				iomap_to_bh(inode, block, bh, iomap);
> -			}
> +			else
> +				err = iomap_to_bh(inode, block, bh, iomap);
> +			if (err)
> +				break;
>  
>  			if (buffer_new(bh)) {
>  				clean_bdev_bh_alias(bh);
> -- 
> 2.39.2
> 

  reply	other threads:[~2023-09-05 16:25 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-05 12:41 [PATCH] iomap: handle error conditions more gracefully in iomap_to_bh Christoph Hellwig
2023-09-05 15:39 ` Darrick J. Wong [this message]
2023-09-05 15:53   ` Christoph Hellwig
2023-09-06 14:30   ` Christian Brauner
2023-09-06 14:54     ` Darrick J. Wong
2023-09-06  1:18 ` Damien Le Moal
2023-09-06  9:26 ` Hannes Reinecke
2023-09-06 14:31 ` Christian Brauner

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=20230905153953.GG28202@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=axboe@kernel.dk \
    --cc=brauner@kernel.org \
    --cc=hch@lst.de \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=syzbot+4a08ffdf3667b36650a1@syzkaller.appspotmail.com \
    --cc=viro@zeniv.linux.org.uk \
    /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.