> Date: Sat, 23 May 2020 11:35:46 +0200
> From: Klemens Nanni <[email protected]>
>
> On Mon, Jan 13, 2020 at 12:59:23PM +0100, Klemens Nanni wrote:
> > On Sun, Jan 05, 2020 at 07:09:46PM +0100, Klemens Nanni wrote:
> > > Domains get to define their cores and memory only once unlike the other
> > > parameters of which it makes sense to have more than one.
> > >
> > > $ cat dup.conf
> > > domain primary {
> > > vcpu 2
> > > vcpu 2
> > > }
> > > $ ldomctl init-system -n dup.conf ; echo $?
> > > 0
> > > $ ./obj/ldomctl init-system -n dup.conf
> > > dup.conf:3 duplicate vcpu option
> > >
> > > OK?
> > Now that checks for mandatory options are in, this somewhat completes
> > it at the other end.
> >
> > Here's the same diff with an additional check for duplicate iodevices,
> > only that those must be globally unique (just like domain names).
> >
> > OK?
> This still is still in my tree.
>
> It properly detects duplicate vcpu and memory lines for all domains
> including the primary one; duplicate iodevice lines are only detected
> for guest domains; preventing iodevice, vnet and vdisk lines in the
> primary domain is stuff for a separate diff.
>
> Feedback? OK?
Looks reasonable. I'd change the message for iodevice though to "iodevice %s
already assigned".
ok with that fix.
> Index: parse.y
> ===================================================================
> RCS file: /cvs/src/usr.sbin/ldomctl/parse.y,v
> retrieving revision 1.18
> diff -u -p -r1.18 parse.y
> --- parse.y 21 Feb 2020 19:39:28 -0000 1.18
> +++ parse.y 23 May 2020 09:23:58 -0000
> @@ -166,10 +166,18 @@ domainoptsl : domainopts nl
> ;
>
> domainopts : VCPU vcpu {
> + if (domain->vcpu) {
> + yyerror("duplicate vcpu option");
> + YYERROR;
> + }
> domain->vcpu = $2.count;
> domain->vcpu_stride = $2.stride;
> }
> | MEMORY memory {
> + if (domain->memory) {
> + yyerror("duplicate memory option");
> + YYERROR;
> + }
> domain->memory = $2;
> }
> | VDISK STRING vdisk_opts {
> @@ -192,10 +200,19 @@ domainopts : VCPU vcpu {
> SIMPLEQ_INSERT_TAIL(&domain->var_list, var, entry);
> }
> | IODEVICE STRING {
> - struct iodev *iodev = xmalloc(sizeof(struct iodev));
> + struct domain *odomain;
> + struct iodev *iodev;
> + SIMPLEQ_FOREACH(odomain, &conf->domain_list, entry)
> + SIMPLEQ_FOREACH(iodev, &odomain->iodev_list,
> entry)
> + if (strcmp(iodev->path, $2) == 0) {
> + yyerror("iodevice assigned"
> + " twice: %s", $2);
> + YYERROR;
> + }
> + iodev = xmalloc(sizeof(struct iodev));
> iodev->path = $2;
> SIMPLEQ_INSERT_TAIL(&domain->iodev_list, iodev, entry);
> - }
> + }
> ;
>
> vdisk_opts : { vdisk_opts_default(); }
>
>