Btrfs: add sanity checks regarding to parsing mount options
I just notice the following commands succeed: mount <dev> <mnt> -o thread_pool=-1 This is ridiculous, only positive thread_pool makes sense,this patch adds sanity checks for them, and also catches the error of ENOMEM if allocating memory fails. Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> Reviewed-by: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
This commit is contained in:
Родитель
3cd846d1d7
Коммит
2c334e87f3
|
@ -496,10 +496,15 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||||
btrfs_set_opt(info->mount_opt, NOBARRIER);
|
btrfs_set_opt(info->mount_opt, NOBARRIER);
|
||||||
break;
|
break;
|
||||||
case Opt_thread_pool:
|
case Opt_thread_pool:
|
||||||
intarg = 0;
|
ret = match_int(&args[0], &intarg);
|
||||||
match_int(&args[0], &intarg);
|
if (ret) {
|
||||||
if (intarg)
|
goto out;
|
||||||
|
} else if (intarg > 0) {
|
||||||
info->thread_pool_size = intarg;
|
info->thread_pool_size = intarg;
|
||||||
|
} else {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Opt_max_inline:
|
case Opt_max_inline:
|
||||||
num = match_strdup(&args[0]);
|
num = match_strdup(&args[0]);
|
||||||
|
@ -514,6 +519,9 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||||
}
|
}
|
||||||
printk(KERN_INFO "btrfs: max_inline at %llu\n",
|
printk(KERN_INFO "btrfs: max_inline at %llu\n",
|
||||||
(unsigned long long)info->max_inline);
|
(unsigned long long)info->max_inline);
|
||||||
|
} else {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Opt_alloc_start:
|
case Opt_alloc_start:
|
||||||
|
@ -526,6 +534,9 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
"btrfs: allocations start at %llu\n",
|
"btrfs: allocations start at %llu\n",
|
||||||
(unsigned long long)info->alloc_start);
|
(unsigned long long)info->alloc_start);
|
||||||
|
} else {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Opt_noacl:
|
case Opt_noacl:
|
||||||
|
@ -540,12 +551,16 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||||
btrfs_set_opt(info->mount_opt, FLUSHONCOMMIT);
|
btrfs_set_opt(info->mount_opt, FLUSHONCOMMIT);
|
||||||
break;
|
break;
|
||||||
case Opt_ratio:
|
case Opt_ratio:
|
||||||
intarg = 0;
|
ret = match_int(&args[0], &intarg);
|
||||||
match_int(&args[0], &intarg);
|
if (ret) {
|
||||||
if (intarg) {
|
goto out;
|
||||||
|
} else if (intarg >= 0) {
|
||||||
info->metadata_ratio = intarg;
|
info->metadata_ratio = intarg;
|
||||||
printk(KERN_INFO "btrfs: metadata ratio %d\n",
|
printk(KERN_INFO "btrfs: metadata ratio %d\n",
|
||||||
info->metadata_ratio);
|
info->metadata_ratio);
|
||||||
|
} else {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Opt_discard:
|
case Opt_discard:
|
||||||
|
@ -596,13 +611,17 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||||
btrfs_set_opt(info->mount_opt, CHECK_INTEGRITY);
|
btrfs_set_opt(info->mount_opt, CHECK_INTEGRITY);
|
||||||
break;
|
break;
|
||||||
case Opt_check_integrity_print_mask:
|
case Opt_check_integrity_print_mask:
|
||||||
intarg = 0;
|
ret = match_int(&args[0], &intarg);
|
||||||
match_int(&args[0], &intarg);
|
if (ret) {
|
||||||
if (intarg) {
|
goto out;
|
||||||
|
} else if (intarg >= 0) {
|
||||||
info->check_integrity_print_mask = intarg;
|
info->check_integrity_print_mask = intarg;
|
||||||
printk(KERN_INFO "btrfs:"
|
printk(KERN_INFO "btrfs:"
|
||||||
" check_integrity_print_mask 0x%x\n",
|
" check_integrity_print_mask 0x%x\n",
|
||||||
info->check_integrity_print_mask);
|
info->check_integrity_print_mask);
|
||||||
|
} else {
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#else
|
#else
|
||||||
|
@ -679,17 +698,25 @@ static int btrfs_parse_early_options(const char *options, fmode_t flags,
|
||||||
case Opt_subvol:
|
case Opt_subvol:
|
||||||
kfree(*subvol_name);
|
kfree(*subvol_name);
|
||||||
*subvol_name = match_strdup(&args[0]);
|
*subvol_name = match_strdup(&args[0]);
|
||||||
|
if (!*subvol_name) {
|
||||||
|
error = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Opt_subvolid:
|
case Opt_subvolid:
|
||||||
intarg = 0;
|
|
||||||
error = match_int(&args[0], &intarg);
|
error = match_int(&args[0], &intarg);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
|
goto out;
|
||||||
|
} else if (intarg >= 0) {
|
||||||
/* we want the original fs_tree */
|
/* we want the original fs_tree */
|
||||||
if (!intarg)
|
if (!intarg)
|
||||||
*subvol_objectid =
|
*subvol_objectid =
|
||||||
BTRFS_FS_TREE_OBJECTID;
|
BTRFS_FS_TREE_OBJECTID;
|
||||||
else
|
else
|
||||||
*subvol_objectid = intarg;
|
*subvol_objectid = intarg;
|
||||||
|
} else {
|
||||||
|
error = -EINVAL;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Opt_subvolrootid:
|
case Opt_subvolrootid:
|
||||||
|
|
Загрузка…
Ссылка в новой задаче