Move NVME controller shutdown from being called as part of module unloading

to being called through the newbus DEVICE_SHUTDOWN() path. This ensures that
the NVME controller gets shut down before the device and bus disappear
and prevents data corruption on shutdown on at least Samsung EVO 960 SSDs.

PR:		kern/211852
Reviewed by:	imp
MFC after:	2 weeks
This commit is contained in:
Nathan Whitehorn 2017-08-12 22:13:06 +00:00
parent 7a6fd8dc6b
commit c670f31f19
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=322443

View File

@ -58,6 +58,7 @@ MALLOC_DEFINE(M_NVME, "nvme", "nvme(4) memory allocations");
static int nvme_probe(device_t);
static int nvme_attach(device_t);
static int nvme_detach(device_t);
static int nvme_shutdown(device_t);
static int nvme_modevent(module_t mod, int type, void *arg);
static devclass_t nvme_devclass;
@ -67,6 +68,7 @@ static device_method_t nvme_pci_methods[] = {
DEVMETHOD(device_probe, nvme_probe),
DEVMETHOD(device_attach, nvme_attach),
DEVMETHOD(device_detach, nvme_detach),
DEVMETHOD(device_shutdown, nvme_shutdown),
{ 0, 0 }
};
@ -179,22 +181,15 @@ nvme_unload(void)
{
}
static void
nvme_shutdown(void)
static int
nvme_shutdown(device_t dev)
{
device_t *devlist;
struct nvme_controller *ctrlr;
int dev, devcount;
if (devclass_get_devices(nvme_devclass, &devlist, &devcount))
return;
ctrlr = DEVICE2SOFTC(dev);
nvme_ctrlr_shutdown(ctrlr);
for (dev = 0; dev < devcount; dev++) {
ctrlr = DEVICE2SOFTC(devlist[dev]);
nvme_ctrlr_shutdown(ctrlr);
}
free(devlist, M_TEMP);
return (0);
}
static int
@ -208,9 +203,6 @@ nvme_modevent(module_t mod, int type, void *arg)
case MOD_UNLOAD:
nvme_unload();
break;
case MOD_SHUTDOWN:
nvme_shutdown();
break;
default:
break;
}