drivers/xen/manage.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-)
From: GuoHan Zhao <zhaoguohan@kylinos.cn>
setup_shutdown_watcher() registers shutdown_watch first, then the sysrq
watch, and finally publishes the supported feature-* nodes in xenstore.
If sysrq watch registration fails, or xenbus_printf() fails after one or
more feature nodes were created, the function returns immediately without
undoing the earlier setup.
This leaves the system in a partially initialized state, with registered
watches and/or stale xenstore entries despite the function reporting
failure.
Unwind the partial setup before returning an error by unregistering any
watches that were already registered and removing feature nodes that were
already published.
Signed-off-by: GuoHan Zhao <zhaoguohan@kylinos.cn>
---
drivers/xen/manage.c | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
index e20c40a62e64..18bf09e0192a 100644
--- a/drivers/xen/manage.c
+++ b/drivers/xen/manage.c
@@ -343,12 +343,11 @@ static int setup_shutdown_watcher(void)
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
@@ -361,11 +360,26 @@ static int setup_shutdown_watcher(void)
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);
+#endif
+err_unregister_shutdown:
+ unregister_xenbus_watch(&shutdown_watch);
+ return err;
}
static int shutdown_event(struct notifier_block *notifier,
--
2.43.0
Hi,
kernel test robot noticed the following build warnings:
[auto build test WARNING on v7.0]
[cannot apply to xen-tip/linux-next linus/master next-20260421]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/zhaoguohan-kylinos-cn/xen-manage-unwind-partial-shutdown-watcher-setup-on-error/20260416-185003
base: v7.0
patch link: https://lore.kernel.org/r/20260407022443.12971-1-zhaoguohan%40kylinos.cn
patch subject: [PATCH] xen/manage: unwind partial shutdown watcher setup on error
config: arm64-randconfig-001-20260421 (https://download.01.org/0day-ci/archive/20260422/202604220332.2gWBxnrF-lkp@intel.com/config)
compiler: clang version 23.0.0git (https://github.com/llvm/llvm-project 5bac06718f502014fade905512f1d26d578a18f3)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260422/202604220332.2gWBxnrF-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202604220332.2gWBxnrF-lkp@intel.com/
All warnings (new ones prefixed by >>):
>> drivers/xen/manage.c:380:1: warning: unused label 'err_unregister_shutdown' [-Wunused-label]
380 | err_unregister_shutdown:
| ^~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
vim +/err_unregister_shutdown +380 drivers/xen/manage.c
353
354 for (idx = 0; idx < ARRAY_SIZE(shutdown_handlers); idx++) {
355 if (!shutdown_handlers[idx].flag)
356 continue;
357 snprintf(node, FEATURE_PATH_SIZE, "feature-%s",
358 shutdown_handlers[idx].command);
359 err = xenbus_printf(XBT_NIL, "control", node, "%u", 1);
360 if (err) {
361 pr_err("%s: Error %d writing %s\n", __func__,
362 err, node);
363 goto err_remove_features;
364 }
365 }
366
367 return 0;
368
369 err_remove_features:
370 while (--idx >= 0) {
371 if (!shutdown_handlers[idx].flag)
372 continue;
373 snprintf(node, FEATURE_PATH_SIZE, "feature-%s",
374 shutdown_handlers[idx].command);
375 xenbus_rm(XBT_NIL, "control", node);
376 }
377 #ifdef CONFIG_MAGIC_SYSRQ
378 unregister_xenbus_watch(&sysrq_watch);
379 #endif
> 380 err_unregister_shutdown:
381 unregister_xenbus_watch(&shutdown_watch);
382 return err;
383 }
384
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Hi,
kernel test robot noticed the following build warnings:
[auto build test WARNING on v7.0]
[cannot apply to xen-tip/linux-next linus/master next-20260420]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/zhaoguohan-kylinos-cn/xen-manage-unwind-partial-shutdown-watcher-setup-on-error/20260416-185003
base: v7.0
patch link: https://lore.kernel.org/r/20260407022443.12971-1-zhaoguohan%40kylinos.cn
patch subject: [PATCH] xen/manage: unwind partial shutdown watcher setup on error
config: arm64-randconfig-002-20260421 (https://download.01.org/0day-ci/archive/20260421/202604211801.rqptlYaS-lkp@intel.com/config)
compiler: aarch64-linux-gcc (GCC) 13.4.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260421/202604211801.rqptlYaS-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202604211801.rqptlYaS-lkp@intel.com/
All warnings (new ones prefixed by >>):
drivers/xen/manage.c: In function 'setup_shutdown_watcher':
>> drivers/xen/manage.c:380:1: warning: label 'err_unregister_shutdown' defined but not used [-Wunused-label]
380 | err_unregister_shutdown:
| ^~~~~~~~~~~~~~~~~~~~~~~
drivers/xen/manage.c: In function 'shutdown_event':
drivers/xen/manage.c:357:60: warning: '%s' directive output may be truncated writing up to 71 bytes into a region of size 12 [-Wformat-truncation=]
357 | snprintf(node, FEATURE_PATH_SIZE, "feature-%s",
| ^~
In function 'setup_shutdown_watcher',
inlined from 'shutdown_event' at drivers/xen/manage.c:389:2:
drivers/xen/manage.c:357:17: note: 'snprintf' output between 9 and 80 bytes into a destination of size 20
357 | snprintf(node, FEATURE_PATH_SIZE, "feature-%s",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
358 | shutdown_handlers[idx].command);
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vim +/err_unregister_shutdown +380 drivers/xen/manage.c
353
354 for (idx = 0; idx < ARRAY_SIZE(shutdown_handlers); idx++) {
355 if (!shutdown_handlers[idx].flag)
356 continue;
357 snprintf(node, FEATURE_PATH_SIZE, "feature-%s",
358 shutdown_handlers[idx].command);
359 err = xenbus_printf(XBT_NIL, "control", node, "%u", 1);
360 if (err) {
361 pr_err("%s: Error %d writing %s\n", __func__,
362 err, node);
363 goto err_remove_features;
364 }
365 }
366
367 return 0;
368
369 err_remove_features:
370 while (--idx >= 0) {
371 if (!shutdown_handlers[idx].flag)
372 continue;
373 snprintf(node, FEATURE_PATH_SIZE, "feature-%s",
374 shutdown_handlers[idx].command);
375 xenbus_rm(XBT_NIL, "control", node);
376 }
377 #ifdef CONFIG_MAGIC_SYSRQ
378 unregister_xenbus_watch(&sysrq_watch);
379 #endif
> 380 err_unregister_shutdown:
381 unregister_xenbus_watch(&shutdown_watch);
382 return err;
383 }
384
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
On Tue, 7 Apr 2026, zhaoguohan@kylinos.cn wrote: > From: GuoHan Zhao <zhaoguohan@kylinos.cn> > > setup_shutdown_watcher() registers shutdown_watch first, then the sysrq > watch, and finally publishes the supported feature-* nodes in xenstore. > If sysrq watch registration fails, or xenbus_printf() fails after one or > more feature nodes were created, the function returns immediately without > undoing the earlier setup. > > This leaves the system in a partially initialized state, with registered > watches and/or stale xenstore entries despite the function reporting > failure. > > Unwind the partial setup before returning an error by unregistering any > watches that were already registered and removing feature nodes that were > already published. > > Signed-off-by: GuoHan Zhao <zhaoguohan@kylinos.cn> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
© 2016 - 2026 Red Hat, Inc.