From db9da75e2cee757e5c1a967f43a8a9ae739da49d Mon Sep 17 00:00:00 2001 From: Boris Ostrovsky Date: Wed, 31 May 2017 13:49:37 -0400 Subject: [PATCH] xen: Create KABI-compatible version of struct xenbus_watch Commit 5584ea250ae4 ("xen: modify xenstore watch event interface") modified definition of struct xenbus_watch, breaking UEK KABI. The patch introduces compat version of the struct, with callback_ pointing to KABI-compatible definition. Signed-off-by: Boris Ostrovsky Reviewed-by: Joao Martins --- drivers/net/xen-netback/xenbus.c | 2 ++ drivers/xen/xenbus/xenbus_client.c | 1 + drivers/xen/xenbus/xenbus_dev_frontend.c | 1 + drivers/xen/xenbus/xenbus_xs.c | 12 ++++++++++-- include/xen/xenbus.h | 13 +++++++++++++ 5 files changed, 27 insertions(+), 2 deletions(-) diff --git a/drivers/net/xen-netback/xenbus.c b/drivers/net/xen-netback/xenbus.c index 38db65553f2e..fd098d362b03 100644 --- a/drivers/net/xen-netback/xenbus.c +++ b/drivers/net/xen-netback/xenbus.c @@ -727,6 +727,7 @@ static int xen_register_credit_watch(struct xenbus_device *dev, snprintf(node, maxlen, "%s/rate", dev->nodename); vif->credit_watch.node = node; vif->credit_watch.callback = xen_net_rate_changed; + vif->credit_watch.callback_ = NULL; err = register_xenbus_watch(&vif->credit_watch); if (err) { pr_err("Failed to set watcher %s\n", vif->credit_watch.node); @@ -779,6 +780,7 @@ static int xen_register_mcast_ctrl_watch(struct xenbus_device *dev, dev->otherend); vif->mcast_ctrl_watch.node = node; vif->mcast_ctrl_watch.callback = xen_mcast_ctrl_changed; + vif->mcast_ctrl_watch.callback_ = NULL; err = register_xenbus_watch(&vif->mcast_ctrl_watch); if (err) { pr_err("Failed to set watcher %s\n", diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c index 82a8866758ee..b2ea98775364 100644 --- a/drivers/xen/xenbus/xenbus_client.c +++ b/drivers/xen/xenbus/xenbus_client.c @@ -121,6 +121,7 @@ int xenbus_watch_path(struct xenbus_device *dev, const char *path, watch->node = path; watch->callback = callback; + watch->callback_ = NULL; err = register_xenbus_watch(watch); diff --git a/drivers/xen/xenbus/xenbus_dev_frontend.c b/drivers/xen/xenbus/xenbus_dev_frontend.c index 87ac5cab7a45..59eb920203a4 100644 --- a/drivers/xen/xenbus/xenbus_dev_frontend.c +++ b/drivers/xen/xenbus/xenbus_dev_frontend.c @@ -481,6 +481,7 @@ static int xenbus_write_watch(unsigned msg_type, struct xenbus_file_priv *u) } watch->watch.callback = watch_fired; + watch->watch.callback_ = NULL; watch->dev_data = u; err = register_xenbus_watch(&watch->watch); diff --git a/drivers/xen/xenbus/xenbus_xs.c b/drivers/xen/xenbus/xenbus_xs.c index 4c33bd354adc..25112faf3d26 100644 --- a/drivers/xen/xenbus/xenbus_xs.c +++ b/drivers/xen/xenbus/xenbus_xs.c @@ -875,8 +875,16 @@ static int xenwatch_thread(void *unused) if (ent != &watch_events) { event = list_entry(ent, struct xs_watch_event, list); - event->handle->callback(event->handle, event->path, - event->token); + if ( !event->handle->callback_) + event->handle->callback(event->handle, event->path, + event->token); + else { + const char *vec[2]; + + vec[0] = event->path; + vec[1] = event->token; + event->handle->callback_(event->handle, vec, 2); + } kfree(event); } diff --git a/include/xen/xenbus.h b/include/xen/xenbus.h index 869c816d5f8c..48dd7c72bc41 100644 --- a/include/xen/xenbus.h +++ b/include/xen/xenbus.h @@ -60,8 +60,21 @@ struct xenbus_watch const char *node; /* Callback (executed in a process context with no locks held). */ +#ifndef __GENKSYMS__ + void (*callback_)(struct xenbus_watch *, + const char **vec, unsigned int len); void (*callback)(struct xenbus_watch *, const char *path, const char *token); +#else + /* + * KABI check. We prefer to keep 'callback' name for in-tree code + * to avoid code churning when backporting things. 'callback_' + * is used for compat callers. Unfortunately KABI checker doesn't + * like the underscored name so we will feed it original name. + */ + void (*callback)(struct xenbus_watch *, + const char **vec, unsigned int len); +#endif }; -- 2.50.1