forked from Minki/linux
btrfs: mount failure return value fix
I happened to pass swap partition as root partition in cmdline, then kernel panic and tell me about "Cannot open root device". It is not correct, in fact it is a fs type mismatch instead of 'no device'. Eventually I found btrfs mounting failed with -EIO, it should be -EINVAL. The logic in init/do_mounts.c: for (p = fs_names; *p; p += strlen(p)+1) { int err = do_mount_root(name, p, flags, root_mount_data); switch (err) { case 0: goto out; case -EACCES: flags |= MS_RDONLY; goto retry; case -EINVAL: continue; } print "Cannot open root device" panic } SO fs type after btrfs will have no chance to mount Here fix the return value as -EINVAL Signed-off-by: Dave Young <hidave.darkstar@gmail.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
42838bb265
commit
20b450773d
@ -1713,8 +1713,10 @@ struct btrfs_root *open_ctree(struct super_block *sb,
|
|||||||
fs_info, BTRFS_ROOT_TREE_OBJECTID);
|
fs_info, BTRFS_ROOT_TREE_OBJECTID);
|
||||||
|
|
||||||
bh = btrfs_read_dev_super(fs_devices->latest_bdev);
|
bh = btrfs_read_dev_super(fs_devices->latest_bdev);
|
||||||
if (!bh)
|
if (!bh) {
|
||||||
|
err = -EINVAL;
|
||||||
goto fail_iput;
|
goto fail_iput;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(&fs_info->super_copy, bh->b_data, sizeof(fs_info->super_copy));
|
memcpy(&fs_info->super_copy, bh->b_data, sizeof(fs_info->super_copy));
|
||||||
memcpy(&fs_info->super_for_commit, &fs_info->super_copy,
|
memcpy(&fs_info->super_for_commit, &fs_info->super_copy,
|
||||||
|
@ -600,8 +600,10 @@ static int __btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
|
|||||||
set_blocksize(bdev, 4096);
|
set_blocksize(bdev, 4096);
|
||||||
|
|
||||||
bh = btrfs_read_dev_super(bdev);
|
bh = btrfs_read_dev_super(bdev);
|
||||||
if (!bh)
|
if (!bh) {
|
||||||
|
ret = -EINVAL;
|
||||||
goto error_close;
|
goto error_close;
|
||||||
|
}
|
||||||
|
|
||||||
disk_super = (struct btrfs_super_block *)bh->b_data;
|
disk_super = (struct btrfs_super_block *)bh->b_data;
|
||||||
devid = btrfs_stack_device_id(&disk_super->dev_item);
|
devid = btrfs_stack_device_id(&disk_super->dev_item);
|
||||||
@ -702,7 +704,7 @@ int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,
|
|||||||
goto error_close;
|
goto error_close;
|
||||||
bh = btrfs_read_dev_super(bdev);
|
bh = btrfs_read_dev_super(bdev);
|
||||||
if (!bh) {
|
if (!bh) {
|
||||||
ret = -EIO;
|
ret = -EINVAL;
|
||||||
goto error_close;
|
goto error_close;
|
||||||
}
|
}
|
||||||
disk_super = (struct btrfs_super_block *)bh->b_data;
|
disk_super = (struct btrfs_super_block *)bh->b_data;
|
||||||
@ -1302,7 +1304,7 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
|
|||||||
set_blocksize(bdev, 4096);
|
set_blocksize(bdev, 4096);
|
||||||
bh = btrfs_read_dev_super(bdev);
|
bh = btrfs_read_dev_super(bdev);
|
||||||
if (!bh) {
|
if (!bh) {
|
||||||
ret = -EIO;
|
ret = -EINVAL;
|
||||||
goto error_close;
|
goto error_close;
|
||||||
}
|
}
|
||||||
disk_super = (struct btrfs_super_block *)bh->b_data;
|
disk_super = (struct btrfs_super_block *)bh->b_data;
|
||||||
|
Loading…
Reference in New Issue
Block a user