[libvirt] [PATCH] phyp: don't steal storage management from other drivers

Matthias Bolte matthias.bolte at googlemail.com
Mon Jun 28 18:06:36 UTC 2010


2010/6/28 Eric Blake <eblake at redhat.com>:
> Fix regression introduced in commit a4a287242 - basically, the
> phyp storage driver should only accept the same URIs that the
> main phyp driver is willing to accept.  Blindly accepting all
> URIs meant that the phyp storage driver was being consulted for
> 'virsh -c qemu:///session pool-list --all', rather than the
> qemu storage driver, then since the URI was not for phyp, attempts
> to then use the phyp driver crahsed because it was not initialized.
>
> * src/phyp/phyp_driver.c (phypStorageOpen): Copy phypOpen on which
> connections we are willing to accept.
> ---
>
>> > Looks like the phyp storage driver is being used instead of the libvirtd
>> > storage driver (and then segfaulting). Looked briefly for a fix, but it
>> > wasn't obvious to me.
>> The phypStorageOpen() method is totally bogus. It is ignoring the conn
>> object and accepting all connections.
>
> Sorry for not realizing that during my review; this is my first
> time dealing with a storage driver patch.
>
>> It must only return VIR_DRV_OPEN_SUCCESS if  conn->driver->name == VIR_DRV_PHYP
>
> Agreed.  I think this patch does the right thing.
>

The intention is correct, but the implementation is not. Why do you
duplicate the whole phypOpen code in phypStorageOpen?
Besides of being unnecessary this also overwrites the already
initialized private driver data of the virConnectPtr.

Something like I did for the ESX storage driver (and Daniel suggested)
should be sufficient here too.

static virDrvOpenStatus
phypStorageOpen(virConnectPtr conn,
               virConnectAuthPtr auth ATTRIBUTE_UNUSED,
               int flags)
{
    virCheckFlags(0, VIR_DRV_OPEN_ERROR);

    if (STRNEQ(conn->driver->name, "PHYP")) {
        return VIR_DRV_OPEN_DECLINED;
    }

    return VIR_DRV_OPEN_SUCCESS;
}

Probably comparing the conn->driver->no would be even better.

static virDrvOpenStatus
phypStorageOpen(virConnectPtr conn,
               virConnectAuthPtr auth ATTRIBUTE_UNUSED,
               int flags)
{
    virCheckFlags(0, VIR_DRV_OPEN_ERROR);

    if (conn->driver->no != VIR_DRV_PHYP) {
        return VIR_DRV_OPEN_DECLINED;
    }

    return VIR_DRV_OPEN_SUCCESS;
}

When libvirt tries to open the secondary drivers (like a storage
driver) we already have a main hypervisor driver successfully opened.
so we don't need to check the URI again. We just need to make sure
that the PHYP storage driver only accepts an open call iff the open
main driver is the PHYP driver.

Matthias




More information about the libvir-list mailing list