[libvirt] [PATCH 07/14] Implement dispatch functions for lock protocol in virtlockd

Daniel P. Berrange berrange at redhat.com
Thu Dec 13 12:39:20 UTC 2012


On Wed, Dec 12, 2012 at 07:14:15PM +0100, Michal Privoznik wrote:
> On 11.12.2012 21:41, Daniel P. Berrange wrote:
> > +
> > +static int
> > +virLockSpaceProtocolDispatchAcquireResource(virNetServerPtr server ATTRIBUTE_UNUSED,
> > +                                            virNetServerClientPtr client,
> > +                                            virNetMessagePtr msg ATTRIBUTE_UNUSED,
> > +                                            virNetMessageErrorPtr rerr,
> > +                                            virLockSpaceProtocolAcquireResourceArgs *args)
> > +{
> > +    int rv = -1;
> > +    unsigned int flags = args->flags;
> > +    virLockDaemonClientPtr priv =
> > +        virNetServerClientGetPrivateData(client);
> > +    virLockSpacePtr lockspace;
> > +    unsigned int newFlags;
> > +
> > +    virMutexLock(&priv->lock);
> > +
> > +    virCheckFlagsGoto(VIR_LOCK_SPACE_ACQUIRE_SHARED |
> > +                      VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE, cleanup);
> 
> se here you are effectively checking 'flags' to
> VIR_LOCK_SPACE_ACQUIRE_SHARED and VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE ...

Yep, obviously the current code is wrong. I'll fix.

> 
> > +
> > +    if (priv->restricted) {
> > +        virReportError(VIR_ERR_OPERATION_DENIED, "%s",
> > +                       _("lock manager connection has been restricted"));
> > +        goto cleanup;
> > +    }
> > +
> > +    if (!priv->ownerPid) {
> > +        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> > +                       _("lock owner details have not been registered"));
> > +        goto cleanup;
> > +    }
> > +
> > +    if (!(lockspace = virLockDaemonFindLockSpace(lockDaemon, args->path))) {
> > +        virReportError(VIR_ERR_INTERNAL_ERROR,
> > +                       _("Lockspace for path %s does not exist"),
> > +                       args->path);
> > +        goto cleanup;
> > +    }
> > +
> > +    newFlags = 0;
> > +    if (flags & VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED)
> > +        newFlags |= VIR_LOCK_SPACE_ACQUIRE_SHARED;
> > +    if (flags & VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE)
> > +        newFlags |= VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE;
> 
> while here you test them to a different set of flags. I understand you
> want to do translation from protocol representation of flags to API one
> since they may (but shouldn't) diverge. You need to update the
> virCheckFlagsGoto() then.
> 
> > +
> > +    if (virLockSpaceAcquireResource(lockspace,
> > +                                    args->name,
> > +                                    priv->ownerPid,
> > +                                    newFlags) < 0) {
> > +        VIR_ERROR("FAILED");
> > +        goto cleanup;
> > +    }
> > +
> > +        VIR_ERROR("OK");
> 
> indentation

Those two VIR_ERROR lines will just be killed - they were random debug.

Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list