Re: [PATCH v3] Btrfs: fix crash on endio of reading corrupted block

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Aug 22, 2014, at 10:00 PM, Liu Bo <bo.li.liu@xxxxxxxxxx> wrote:

> The crash is
> 
> ------------[ cut here ]------------
> kernel BUG at fs/btrfs/extent_io.c:2124!
> invalid opcode: 0000 [#1] SMP
> ...
> CPU: 3 PID: 88 Comm: kworker/u8:7 Not tainted 3.17.0-0.rc1.git0.1.fc22.x86_64 #1
> Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
> Workqueue: btrfs-endio normal_work_helper [btrfs]
> task: ffff8800d7152700 ti: ffff8800d729c000 task.ti: ffff8800d729c000
> RIP: 0010:[<ffffffffa02d6055>]  [<ffffffffa02d6055>] end_bio_extent_readpage+0xb45/0xcd0 [btrfs]
> Call Trace:
>  [<ffffffff810c3ef8>] ? __enqueue_entity+0x78/0x80
>  [<ffffffff810ca969>] ? enqueue_entity+0x2e9/0x990
>  [<ffffffff813464ab>] bio_endio+0x6b/0xa0
>  [<ffffffff813464f2>] bio_endio_nodec+0x12/0x20
>  [<ffffffffa02ab217>] end_workqueue_fn+0x37/0x40 [btrfs]
>  [<ffffffffa02e4b5d>] normal_work_helper+0xbd/0x280 [btrfs]
>  [<ffffffff810ac4fe>] process_one_work+0x17e/0x430
>  [<ffffffff810ace8b>] worker_thread+0x6b/0x4a0
>  [<ffffffff810ace20>] ? rescuer_thread+0x2a0/0x2a0
>  [<ffffffff810b1fca>] kthread+0xea/0x100
>  [<ffffffff810b1ee0>] ? kthread_create_on_node+0x1a0/0x1a0
>  [<ffffffff8173dd7c>] ret_from_fork+0x7c/0xb0
>  [<ffffffff810b1ee0>] ? kthread_create_on_node+0x1a0/0x1a0
> 
> This is in fact a regression introduced by commit
> facc8a2247340a9735fe8cc123c5da2102f5ef1b(Btrfs: don't cache the csum value into
> the extent state tree).
> 
> It is because we forgot to increase @offset properly in reading corrupted block,
> so that the @offset remains unchanged, and it leads to checksum errors while
> reading left blocks queued up in the same bio, and then btrfs tries to
> iterate copies for those blocks in order to get good data, and hits the
> BUG_ON() which we set to avoid finding good copies for blocks without problems.
> 
> Reported-by: Chris Murphy <lists@xxxxxxxxxxxxxxxxx>
> Signed-off-by: Liu Bo <bo.li.liu@xxxxxxxxxx>
> ---
> v2:
>   - Improve the commit log to be clear, suggested by Eric.
> v3:
>   - Show the commit that introduces this bug, I forgot to add this in the v2
>     version.
> 
> fs/btrfs/extent_io.c | 1 +
> 1 file changed, 1 insertion(+)
> 
> diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
> index 3af4966..be41e4d 100644
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@ -2602,6 +2602,7 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
> 					test_bit(BIO_UPTODATE, &bio->bi_flags);
> 				if (err)
> 					uptodate = 0;
> +				offset += len;
> 				continue;
> 			}
> 		}
> -- 
> 1.8.1.4
> 
> --

Cannot reproduce with the same steps with kernel 3.17.0-0.rc3.git0.1.fc22.x86_64.


Chris Murphy

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux