aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLiu Bo <bo.liu@linux.alibaba.com>2018-03-28 18:11:45 -0400
committerDavid Sterba <dsterba@suse.com>2018-03-30 20:02:14 -0400
commitf50f43539070c6c876bf5435fb23f898f9d81e72 (patch)
treed120e529a489b24d6d569433c1c6b2f7772ee280
parent38e82de8ccd1878fb5f8371b8a6f455a6bbd0325 (diff)
Btrfs: print error messages when failing to read trees
When mount fails to read trees like fs tree, checksum tree, extent tree, etc, there is not enough information about where went wrong. With this, messages like "BTRFS warning (device sdf): failed to read root (objectid=7): -5" would help us a bit. Signed-off-by: Liu Bo <bo.liu@linux.alibaba.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--fs/btrfs/disk-io.c31
1 files changed, 22 insertions, 9 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index a2f3a0c67a99..07b5e6f7df67 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -2383,23 +2383,29 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info)
2383 location.offset = 0; 2383 location.offset = 0;
2384 2384
2385 root = btrfs_read_tree_root(tree_root, &location); 2385 root = btrfs_read_tree_root(tree_root, &location);
2386 if (IS_ERR(root)) 2386 if (IS_ERR(root)) {
2387 return PTR_ERR(root); 2387 ret = PTR_ERR(root);
2388 goto out;
2389 }
2388 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); 2390 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
2389 fs_info->extent_root = root; 2391 fs_info->extent_root = root;
2390 2392
2391 location.objectid = BTRFS_DEV_TREE_OBJECTID; 2393 location.objectid = BTRFS_DEV_TREE_OBJECTID;
2392 root = btrfs_read_tree_root(tree_root, &location); 2394 root = btrfs_read_tree_root(tree_root, &location);
2393 if (IS_ERR(root)) 2395 if (IS_ERR(root)) {
2394 return PTR_ERR(root); 2396 ret = PTR_ERR(root);
2397 goto out;
2398 }
2395 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); 2399 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
2396 fs_info->dev_root = root; 2400 fs_info->dev_root = root;
2397 btrfs_init_devices_late(fs_info); 2401 btrfs_init_devices_late(fs_info);
2398 2402
2399 location.objectid = BTRFS_CSUM_TREE_OBJECTID; 2403 location.objectid = BTRFS_CSUM_TREE_OBJECTID;
2400 root = btrfs_read_tree_root(tree_root, &location); 2404 root = btrfs_read_tree_root(tree_root, &location);
2401 if (IS_ERR(root)) 2405 if (IS_ERR(root)) {
2402 return PTR_ERR(root); 2406 ret = PTR_ERR(root);
2407 goto out;
2408 }
2403 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); 2409 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
2404 fs_info->csum_root = root; 2410 fs_info->csum_root = root;
2405 2411
@@ -2416,7 +2422,7 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info)
2416 if (IS_ERR(root)) { 2422 if (IS_ERR(root)) {
2417 ret = PTR_ERR(root); 2423 ret = PTR_ERR(root);
2418 if (ret != -ENOENT) 2424 if (ret != -ENOENT)
2419 return ret; 2425 goto out;
2420 } else { 2426 } else {
2421 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); 2427 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
2422 fs_info->uuid_root = root; 2428 fs_info->uuid_root = root;
@@ -2425,13 +2431,19 @@ static int btrfs_read_roots(struct btrfs_fs_info *fs_info)
2425 if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) { 2431 if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) {
2426 location.objectid = BTRFS_FREE_SPACE_TREE_OBJECTID; 2432 location.objectid = BTRFS_FREE_SPACE_TREE_OBJECTID;
2427 root = btrfs_read_tree_root(tree_root, &location); 2433 root = btrfs_read_tree_root(tree_root, &location);
2428 if (IS_ERR(root)) 2434 if (IS_ERR(root)) {
2429 return PTR_ERR(root); 2435 ret = PTR_ERR(root);
2436 goto out;
2437 }
2430 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state); 2438 set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
2431 fs_info->free_space_root = root; 2439 fs_info->free_space_root = root;
2432 } 2440 }
2433 2441
2434 return 0; 2442 return 0;
2443out:
2444 btrfs_warn(fs_info, "failed to read root (objectid=%llu): %d",
2445 location.objectid, ret);
2446 return ret;
2435} 2447}
2436 2448
2437int open_ctree(struct super_block *sb, 2449int open_ctree(struct super_block *sb,
@@ -3004,6 +3016,7 @@ retry_root_backup:
3004 fs_info->fs_root = btrfs_read_fs_root_no_name(fs_info, &location); 3016 fs_info->fs_root = btrfs_read_fs_root_no_name(fs_info, &location);
3005 if (IS_ERR(fs_info->fs_root)) { 3017 if (IS_ERR(fs_info->fs_root)) {
3006 err = PTR_ERR(fs_info->fs_root); 3018 err = PTR_ERR(fs_info->fs_root);
3019 btrfs_warn(fs_info, "failed to read fs tree: %d", err);
3007 goto fail_qgroup; 3020 goto fail_qgroup;
3008 } 3021 }
3009 3022