On Oct 23, 2024, at 18:00, Integral <[email protected]> wrote:
> 
> 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 <[email protected]>

The code changes part looks good.

> ---
> fs/bcachefs/opts.c | 18 +++++++++++-------
> fs/fs_parser.c     |  3 ++-
> 2 files changed, 13 insertions(+), 8 deletions(-)
> 
> diff --git a/fs/bcachefs/opts.c b/fs/bcachefs/opts.c
> index 68d240126522..b564c42d62f8 100644
> --- a/fs/bcachefs/opts.c
> +++ b/fs/bcachefs/opts.c
> @@ -1,6 +1,7 @@
> // SPDX-License-Identifier: GPL-2.0
> 
> #include <linux/kernel.h>
> +#include <linux/fs_parser.h>
> 
> #include "bcachefs.h"
> #include "compress.h"
> @@ -322,6 +323,8 @@ int bch2_opt_validate(const struct bch_option *opt, u64 
> v, struct printbuf *err)
> return 0;
> }
> 
> +extern const struct constant_table bool_names[];
> +
> int bch2_opt_parse(struct bch_fs *c,
>   const struct bch_option *opt,
>   const char *val, u64 *res,
> @@ -332,17 +335,18 @@ int bch2_opt_parse(struct bch_fs *c,
> switch (opt->type) {
> case BCH_OPT_BOOL:
> 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 {
> - ret = 0;
> *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;
> case BCH_OPT_UINT:
> if (!val) {
> diff --git a/fs/fs_parser.c b/fs/fs_parser.c
> index 24727ec34e5a..6521e9a9d6ef 100644
> --- a/fs/fs_parser.c
> +++ b/fs/fs_parser.c
> @@ -13,7 +13,7 @@
> #include <linux/namei.h>
> #include "internal.h"
> 
> -static const struct constant_table bool_names[] = {
> +const struct constant_table bool_names[] = {
> { "0", false },
> { "1", true },
> { "false", false },
> @@ -22,6 +22,7 @@ static const struct constant_table bool_names[] = {
> { "yes", true },
> { },
> };
> +EXPORT_SYMBOL(bool_names);
> 
> static const struct constant_table *
> __lookup_constant(const struct constant_table *tbl, const char *name)
> -- 
> 2.47.0
> 


Reply via email to