return err;
}
-
#ifdef CONFIG_MAGIC_SYSRQ
err = register_xenbus_watch(&sysrq_watch);
if (err) {
pr_err("Failed to set sysrq watcher\n");
- return err;
+ goto err_unregister_shutdown;
}
#endif
if (err) {
pr_err("%s: Error %d writing %s\n", __func__,
err, node);
- return err;
+ goto err_remove_features;
}
}
return 0;
+
+err_remove_features:
+ while (--idx >= 0) {
+ if (!shutdown_handlers[idx].flag)
+ continue;
+ snprintf(node, FEATURE_PATH_SIZE, "feature-%s",
+ shutdown_handlers[idx].command);
+ xenbus_rm(XBT_NIL, "control", node);
+ }
+#ifdef CONFIG_MAGIC_SYSRQ
+ unregister_xenbus_watch(&sysrq_watch);
+err_unregister_shutdown:
+#endif
+ unregister_xenbus_watch(&shutdown_watch);
+ return err;
}
static int shutdown_event(struct notifier_block *notifier,