hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/xen/xenbus/xenbus_probe_frontend.c
....@@ -1,3 +1,4 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
23
34 #define DPRINTK(fmt, ...) \
....@@ -18,7 +19,6 @@
1819 #include <linux/module.h>
1920
2021 #include <asm/page.h>
21
-#include <asm/pgtable.h>
2222 #include <asm/xen/hypervisor.h>
2323 #include <xen/xenbus.h>
2424 #include <xen/events.h>
....@@ -125,6 +125,28 @@
125125 return xenbus_dev_probe(dev);
126126 }
127127
128
+static void xenbus_frontend_dev_shutdown(struct device *_dev)
129
+{
130
+ struct xenbus_device *dev = to_xenbus_device(_dev);
131
+ unsigned long timeout = 5*HZ;
132
+
133
+ DPRINTK("%s", dev->nodename);
134
+
135
+ get_device(&dev->dev);
136
+ if (dev->state != XenbusStateConnected) {
137
+ pr_info("%s: %s: %s != Connected, skipping\n",
138
+ __func__, dev->nodename, xenbus_strstate(dev->state));
139
+ goto out;
140
+ }
141
+ xenbus_switch_state(dev, XenbusStateClosing);
142
+ timeout = wait_for_completion_timeout(&dev->down, timeout);
143
+ if (!timeout)
144
+ pr_info("%s: %s timeout closing device\n",
145
+ __func__, dev->nodename);
146
+ out:
147
+ put_device(&dev->dev);
148
+}
149
+
128150 static const struct dev_pm_ops xenbus_pm_ops = {
129151 .suspend = xenbus_dev_suspend,
130152 .resume = xenbus_frontend_dev_resume,
....@@ -145,7 +167,7 @@
145167 .uevent = xenbus_uevent_frontend,
146168 .probe = xenbus_frontend_dev_probe,
147169 .remove = xenbus_dev_remove,
148
- .shutdown = xenbus_dev_shutdown,
170
+ .shutdown = xenbus_frontend_dev_shutdown,
149171 .dev_groups = xenbus_dev_groups,
150172
151173 .pm = &xenbus_pm_ops,
....@@ -379,12 +401,12 @@
379401 case XenbusStateConnected:
380402 xenbus_printf(XBT_NIL, fe, "state", "%d", XenbusStateClosing);
381403 xenbus_reset_wait_for_backend(be, XenbusStateClosing);
382
- /* fall through */
404
+ fallthrough;
383405
384406 case XenbusStateClosing:
385407 xenbus_printf(XBT_NIL, fe, "state", "%d", XenbusStateClosed);
386408 xenbus_reset_wait_for_backend(be, XenbusStateClosed);
387
- /* fall through */
409
+ fallthrough;
388410
389411 case XenbusStateClosed:
390412 xenbus_printf(XBT_NIL, fe, "state", "%d", XenbusStateInitialising);