[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH RFC 5/5] libxl/FreeBSD: add support for disk hotplug scripts



On Fri, 2015-05-22 at 11:18 +0200, Roger Pau Monne wrote:
> Allow FreeBSD to execute hotplug scripts when attaching disk devices.
> 
> Signed-off-by: Roger Pau Monnà <roger.pau@xxxxxxxxxx>

This looks rather similar to the code for Linux, is there any chance
they could be combined into one or more common hotplugger running
things?

> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
> Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
>  tools/libxl/libxl_freebsd.c | 114 
> ++++++++++++++++++++++++++++++++------------
>  1 file changed, 83 insertions(+), 31 deletions(-)
> 
> diff --git a/tools/libxl/libxl_freebsd.c b/tools/libxl/libxl_freebsd.c
> index 47c3391..5ff3388 100644
> --- a/tools/libxl/libxl_freebsd.c
> +++ b/tools/libxl/libxl_freebsd.c
> @@ -59,14 +59,36 @@ static int libxl__hotplug_env_nic(libxl__gc *gc, 
> libxl__device *dev, char ***env
>      return 0;
>  }
>  
> -static int libxl__hotplug_nic(libxl__gc *gc, libxl__device *dev, char 
> ***args,
> -                              libxl__device_action action)
> +static int libxl__hotplug_nic(libxl__gc *gc, libxl__device *dev,
> +                              char ***args, char ***env,
> +                              libxl__device_action action,
> +                              int num_exec)
>  {
> +    libxl_nic_type nictype;
>      char *be_path = libxl__device_backend_path(gc, dev);
>      char *script;
> -    int nr = 0, rc = 0, arraysize = 4;
> +    int nr = 0, rc;
>  
> -    assert(dev->backend_kind == LIBXL__DEVICE_KIND_VIF);
> +    rc = libxl__nic_type(gc, dev, &nictype);
> +    if (rc) {
> +        LOG(ERROR, "error when fetching nic type");
> +        rc = ERROR_FAIL;
> +        goto out;
> +    }
> +
> +    /*
> +     * For PV domains only one pass is needed (because there's no emulated
> +     * interface). For HVM domains two passes are needed in order to add
> +     * both the PV and the tap interfaces to the bridge.
> +     */
> +    if (nictype == LIBXL_NIC_TYPE_VIF && num_exec != 0) {
> +        rc = 0;
> +        goto out;
> +    }
> +
> +    rc = libxl__hotplug_env_nic(gc, dev, env, num_exec);
> +    if (rc)
> +        goto out;
>  
>      script = libxl__xs_read(gc, XBT_NULL,
>                              GCSPRINTF("%s/%s", be_path, "script"));
> @@ -76,53 +98,83 @@ static int libxl__hotplug_nic(libxl__gc *gc, 
> libxl__device *dev, char ***args,
>          goto out;
>      }
>  
> +    const int arraysize = 4;
>      GCNEW_ARRAY(*args, arraysize);
>      (*args)[nr++] = script;
>      (*args)[nr++] = be_path;
> -    (*args)[nr++] = GCSPRINTF("%s", action == LIBXL__DEVICE_ACTION_ADD ?
> -                                    "add" : "remove");
> +    (*args)[nr++] = (char *) libxl__device_action_to_string(action);
>      (*args)[nr++] = NULL;
>      assert(nr == arraysize);
>  
> +    rc = 1;
> +
>  out:
>      return rc;
>  }
>  
> +static int libxl__hotplug_disk(libxl__gc *gc, libxl__device *dev,
> +                               char ***args, char ***env,
> +                               libxl__device_action action)
> +{
> +    char *be_path = libxl__device_backend_path(gc, dev);
> +    char *script;
> +    int nr = 0, rc;
> +
> +    script = libxl__xs_read(gc, XBT_NULL,
> +                            GCSPRINTF("%s/%s", be_path, "script"));
> +    if (!script) {
> +        LOGEV(ERROR, errno, "unable to read script from %s", be_path);
> +        rc = ERROR_FAIL;
> +        goto error;
> +    }
> +
> +    const int arraysize = 4;
> +    GCNEW_ARRAY(*args, arraysize);
> +    (*args)[nr++] = script;
> +    (*args)[nr++] = be_path;
> +    (*args)[nr++] = (char *) libxl__device_action_to_string(action);
> +    (*args)[nr++] = NULL;
> +    assert(nr == arraysize);
> +
> +    rc = 1;
> +
> +error:
> +    return rc;
> +}
> +
>  int libxl__get_hotplug_script_info(libxl__gc *gc, libxl__device *dev,
>                                     char ***args, char ***env,
>                                     libxl__device_action action,
>                                     int num_exec)
>  {
> -    libxl_nic_type nictype;
>      int rc;
>  
> -    if (dev->backend_kind != LIBXL__DEVICE_KIND_VIF || num_exec == 2)
> -        return 0;
> -
> -    rc = libxl__nic_type(gc, dev, &nictype);
> -    if (rc) {
> -        LOG(ERROR, "error when fetching nic type");
> -        rc = ERROR_FAIL;
> -        goto out;
> -    }
> -
> -    /*
> -     * For PV domains only one pass is needed (because there's no emulated
> -     * interface). For HVM domains two passes are needed in order to add
> -     * both the PV and the tap interfaces to the bridge.
> -     */
> -    if (nictype == LIBXL_NIC_TYPE_VIF && num_exec != 0) {
> +    switch (dev->backend_kind) {
> +    case LIBXL__DEVICE_KIND_VBD:
> +        if (num_exec != 0) {
> +            rc = 0;
> +            goto out;
> +        }
> +        rc = libxl__hotplug_disk(gc, dev, args, env, action);
> +        break;
> +    case LIBXL__DEVICE_KIND_VIF:
> +        /*
> +         * If domain has a stubdom we don't have to execute hotplug scripts
> +         * for emulated interfaces
> +         */
> +        if ((num_exec > 1) ||
> +            (libxl_get_stubdom_id(CTX, dev->domid) && num_exec)) {
> +            rc = 0;
> +            goto out;
> +        }
> +        rc = libxl__hotplug_nic(gc, dev, args, env, action, num_exec);
> +        break;
> +    default:
> +        /* No need to execute any hotplug scripts */
>          rc = 0;
> -        goto out;
> +        break;
>      }
>  
> -    rc = libxl__hotplug_env_nic(gc, dev, env, num_exec);
> -    if (rc)
> -        goto out;
> -
> -    rc = libxl__hotplug_nic(gc, dev, args, action);
> -    if (!rc) rc = 1;
> -
>  out:
>      return rc;
>  }



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.