aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorStefan Behrens <sbehrens@giantdisaster.de>2012-08-27 10:30:03 -0400
committerChris Mason <chris.mason@oracle.com>2012-08-28 16:53:39 -0400
commit5ee0844d6427e7338e0aba748f62b62d07ea2ed0 (patch)
tree27980140d38e5158d64f24a5027beb46b52bc476 /fs
parent68ce9682a4bb95d6be5529cb57214bf2a1b7d20e (diff)
Btrfs: revert checksum error statistic which can cause a BUG()
Commit 442a4f6308e694e0fa6025708bd5e4e424bbf51c added btrfs device statistic counters for detected IO and checksum errors to Linux 3.5. The statistic part that counts checksum errors in end_bio_extent_readpage() can cause a BUG() in a subfunction: "kernel BUG at fs/btrfs/volumes.c:3762!" That part is reverted with the current patch. However, the counting of checksum errors in the scrub context remains active, and the counting of detected IO errors (read, write or flush errors) in all contexts remains active. Cc: stable <stable@vger.kernel.org> # 3.5 Signed-off-by: Stefan Behrens <sbehrens@giantdisaster.de> Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/extent_io.c17
-rw-r--r--fs/btrfs/volumes.c22
-rw-r--r--fs/btrfs/volumes.h2
3 files changed, 2 insertions, 39 deletions
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 3e7c9ed6505..49085f2336d 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2329,23 +2329,10 @@ static void end_bio_extent_readpage(struct bio *bio, int err)
2329 if (uptodate && tree->ops && tree->ops->readpage_end_io_hook) { 2329 if (uptodate && tree->ops && tree->ops->readpage_end_io_hook) {
2330 ret = tree->ops->readpage_end_io_hook(page, start, end, 2330 ret = tree->ops->readpage_end_io_hook(page, start, end,
2331 state, mirror); 2331 state, mirror);
2332 if (ret) { 2332 if (ret)
2333 /* no IO indicated but software detected errors
2334 * in the block, either checksum errors or
2335 * issues with the contents */
2336 struct btrfs_root *root =
2337 BTRFS_I(page->mapping->host)->root;
2338 struct btrfs_device *device;
2339
2340 uptodate = 0; 2333 uptodate = 0;
2341 device = btrfs_find_device_for_logical( 2334 else
2342 root, start, mirror);
2343 if (device)
2344 btrfs_dev_stat_inc_and_print(device,
2345 BTRFS_DEV_STAT_CORRUPTION_ERRS);
2346 } else {
2347 clean_io_failure(start, page); 2335 clean_io_failure(start, page);
2348 }
2349 } 2336 }
2350 2337
2351 if (!uptodate && tree->ops && tree->ops->readpage_io_failed_hook) { 2338 if (!uptodate && tree->ops && tree->ops->readpage_io_failed_hook) {
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 0b1e69d380d..3f4e70e171e 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -4610,28 +4610,6 @@ int btrfs_read_sys_array(struct btrfs_root *root)
4610 return ret; 4610 return ret;
4611} 4611}
4612 4612
4613struct btrfs_device *btrfs_find_device_for_logical(struct btrfs_root *root,
4614 u64 logical, int mirror_num)
4615{
4616 struct btrfs_mapping_tree *map_tree = &root->fs_info->mapping_tree;
4617 int ret;
4618 u64 map_length = 0;
4619 struct btrfs_bio *bbio = NULL;
4620 struct btrfs_device *device;
4621
4622 BUG_ON(mirror_num == 0);
4623 ret = btrfs_map_block(map_tree, WRITE, logical, &map_length, &bbio,
4624 mirror_num);
4625 if (ret) {
4626 BUG_ON(bbio != NULL);
4627 return NULL;
4628 }
4629 BUG_ON(mirror_num != bbio->mirror_num);
4630 device = bbio->stripes[mirror_num - 1].dev;
4631 kfree(bbio);
4632 return device;
4633}
4634
4635int btrfs_read_chunk_tree(struct btrfs_root *root) 4613int btrfs_read_chunk_tree(struct btrfs_root *root)
4636{ 4614{
4637 struct btrfs_path *path; 4615 struct btrfs_path *path;
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
index 5479325987b..53c06af92e8 100644
--- a/fs/btrfs/volumes.h
+++ b/fs/btrfs/volumes.h
@@ -289,8 +289,6 @@ int btrfs_cancel_balance(struct btrfs_fs_info *fs_info);
289int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset); 289int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset);
290int find_free_dev_extent(struct btrfs_device *device, u64 num_bytes, 290int find_free_dev_extent(struct btrfs_device *device, u64 num_bytes,
291 u64 *start, u64 *max_avail); 291 u64 *start, u64 *max_avail);
292struct btrfs_device *btrfs_find_device_for_logical(struct btrfs_root *root,
293 u64 logical, int mirror_num);
294void btrfs_dev_stat_print_on_error(struct btrfs_device *device); 292void btrfs_dev_stat_print_on_error(struct btrfs_device *device);
295void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index); 293void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index);
296int btrfs_get_dev_stats(struct btrfs_root *root, 294int btrfs_get_dev_stats(struct btrfs_root *root,