When guest receives a sysrq request from the host it acknowledges it by writing '\0' to control/sysrq xenstore node. This, however, make xenstore watch fire again but xenbus_scanf() fails to parse empty value with "%c" format string: sysrq: SysRq : Emergency Sync Emergency Sync complete xen:manage: Error -34 reading sysrq code in control/sysrq Ignore -ERANGE the same way we already ignore -ENOENT, empty value in control/sysrq is totally legal.
Unified · Split
| @@ -280,9 +280,11 @@ static void sysrq_handler(struct xenbus_watch *watch, const char *path, · 279 unmodified lines | |||
| 280 | /* | 280 | /* |
| 281 | * The Xenstore watch fires directly after registering it and | 281 | * The Xenstore watch fires directly after registering it and |
| 282 | * after a suspend/resume cycle. So ENOENT is no error but | 282 | * after a suspend/resume cycle. So ENOENT is no error but |
| 283 | * might happen in those cases. | 283 | * might happen in those cases. ERANGE is observed when we get |
| 284 | * an empty value (''), this happens when we acknowledge the | ||
| 285 | * request by writing '\0' below. | ||
| 284 | */ | 286 | */ |
| 285 | if (err != -ENOENT) | 287 | if (err != -ENOENT && err != -ERANGE) |
| 286 | pr_err("Error %d reading sysrq code in control/sysrq\n", | 288 | pr_err("Error %d reading sysrq code in control/sysrq\n", |
| 287 | err); | 289 | err); |
| 288 | xenbus_transaction_end(xbt, 1); | 290 | xenbus_transaction_end(xbt, 1); |