Re: [PATCH 06/44 take 2] [UBI] startup code

Rusty Russell
2007-02-25T22:08:48Z

On Sun, 2007-02-25 at 05:58 +0000, Christoph Hellwig wrote:
> On Tue, Feb 20, 2007 at 03:00:56PM +0200, Artem Bityutskiy wrote:
> > > > +module_param_call(mtd, ubi_mtd_param_parse, NULL, NULL, 000);
> > > > +MODULE_PARM_DESC(mtd, "MTD devices to attach. Parameter format: "
> > > > + "mtd=<name|num>[,<vid_hdr_offs>,<data_offs>]. "
> > > > + "Multiple \"mtd\" parameters may be specified.\n"
> > > > + "MTD devices may be specified by their number or name. "
> > > > + "Optional \"vid_hdr_offs\" and \"data_offs\" parameters "
> > > > + "specify UBI VID header position and data starting "
> > > > + "position to be used by UBI.\n"
> > > > + "Example: mtd=content,1984,2048 mtd=4 - attach MTD device"
> > > > + "with name content using VID header offset 1984 and data "
> > > > + "start 2048, and MTD device number 4 using default "
> > > > + "offsets");
> > >
> > > This is a very odd paramater interface. We really don't want drivers to use
> > > module_param_call directly. You probably want various module_param_array calls
> > > instead.
> >
> > Why not? We tried to avoid this but found out that this is the most
> > decent interface. Specific advises are welcome.
>
> because this type of compount interface is really painful for the user.
> the module.param=foo syntax makes sure paramaters can be used without
> endless documentation for each and every single of them, and makes
> sure module writers don't introduce bugs in their own parser reimplementations.
>
> Rusty, was it intentional that drivers can use __module_param_call?
> Do you think the ubi use here is okay?

The reason drivers can use __module_param_call is that they can
implement their own "types" for module parameters, which will end up
requiring this.

Using it directly is only really for backwards compatibility (which is
important!), but for new parameters, this multi-part self-parsing is
nasty. Standard (but admittedly suboptimal) way to do this is having
three parameters module_param_array(name, ...),
module_param_array(header_offset, ...),
module_param_array(data_start, ...).

Hope that helps,
Rusty.