1
0
Fork 0
mirror of https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-01-22 16:06:04 -05:00

bcachefs: add support for true/false & yes/no in bool-type options

Here is the patch which uses existing constant table:

Currently, when using bcachefs-tools to set options, bool-type options
can only accept 1 or 0. Add support for accepting true/false and yes/no
for these options.

Signed-off-by: Integral <integral@murena.io>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Acked-by: David Howells <dhowells@redhat.com>
This commit is contained in:
Integral 2024-10-23 18:00:33 +08:00 committed by Kent Overstreet
parent e5ea05293a
commit 394033dcc9
3 changed files with 13 additions and 8 deletions

View file

@ -1,6 +1,7 @@
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/fs_parser.h>
#include "bcachefs.h" #include "bcachefs.h"
#include "compress.h" #include "compress.h"
@ -334,17 +335,18 @@ int bch2_opt_parse(struct bch_fs *c,
switch (opt->type) { switch (opt->type) {
case BCH_OPT_BOOL: case BCH_OPT_BOOL:
if (val) { if (val) {
ret = kstrtou64(val, 10, res); ret = lookup_constant(bool_names, val, -BCH_ERR_option_not_bool);
if (ret != -BCH_ERR_option_not_bool) {
*res = ret;
} else {
if (err)
prt_printf(err, "%s: must be bool", opt->attr.name);
return ret;
}
} else { } else {
ret = 0;
*res = 1; *res = 1;
} }
if (ret < 0 || (*res != 0 && *res != 1)) {
if (err)
prt_printf(err, "%s: must be bool", opt->attr.name);
return ret < 0 ? ret : -BCH_ERR_option_not_bool;
}
break; break;
case BCH_OPT_UINT: case BCH_OPT_UINT:
if (!val) { if (!val) {

View file

@ -13,7 +13,7 @@
#include <linux/namei.h> #include <linux/namei.h>
#include "internal.h" #include "internal.h"
static const struct constant_table bool_names[] = { const struct constant_table bool_names[] = {
{ "0", false }, { "0", false },
{ "1", true }, { "1", true },
{ "false", false }, { "false", false },
@ -22,6 +22,7 @@ static const struct constant_table bool_names[] = {
{ "yes", true }, { "yes", true },
{ }, { },
}; };
EXPORT_SYMBOL(bool_names);
static const struct constant_table * static const struct constant_table *
__lookup_constant(const struct constant_table *tbl, const char *name) __lookup_constant(const struct constant_table *tbl, const char *name)

View file

@ -84,6 +84,8 @@ extern int fs_lookup_param(struct fs_context *fc,
extern int lookup_constant(const struct constant_table tbl[], const char *name, int not_found); extern int lookup_constant(const struct constant_table tbl[], const char *name, int not_found);
extern const struct constant_table bool_names[];
#ifdef CONFIG_VALIDATE_FS_PARSER #ifdef CONFIG_VALIDATE_FS_PARSER
extern bool validate_constant_table(const struct constant_table *tbl, size_t tbl_size, extern bool validate_constant_table(const struct constant_table *tbl, size_t tbl_size,
int low, int high, int special); int low, int high, int special);