From: Al Viro <viro@zeniv.linux.org.uk>
To: Eric Sandeen <sandeen@sandeen.net>
Cc: fsdevel <linux-fsdevel@vger.kernel.org>,
David Howells <dhowells@redhat.com>
Subject: Re: [PATCH V2] fs_parser: remove fs_parameter_description name field
Date: Wed, 18 Dec 2019 04:06:51 +0000 [thread overview]
Message-ID: <20191218040651.GH4203@ZenIV.linux.org.uk> (raw)
In-Reply-To: <c83d12e2-59a1-7f35-0544-150515db9434@sandeen.net>
On Tue, Dec 17, 2019 at 09:43:44PM -0600, Eric Sandeen wrote:
> On 12/17/19 9:36 PM, Al Viro wrote:
> > On Fri, Dec 06, 2019 at 10:31:57AM -0600, Eric Sandeen wrote:
> >> There doesn't seem to be a strong reason to have a copy of the
> >> filesystem name string in the fs_parameter_description structure;
> >> it's easy enough to get the name from the fs_type, and using it
> >> instead ensures consistency across messages (for example,
> >> vfs_parse_fs_param() already uses fc->fs_type->name for the error
> >> messages, because it doesn't have the fs_parameter_description).
> >
> > Arrgh... That used to be fine. Now we have this:
> > static int rbd_parse_param(struct fs_parameter *param,
> > struct rbd_parse_opts_ctx *pctx)
> > {
> > struct rbd_options *opt = pctx->opts;
> > struct fs_parse_result result;
> > int token, ret;
> >
> > ret = ceph_parse_param(param, pctx->copts, NULL);
> > if (ret != -ENOPARAM)
> > return ret;
> >
> > token = fs_parse(NULL, rbd_parameters, param, &result);
> > ^^^^
> >
> > Cthulhu damn it... And yes, that crap used to work.
> > Frankly, I'm tempted to allocate fs_context in there (in
> > rbd_parse_options(), or in rbd_add_parse_args()) - we've other
> > oddities due to that...
> >
> > Alternatively, we could provide __fs_parse() that
> > would take name as a separate argument and accepted NULL fc,
> > with fs_parse() being a wrapper for that.
> >
> > *grumble*
>
> FYI be careful if you do munge this in, V2 inexplicably killed the name in
> the fs_type for afs. V3 fixed that thinko or whatever it was.
I used v3, anyway... The reason I'm rather unhappy about the
entire situation is that in the end of that series I have
fs_param_is_u32() et.al. being _functions_. With switch in
fs_parse() gone.
Typical instance looks like this:
int fs_param_is_enum(struct fs_context *fc, const struct fs_parameter_spec *p,
struct fs_parameter *param, struct fs_parse_result *result)
{
const struct constant_table *c;
if (param->type != fs_value_is_string)
return fs_param_bad_value(fc, param);
c = __lookup_constant(p->data, param->string);
if (!c)
return fs_param_bad_value(fc, param);
result->uint_32 = c->value;
return 0;
}
and I would rather not breed the arguments here ;-/ I could take logging
into the fs_parse() itself (it's very similar in all current instances),
but... if we go for something like
int fs_param_is_range(struct fs_context *fc, const struct fs_parameter_spec *p,
struct fs_parameter *param, struct fs_parse_result *result)
{
const struct {u32 from, to;} *range = p->data;
if (param->type != fs_value_is_string ||
kstrtouint(param->string, 0, &result->uint_32) < 0)
return fs_param_bad_value(fc, param);
if (result->uint_32 < range->from || result->uint_32 > range->to)
return invalf(fc, "%s: Value for %s must be in [%u..%u]",
fc->fs_type->name, param->key, range->from,
range->to);
return 0;
}
which is not all that unreasonable, the requirement of handling all
warnings in fs_parse() becomes unfeasible. And the main reason for
conversion to method is the pressure to provide such custom types -
stuff like <number>{|K|M|G} for memory sizes, etc.
Shite... We can, of course, pass the name to instances, but... *ugh*
next prev parent reply other threads:[~2019-12-18 4:06 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-12-06 16:31 [PATCH V2] fs_parser: remove fs_parameter_description name field Eric Sandeen
2019-12-06 16:45 ` [PATCH V3] " Eric Sandeen
2019-12-18 3:36 ` [PATCH V2] " Al Viro
2019-12-18 3:43 ` Eric Sandeen
2019-12-18 4:06 ` Al Viro [this message]
2019-12-19 23:29 ` Al Viro
2019-12-20 18:14 ` Al Viro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191218040651.GH4203@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=dhowells@redhat.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=sandeen@sandeen.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).