@@ -1367,7 +1367,7 @@ static bool nvme_should_reset(struct nvme_dev *dev, u32 csts)
1367
1367
bool nssro = dev -> subsystem && (csts & NVME_CSTS_NSSRO );
1368
1368
1369
1369
/* If there is a reset ongoing, we shouldn't reset again. */
1370
- if (work_busy ( & dev -> reset_work ) )
1370
+ if (dev -> ctrl . state == NVME_CTRL_RESETTING )
1371
1371
return false;
1372
1372
1373
1373
/* We shouldn't reset unless the controller is on fatal error state
@@ -1903,7 +1903,7 @@ static void nvme_reset_work(struct work_struct *work)
1903
1903
bool was_suspend = !!(dev -> ctrl .ctrl_config & NVME_CC_SHN_NORMAL );
1904
1904
int result = - ENODEV ;
1905
1905
1906
- if (WARN_ON (dev -> ctrl .state = = NVME_CTRL_RESETTING ))
1906
+ if (WARN_ON (dev -> ctrl .state ! = NVME_CTRL_RESETTING ))
1907
1907
goto out ;
1908
1908
1909
1909
/*
@@ -1913,9 +1913,6 @@ static void nvme_reset_work(struct work_struct *work)
1913
1913
if (dev -> ctrl .ctrl_config & NVME_CC_ENABLE )
1914
1914
nvme_dev_disable (dev , false);
1915
1915
1916
- if (!nvme_change_ctrl_state (& dev -> ctrl , NVME_CTRL_RESETTING ))
1917
- goto out ;
1918
-
1919
1916
result = nvme_pci_enable (dev );
1920
1917
if (result )
1921
1918
goto out ;
@@ -2009,8 +2006,8 @@ static int nvme_reset(struct nvme_dev *dev)
2009
2006
{
2010
2007
if (!dev -> ctrl .admin_q || blk_queue_dying (dev -> ctrl .admin_q ))
2011
2008
return - ENODEV ;
2012
- if (work_busy (& dev -> reset_work ))
2013
- return - ENODEV ;
2009
+ if (! nvme_change_ctrl_state (& dev -> ctrl , NVME_CTRL_RESETTING ))
2010
+ return - EBUSY ;
2014
2011
if (!queue_work (nvme_workq , & dev -> reset_work ))
2015
2012
return - EBUSY ;
2016
2013
return 0 ;
@@ -2136,6 +2133,7 @@ static int nvme_probe(struct pci_dev *pdev, const struct pci_device_id *id)
2136
2133
if (result )
2137
2134
goto release_pools ;
2138
2135
2136
+ nvme_change_ctrl_state (& dev -> ctrl , NVME_CTRL_RESETTING );
2139
2137
dev_info (dev -> ctrl .device , "pci function %s\n" , dev_name (& pdev -> dev ));
2140
2138
2141
2139
queue_work (nvme_workq , & dev -> reset_work );
@@ -2179,6 +2177,7 @@ static void nvme_remove(struct pci_dev *pdev)
2179
2177
2180
2178
nvme_change_ctrl_state (& dev -> ctrl , NVME_CTRL_DELETING );
2181
2179
2180
+ cancel_work_sync (& dev -> reset_work );
2182
2181
pci_set_drvdata (pdev , NULL );
2183
2182
2184
2183
if (!pci_device_is_present (pdev )) {
0 commit comments