Commit 20b45077 authored by Dave Young's avatar Dave Young Committed by Chris Mason

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: default avatarDave Young <hidave.darkstar@gmail.com>
Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 42838bb2
...@@ -1713,8 +1713,10 @@ struct btrfs_root *open_ctree(struct super_block *sb, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment