[libvirt] [PATCH 04/15] Introduce a virLXCControllerPtr object to hold LXC controller state

Jiri Denemark jdenemar at redhat.com
Wed Jul 4 10:20:44 UTC 2012


On Tue, Jul 03, 2012 at 16:58:43 +0100, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
> 
> The LXC controller code is having to pass around an ever increasing
> number of parameters between methods. To make the code more managable
> introduce a virLXCControllerPtr to hold all this state, starting with
> the container name and virDomainDefPtr object
> 
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
>  src/lxc/lxc_controller.c |  133 +++++++++++++++++++++++++++++++---------------
>  1 file changed, 91 insertions(+), 42 deletions(-)
> 
> diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
> index b0e9f46..7447f6c 100644
> --- a/src/lxc/lxc_controller.c
> +++ b/src/lxc/lxc_controller.c
> @@ -80,6 +80,64 @@ struct cgroup_device_policy {
>  };
>  
>  
> +typedef struct _virLXCController virLXCController;
> +typedef virLXCController *virLXCControllerPtr;
> +struct _virLXCController {
> +    char *name;
> +    virDomainDefPtr def;
> +};
> +
> +static void virLXCControllerFree(virLXCControllerPtr ctrl);
> +
> +static virLXCControllerPtr virLXCControllerNew(const char *name)
> +{
> +    virLXCControllerPtr ctrl = NULL;
> +    virCapsPtr caps = NULL;
> +    char *configFile = NULL;
> +
> +    if (VIR_ALLOC(ctrl) < 0)
> +        goto no_memory;
> +
> +    if (!(ctrl->name = strdup(name)))
> +        goto no_memory;
> +
> +    if ((caps = lxcCapsInit(NULL)) == NULL)
> +        goto cleanup;
> +
> +    if ((configFile = virDomainConfigFile(LXC_STATE_DIR,
> +                                          ctrl->name)) == NULL)
> +        goto cleanup;
> +
> +    if ((ctrl->def = virDomainDefParseFile(caps,
> +                                           configFile,
> +                                           1 << VIR_DOMAIN_VIRT_LXC,
> +                                           0)) == NULL)
> +        goto cleanup;

I think all three "goto cleanup"s should rather be goto error...

> +
> +cleanup:
> +    VIR_FREE(configFile);
> +    virCapabilitiesFree(caps);
> +    return ctrl;
> +
> +no_memory:
> +    virReportOOMError();
> +//error:

and this label should not be commented out.

> +    virLXCControllerFree(ctrl);
> +    ctrl = NULL;
> +    goto cleanup;
> +}
> +
> +static void virLXCControllerFree(virLXCControllerPtr ctrl)
> +{
> +    if (!ctrl)
> +        return;
> +
> +    virDomainDefFree(ctrl->def);
> +    VIR_FREE(ctrl->name);
> +
> +    VIR_FREE(ctrl);
> +}
> +
>  static int lxcGetLoopFD(char **dev_name)
>  {
>      int fd = -1;
> @@ -625,12 +683,12 @@ cleanup:
>      return rc;
>  }
>  
> -static char*lxcMonitorPath(virDomainDefPtr def)
> +static char*lxcMonitorPath(virLXCControllerPtr ctrl)
>  {
>      char *sockpath;
>  
>      if (virAsprintf(&sockpath, "%s/%s.sock",
> -                    LXC_STATE_DIR, def->name) < 0)
> +                    LXC_STATE_DIR, ctrl->def->name) < 0)
>          virReportOOMError();
>      return sockpath;
>  }
> @@ -1362,15 +1420,15 @@ cleanup:
>  }
>  
>  static int
> -lxcControllerRun(virDomainDefPtr def,
> -                 virSecurityManagerPtr securityDriver,
> -                 unsigned int nveths,
> -                 char **veths,
> -                 int monitor,
> -                 int client,
> -                 int *ttyFDs,
> -                 size_t nttyFDs,
> -                 int handshakefd)
> +virLXCControllerRun(virLXCControllerPtr ctrl,
> +                    virSecurityManagerPtr securityDriver,
> +                    unsigned int nveths,
> +                    char **veths,
> +                    int monitor,
> +                    int client,
> +                    int *ttyFDs,
> +                    size_t nttyFDs,
> +                    int handshakefd)
>  {
>      int rc = -1;
>      int control[2] = { -1, -1};
> @@ -1407,12 +1465,12 @@ lxcControllerRun(virDomainDefPtr def,
>          goto cleanup;
>      }
>  
> -    if (lxcSetupLoopDevices(def, &nloopDevs, &loopDevs) < 0)
> +    if (lxcSetupLoopDevices(ctrl->def, &nloopDevs, &loopDevs) < 0)
>          goto cleanup;
>  
> -    root = virDomainGetRootFilesystem(def);
> +    root = virDomainGetRootFilesystem(ctrl->def);
>  
> -    if (lxcSetContainerResources(def) < 0)
> +    if (lxcSetContainerResources(ctrl->def) < 0)
>          goto cleanup;
>  
>      /*
> @@ -1436,7 +1494,7 @@ lxcControllerRun(virDomainDefPtr def,
>       * marked as shared
>       */
>      if (root) {
> -        mount_options = virSecurityManagerGetMountOptions(securityDriver, def);
> +        mount_options = virSecurityManagerGetMountOptions(securityDriver, ctrl->def);
>          char *opts;
>          VIR_DEBUG("Setting up private /dev/pts");
>  
> @@ -1525,10 +1583,10 @@ lxcControllerRun(virDomainDefPtr def,
>          }
>      }
>  
> -    if (lxcSetPersonality(def) < 0)
> +    if (lxcSetPersonality(ctrl->def) < 0)
>          goto cleanup;
>  
> -    if ((container = lxcContainerStart(def,
> +    if ((container = lxcContainerStart(ctrl->def,
>                                         securityDriver,
>                                         nveths,
>                                         veths,
> @@ -1618,6 +1676,8 @@ cleanup:
>  }
>  
>  
> +
> +

Looks like a bogus addition of two more empty lines.

>  int main(int argc, char *argv[])
>  {
>      pid_t pid;
> @@ -1629,9 +1689,6 @@ int main(int argc, char *argv[])
>      int monitor = -1;
>      int handshakefd = -1;
>      int bg = 0;
> -    virCapsPtr caps = NULL;
> -    virDomainDefPtr def = NULL;
> -    char *configFile = NULL;
>      char *sockpath = NULL;
>      const struct option options[] = {
>          { "background", 0, NULL, 'b' },
> @@ -1646,6 +1703,7 @@ int main(int argc, char *argv[])
>      int *ttyFDs = NULL;
>      size_t nttyFDs = 0;
>      virSecurityManagerPtr securityDriver = NULL;
> +    virLXCControllerPtr ctrl = NULL;
>  
>      if (setlocale(LC_ALL, "") == NULL ||
>          bindtextdomain(PACKAGE, LOCALEDIR) == NULL ||
> @@ -1766,31 +1824,22 @@ int main(int argc, char *argv[])
>  
>      virEventRegisterDefaultImpl();
>  
> -    if ((caps = lxcCapsInit(NULL)) == NULL)
> -        goto cleanup;
> -
> -    if ((configFile = virDomainConfigFile(LXC_STATE_DIR,
> -                                          name)) == NULL)
> -        goto cleanup;
> -
> -    if ((def = virDomainDefParseFile(caps, configFile,
> -                                     1 << VIR_DOMAIN_VIRT_LXC,
> -                                     0)) == NULL)
> +    if (!(ctrl = virLXCControllerNew(name)))
>          goto cleanup;

Oh I see, the wrong labels were caused by cut&pasting the code from here.

>  
>      VIR_DEBUG("Security model %s type %s label %s imagelabel %s",
> -              NULLSTR(def->seclabel.model),
> -              virDomainSeclabelTypeToString(def->seclabel.type),
> -              NULLSTR(def->seclabel.label),
> -              NULLSTR(def->seclabel.imagelabel));
> +              NULLSTR(ctrl->def->seclabel.model),
> +              virDomainSeclabelTypeToString(ctrl->def->seclabel.type),
> +              NULLSTR(ctrl->def->seclabel.label),
> +              NULLSTR(ctrl->def->seclabel.imagelabel));
>  
> -    if (def->nnets != nveths) {
> +    if (ctrl->def->nnets != nveths) {
>          fprintf(stderr, "%s: expecting %d veths, but got %d\n",
> -                argv[0], def->nnets, nveths);
> +                argv[0], ctrl->def->nnets, nveths);
>          goto cleanup;
>      }
>  
> -    if ((sockpath = lxcMonitorPath(def)) == NULL)
> +    if ((sockpath = lxcMonitorPath(ctrl)) == NULL)
>          goto cleanup;
>  
>      if ((monitor = lxcMonitorServer(sockpath)) < 0)
> @@ -1835,17 +1884,17 @@ int main(int argc, char *argv[])
>          goto cleanup;
>      }
>  
> -    rc = lxcControllerRun(def, securityDriver,
> -                          nveths, veths, monitor, client,
> -                          ttyFDs, nttyFDs, handshakefd);
> +    rc = virLXCControllerRun(ctrl, securityDriver,
> +                             nveths, veths, monitor, client,
> +                             ttyFDs, nttyFDs, handshakefd);
>  
>  cleanup:
> -    if (def)
> -        virPidFileDelete(LXC_STATE_DIR, def->name);
> +    virPidFileDelete(LXC_STATE_DIR, name);
>      lxcControllerCleanupInterfaces(nveths, veths);
>      if (sockpath)
>          unlink(sockpath);
>      VIR_FREE(sockpath);
> +    virLXCControllerFree(ctrl);
>  
>      return rc ? EXIT_FAILURE : EXIT_SUCCESS;
>  }

ACK with the labels fixed.

Jirka




More information about the libvir-list mailing list