|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 6/7] xl/libxl: implement QDISK libxl_device_disk_local_attach
Stefano Stabellini writes ("Re: [Xen-devel] [PATCH v3 6/7] xl/libxl: implement
QDISK libxl_device_disk_local_attach"):
> On Tue, 17 Apr 2012, Ian Jackson wrote:
> > Stefano Stabellini writes ("[Xen-devel] [PATCH v3 6/7] xl/libxl: implement
> > QDISK libxl_device_disk_local_attach"):
> > ...
> > > + t = xs_transaction_start(ctx->xsh);
> >
> > This transaction should be in the local variables block for the whole
> > function, and initialised to 0.
>
> I don't think I understand what you mean.
> Do you mean moving xs_transaction_start outside the switch?
> If so, why? It doesn't affect many of the other cases.
No, I mean that the variable should be defined at the top of the
function and initialised to 0.
In general, any resource allocated in a function other than from the
gc should be held in a variable set and used like "resource" in this
example:
int libxl__do_something_requiring_xmumble_resource(libxl__gc *gc, flibble)
{
foo *resource = 0;
int rc;
blah blah blah;
resource = xmumble_acquire_resource(wibble wombat);
if (!resource) { rc = ERROR_FAIL; goto out; }
blah blah blah;
rc = 0;
out:
xmumble_free_resource(resource);
return rc;
}
> > > + if (tmpdisk->vdev == NULL) {
> > > + LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
> > > + "libxl__alloc_vdev failed\n");
> > > + xs_transaction_end(ctx->xsh, t, 1);
> >
> > And then all these xs_transaction_end calls turn into one call in the
> > exit path.
>
> So maybe you do mean moving the transaction outside the switch.
> In that case I disagree: the transaction is only useful in a very
> limited set of cases (just one at the moment), while most of the others
> don't need it.
No, I mean only the calls which abort the transaction should be in the
"goto out" section.
So:
int libxl__do_something_requiring_xmumble_resource(libxl__gc *gc, flibble)
{
xs_transaction_t our_trans;
int rc;
blah blah blah;
for (;;) {
our_trans = xs_transaction_start(...);
if (!our_trans) { rc = ERROR_FAIL; goto out; }
blah blah blah;
r = xs_transaction_end(CTX->xsh, our_trans, 0);
our_trans = 0; /* it's ended either way */
if (r shows it was successful) break;
if (r not as expected) { rc = ERROR_FAIL; goto out; }
}
blah blah blah;
rc = 0;
out:
if (our_trans) xs_transaction_end(CTX->xsh, our_trans, 1);
return rc;
}
The point is that the following invariant is maintained: we have a
transaction open, which needs to be ended, iff !!our_trans.
> > > - dev = tmpdisk->pdev_path;
> > > + switch (disk->backend) {
> > > + case LIBXL_DISK_BACKEND_QDISK:
> > > + if (disk->format != LIBXL_DISK_FORMAT_RAW) {
> >
> > This replicates the logic earlier, which decided whether to use a
> > qdisk. I think it would be better to remember whether we did use a
> > qdisk and detach it iff so.
>
> There are cases in which we do use qdisk but we don't have to detach.
I'm not sure I follow. This is the attachment of the VM's disk for
the benefit of the bootloader. When we are done with running the
bootloader we need to clean it up.
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |