diff options
Diffstat (limited to 'fs/btrfs/scrub.c')
| -rw-r--r-- | fs/btrfs/scrub.c | 22 | 
1 files changed, 7 insertions, 15 deletions
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c index bc015f77f3e..2f3d6f917fb 100644 --- a/fs/btrfs/scrub.c +++ b/fs/btrfs/scrub.c @@ -998,6 +998,7 @@ static int scrub_setup_recheck_block(struct scrub_dev *sdev,  			page = sblock->pagev + page_index;  			page->logical = logical;  			page->physical = bbio->stripes[mirror_index].physical; +			/* for missing devices, bdev is NULL */  			page->bdev = bbio->stripes[mirror_index].dev->bdev;  			page->mirror_num = mirror_index + 1;  			page->page = alloc_page(GFP_NOFS); @@ -1042,6 +1043,12 @@ static int scrub_recheck_block(struct btrfs_fs_info *fs_info,  		struct scrub_page *page = sblock->pagev + page_num;  		DECLARE_COMPLETION_ONSTACK(complete); +		if (page->bdev == NULL) { +			page->io_error = 1; +			sblock->no_io_error_seen = 0; +			continue; +		} +  		BUG_ON(!page->page);  		bio = bio_alloc(GFP_NOFS, 1);  		if (!bio) @@ -1257,12 +1264,6 @@ static int scrub_checksum_data(struct scrub_block *sblock)  	if (memcmp(csum, on_disk_csum, sdev->csum_size))  		fail = 1; -	if (fail) { -		spin_lock(&sdev->stat_lock); -		++sdev->stat.csum_errors; -		spin_unlock(&sdev->stat_lock); -	} -  	return fail;  } @@ -1335,15 +1336,6 @@ static int scrub_checksum_tree_block(struct scrub_block *sblock)  	if (memcmp(calculated_csum, on_disk_csum, sdev->csum_size))  		++crc_fail; -	if (crc_fail || fail) { -		spin_lock(&sdev->stat_lock); -		if (crc_fail) -			++sdev->stat.csum_errors; -		if (fail) -			++sdev->stat.verify_errors; -		spin_unlock(&sdev->stat_lock); -	} -  	return fail || crc_fail;  }  |