Btrfs: EIO when we fail to read tree roots
authorChris Mason <chris.mason@oracle.com>
Mon, 13 Dec 2010 19:47:58 +0000 (14:47 -0500)
committerChris Mason <chris.mason@oracle.com>
Mon, 13 Dec 2010 19:47:58 +0000 (14:47 -0500)
If we just get a plain IO error when we read tree roots, the code
wasn't properly sending that error up the chain.  This allowed mounts to
continue when they should failed, and allowed operations
on partially setup root structs.  The end result was usually oopsen
on spinlocks that hadn't been spun up correctly.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/disk-io.c

index b803c2667673c8ef598aef3ed597f8884348cb0e..a5d2249e6da5b9d6ef4f52a691578bf18b060713 100644 (file)
@@ -1007,7 +1007,10 @@ static int find_and_setup_root(struct btrfs_root *tree_root,
        blocksize = btrfs_level_size(root, btrfs_root_level(&root->root_item));
        root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item),
                                     blocksize, generation);
-       BUG_ON(!root->node);
+       if (!root->node || !btrfs_buffer_uptodate(root->node, generation)) {
+               free_extent_buffer(root->node);
+               return -EIO;
+       }
        root->commit_root = btrfs_root_node(root);
        return 0;
 }