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 <boris.ostrovsky@oracle.com>
Reviewed-by: Joao Martins <joao.m.martins@oracle.com>
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);
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",
watch->node = path;
watch->callback = callback;
+ watch->callback_ = NULL;
err = register_xenbus_watch(watch);
}
watch->watch.callback = watch_fired;
+ watch->watch.callback_ = NULL;
watch->dev_data = u;
err = register_xenbus_watch(&watch->watch);
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);
}
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
};