Skip to contentSkip to conversation

Btrfs: Fix crash on read failures at mount

PATCH New David Woodhouse 1 participant 1 message Jul 17, 2009 Btrfs file system

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Btrfs: Fix crash on read failures at mount

I spent a while this morning trying to work out how I'd screwed up parity recovery on RAID5, before coming to my senses and realising that I was still using my RAID6 test case -- and knocking two drives out of a RAID5 array is _expected_ to fail.

My code was doing _exactly_ the right thing, and failing the bio with -EIO. But then we were using the stale buffers anyway. This patch fixes a couple of places where we do that, and gives me a much saner failure mode. There are probably other places which need a similar fix.

fs/btrfs/disk-io.c +10 -0
index 0d50d49..55d9d18 100644
@@ -1783,6 +1783,11 @@ struct btrfs_root *open_ctree(struct super_block *sb,
 					   btrfs_super_chunk_root(disk_super),
 					   blocksize, generation);
 	BUG_ON(!chunk_root->node);
+	if (!test_bit(EXTENT_BUFFER_UPTODATE, &chunk_root->node->bflags)) {
+		printk(KERN_WARNING "btrfs: failed to read chunk root on %s\n",
+		       sb->s_id);
+		goto fail_chunk_root;
+	}
 	btrfs_set_root_node(&chunk_root->root_item, chunk_root->node);
 	chunk_root->commit_root = btrfs_root_node(chunk_root);
 
@@ -1810,6 +1815,11 @@ struct btrfs_root *open_ctree(struct super_block *sb,
 					  blocksize, generation);
 	if (!tree_root->node)
 		goto fail_chunk_root;
+	if (!test_bit(EXTENT_BUFFER_UPTODATE, &tree_root->node->bflags)) {
+		printk(KERN_WARNING "btrfs: failed to read tree root on %s\n",
+		       sb->s_id);
+		goto fail_tree_root;
+	}
 	btrfs_set_root_node(&tree_root->root_item, tree_root->node);
 	tree_root->commit_root = btrfs_root_node(tree_root);
 
Signature · 2 lines
David Woodhouse                            Open Source Technology Centre
[email protected]                              Intel Corporation