2011/10/13 Ian Campbell <ian.campbell@xxxxxxxxxx>:
> # HG changeset patch
> # User Ian Campbell <ian.campbell@xxxxxxxxxx>
> # Date 1318499565 -3600
> # Node ID 95b2f3977d439bba3a01db4a4403a4307f238377
> # Parent  f60954a04df9acbddf68af4f2d46c3910f3b0afc
> libxl: merge libxl__device_del into libxl__device_remove
>
> Note that the "wait" parameter added to libxl_device_remove is different to 
> the
> wait paramter previously used by similar functions. In the past not-wait meant
> forced whereas now in means wait for a graceful shutdown, as opposed to 
> setting
> off a graceful shutdown but not waiting.
>
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
>
> diff -r f60954a04df9 -r 95b2f3977d43 tools/libxl/libxl.c
> --- a/tools/libxl/libxl.c       Thu Oct 13 10:52:45 2011 +0100
> +++ b/tools/libxl/libxl.c       Thu Oct 13 10:52:45 2011 +0100
> @@ -1075,7 +1075,7 @@ int libxl_device_disk_del(libxl_ctx *ctx
>     device.devid            = devid;
>     device.kind             = LIBXL__DEVICE_KIND_VBD;
>     if (wait)
> -        rc = libxl__device_del(&gc, &device);
> +        rc = libxl__device_remove(&gc, &device, wait);
>     else
>         rc = libxl__device_destroy(&gc, &device);
>  out_free:
> @@ -1290,7 +1290,7 @@ int libxl_device_nic_del(libxl_ctx *ctx,
>     device.kind             = LIBXL__DEVICE_KIND_VIF;
>
>     if (wait)
> -        rc = libxl__device_del(&gc, &device);
> +        rc = libxl__device_remove(&gc, &device, wait);
>     else
>         rc = libxl__device_destroy(&gc, &device);
>
> diff -r f60954a04df9 -r 95b2f3977d43 tools/libxl/libxl_device.c
> --- a/tools/libxl/libxl_device.c        Thu Oct 13 10:52:45 2011 +0100
> +++ b/tools/libxl/libxl_device.c        Thu Oct 13 10:52:45 2011 +0100
> @@ -367,57 +367,6 @@ int libxl__device_disk_dev_number(const
>     return -1;
>  }
>
> -int libxl__device_remove(libxl__gc *gc, libxl__device *dev)
> -{
> -    libxl_ctx *ctx = libxl__gc_owner(gc);
> -    xs_transaction_t t;
> -    char *be_path = libxl__device_backend_path(gc, dev);
> -    char *state_path = libxl__sprintf(gc, "%s/state", be_path);
> -    char *state = libxl__xs_read(gc, XBT_NULL, state_path);
> -    int rc = 0;
> -
> -    if (!state)
> -        goto out;
> -    if (atoi(state) != 4) {
> -        libxl__device_destroy_tapdisk(gc, be_path);
> -        xs_rm(ctx->xsh, XBT_NULL, be_path);
> -        goto out;
> -    }
> -
> -retry_transaction:
> -    t = xs_transaction_start(ctx->xsh);
> -    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", 
> strlen("0"));
> -    xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
> -    if (!xs_transaction_end(ctx->xsh, t, 0)) {
> -        if (errno == EAGAIN)
> -            goto retry_transaction;
> -        else {
> -            rc = -1;
> -            goto out;
> -        }
> -    }
> -
> -    xs_watch(ctx->xsh, state_path, be_path);
> -    libxl__device_destroy_tapdisk(gc, be_path);
> -    rc = 1;
> -out:
> -    return rc;
> -}
> -
> -int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
> -{
> -    libxl_ctx *ctx = libxl__gc_owner(gc);
> -    char *be_path = libxl__device_backend_path(gc, dev);
> -    char *fe_path = libxl__device_frontend_path(gc, dev);
> -
> -    xs_rm(ctx->xsh, XBT_NULL, be_path);
> -    xs_rm(ctx->xsh, XBT_NULL, fe_path);
> -
> -    libxl__device_destroy_tapdisk(gc, be_path);
> -
> -    return 0;
> -}
> -
>  static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
>  {
>     libxl_ctx *ctx = libxl__gc_owner(gc);
> @@ -446,6 +395,67 @@ static int wait_for_dev_destroy(libxl__g
>     return rc;
>  }
>
> +/* Returns 0 on success, ERROR_* on fail */
> +int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int wait)
> +{
> +    libxl_ctx *ctx = libxl__gc_owner(gc);
> +    xs_transaction_t t;
> +    char *be_path = libxl__device_backend_path(gc, dev);
> +    char *state_path = libxl__sprintf(gc, "%s/state", be_path);
> +    char *state = libxl__xs_read(gc, XBT_NULL, state_path);
> +    int rc = 0;
> +
> +    if (!state)
> +        goto out;
> +    if (atoi(state) != 4) {
> +        libxl__device_destroy_tapdisk(gc, be_path);
> +        xs_rm(ctx->xsh, XBT_NULL, be_path);
I think here we should return something different than 0 (possibly 1?)
so the number of watches (n_watches) is not increased.
> +        goto out;
> +    }
> +
> +retry_transaction:
> +    t = xs_transaction_start(ctx->xsh);
> +    xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", 
> strlen("0"));
> +    xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
> +    if (!xs_transaction_end(ctx->xsh, t, 0)) {
> +        if (errno == EAGAIN)
> +            goto retry_transaction;
> +        else {
> +            rc = ERROR_FAIL;
> +            goto out;
> +        }
> +    }
> +
> +    xs_watch(ctx->xsh, state_path, be_path);
> +    libxl__device_destroy_tapdisk(gc, be_path);
> +
> +    if (wait) {
> +        struct timeval tv;
> +        tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
> +        tv.tv_usec = 0;
> +        (void)wait_for_dev_destroy(gc, &tv);
> +        xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
Here we should check if the device is removed correctly or not, so
that the number of watches is not increased:
if(wait_for_dev_destroy(gc, &tv) != 0) /* device destroyed */
    rc = 1;
> +    }
> +
> +    rc = 0;
This should also be removed, since rc is initialized to 0 already.
> +out:
> +    return rc;
> +}
> +
> +int libxl__device_destroy(libxl__gc *gc, libxl__device *dev)
> +{
> +    libxl_ctx *ctx = libxl__gc_owner(gc);
> +    char *be_path = libxl__device_backend_path(gc, dev);
> +    char *fe_path = libxl__device_frontend_path(gc, dev);
> +
> +    xs_rm(ctx->xsh, XBT_NULL, be_path);
> +    xs_rm(ctx->xsh, XBT_NULL, fe_path);
> +
> +    libxl__device_destroy_tapdisk(gc, be_path);
> +
> +    return 0;
> +}
> +
>  int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force)
>  {
>     libxl_ctx *ctx = libxl__gc_owner(gc);
> @@ -485,7 +495,7 @@ int libxl__devices_destroy(libxl__gc *gc
>                 if (force) {
>                     libxl__device_destroy(gc, &dev);
>                 } else {
> -                    if (libxl__device_remove(gc, &dev) > 0)
> +                    if (libxl__device_remove(gc, &dev, 0) == 0)
>                         n_watches++;
>                 }
>             }
> @@ -504,7 +514,7 @@ int libxl__devices_destroy(libxl__gc *gc
>         if (force) {
>             libxl__device_destroy(gc, &dev);
>         } else {
> -            if (libxl__device_remove(gc, &dev) > 0)
> +            if (libxl__device_remove(gc, &dev, 0) == 0)
>                 n_watches++;
>         }
>     }
> @@ -530,29 +540,6 @@ out:
>     return 0;
>  }
>
> -int libxl__device_del(libxl__gc *gc, libxl__device *dev)
> -{
> -    libxl_ctx *ctx = libxl__gc_owner(gc);
> -    struct timeval tv;
> -    int rc;
> -
> -    rc = libxl__device_remove(gc, dev);
> -    if (rc == -1) {
> -        rc = ERROR_FAIL;
> -        goto out;
> -    }
> -
> -    tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
> -    tv.tv_usec = 0;
> -    (void)wait_for_dev_destroy(gc, &tv);
> -
> -    xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(gc, dev));
> -    rc = 0;
> -
> -out:
> -    return rc;
> -}
> -
>  int libxl__wait_for_device_model(libxl__gc *gc,
>                                  uint32_t domid, char *state,
>                                  libxl__spawn_starting *spawning,
> diff -r f60954a04df9 -r 95b2f3977d43 tools/libxl/libxl_internal.h
> --- a/tools/libxl/libxl_internal.h      Thu Oct 13 10:52:45 2011 +0100
> +++ b/tools/libxl/libxl_internal.h      Thu Oct 13 10:52:45 2011 +0100
> @@ -242,8 +242,7 @@ _hidden char *libxl__device_backend_path
>  _hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device 
> *device);
>  _hidden int libxl__parse_backend_path(libxl__gc *gc, const char *path,
>                                       libxl__device *dev);
> -_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev);
> -_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev);
> +_hidden int libxl__device_remove(libxl__gc *gc, libxl__device *dev, int 
> wait);
>  _hidden int libxl__device_destroy(libxl__gc *gc, libxl__device *dev);
>  _hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
>  _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char 
> *state);
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
 |