Skip to content

Commit

Permalink
Btrfs: fail to mount if we have problems reading the block groups
Browse files Browse the repository at this point in the history
We don't actually check the return value of btrfs_read_block_groups, so we can
possibly succeed to mount, but then fail to say read the superblock xattr for
selinux which will cause the vfs code to deactivate the super.

This is a problem because in find_free_extent we just assume that we
will find the right space_info for the allocation we want.  But if we
failed to read the block groups, we won't have setup any space_info's,
and we'll hit a NULL pointer deref in find_free_extent.

This patch fixes that problem by checking the return value of
btrfs_read_block_groups, and failing out properly.  I've also added a
check in find_free_extent so if for some reason we don't find an
appropriate space_info, we just return -ENOSPC.

Signed-off-by: Josef Bacik <josef@redhat.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
  • Loading branch information
Josef Bacik authored and Chris Mason committed Mar 31, 2010
1 parent 6cf8bfb commit 1b1d1f6
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 4 deletions.
11 changes: 8 additions & 3 deletions fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -1922,7 +1922,11 @@ struct btrfs_root *open_ctree(struct super_block *sb,

csum_root->track_dirty = 1;

btrfs_read_block_groups(extent_root);
ret = btrfs_read_block_groups(extent_root);
if (ret) {
printk(KERN_ERR "Failed to read block groups: %d\n", ret);
goto fail_block_groups;
}

fs_info->generation = generation;
fs_info->last_trans_committed = generation;
Expand All @@ -1932,7 +1936,7 @@ struct btrfs_root *open_ctree(struct super_block *sb,
fs_info->cleaner_kthread = kthread_run(cleaner_kthread, tree_root,
"btrfs-cleaner");
if (IS_ERR(fs_info->cleaner_kthread))
goto fail_csum_root;
goto fail_block_groups;

fs_info->transaction_kthread = kthread_run(transaction_kthread,
tree_root,
Expand Down Expand Up @@ -2020,7 +2024,8 @@ struct btrfs_root *open_ctree(struct super_block *sb,
filemap_write_and_wait(fs_info->btree_inode->i_mapping);
invalidate_inode_pages2(fs_info->btree_inode->i_mapping);

fail_csum_root:
fail_block_groups:
btrfs_free_block_groups(fs_info);
free_extent_buffer(csum_root->node);
free_extent_buffer(csum_root->commit_root);
fail_dev_root:
Expand Down
5 changes: 4 additions & 1 deletion fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -4170,6 +4170,10 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans,
ins->offset = 0;

space_info = __find_space_info(root->fs_info, data);
if (!space_info) {
printk(KERN_ERR "No space info for %d\n", data);
return -ENOSPC;
}

if (orig_root->ref_cows || empty_size)
allowed_chunk_alloc = 1;
Expand Down Expand Up @@ -7372,7 +7376,6 @@ static int find_first_block_group(struct btrfs_root *root,
}
path->slots[0]++;
}
ret = -ENOENT;
out:
return ret;
}
Expand Down

0 comments on commit 1b1d1f6

Please sign in to comment.