This patch started as a challenge from Keith relating to code
structuring with goto vs return. I think the final result improves
readability on two counts:
First, it clarifies the separation between work struct and nvme_dev.
Second, it makes it clearer what error is being passed on:
'return -ENODEV' vs 'goto out', where 'result' happens to be -ENODEV

CC: Keith Busch <keith.bu...@intel.com>
Signed-off-by: Alexandru Gagniuc <mr.nuke...@gmail.com>
---
 drivers/nvme/host/pci.c | 42 ++++++++++++++++++++++++------------------
 1 file changed, 24 insertions(+), 18 deletions(-)

diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index fbc71fac6f1e..bac7d30a10a7 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -2286,16 +2286,14 @@ static void nvme_remove_dead_ctrl(struct nvme_dev *dev, 
int status)
                nvme_put_ctrl(&dev->ctrl);
 }
 
-static void nvme_reset_work(struct work_struct *work)
+static int do_nvme_reset_work(struct nvme_dev *dev)
 {
-       struct nvme_dev *dev =
-               container_of(work, struct nvme_dev, ctrl.reset_work);
        bool was_suspend = !!(dev->ctrl.ctrl_config & NVME_CC_SHN_NORMAL);
        int result = -ENODEV;
        enum nvme_ctrl_state new_state = NVME_CTRL_LIVE;
 
        if (WARN_ON(dev->ctrl.state != NVME_CTRL_RESETTING))
-               goto out;
+               return -ENODEV;
 
        /*
         * If we're called to reset a live controller first shut it down before
@@ -2310,30 +2308,30 @@ static void nvme_reset_work(struct work_struct *work)
         */
        if (!nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_CONNECTING)) {
                dev_warn(dev->ctrl.device,
-                       "failed to mark controller CONNECTING\n");
-               goto out;
+                        "failed to mark controller CONNECTING\n");
+               return -ENODEV;
        }
 
        result = nvme_pci_enable(dev);
        if (result)
-               goto out;
+               return result;
 
        result = nvme_pci_configure_admin_queue(dev);
        if (result)
-               goto out;
+               return result;
 
        result = nvme_alloc_admin_tags(dev);
        if (result)
-               goto out;
+               return result;
 
        result = nvme_init_identify(&dev->ctrl);
        if (result)
-               goto out;
+               return result;
 
        if (dev->ctrl.oacs & NVME_CTRL_OACS_SEC_SUPP) {
                if (!dev->ctrl.opal_dev)
                        dev->ctrl.opal_dev =
-                               init_opal_dev(&dev->ctrl, &nvme_sec_submit);
+                       init_opal_dev(&dev->ctrl, &nvme_sec_submit);
                else if (was_suspend)
                        opal_unlock_from_suspend(dev->ctrl.opal_dev);
        } else {
@@ -2351,12 +2349,12 @@ static void nvme_reset_work(struct work_struct *work)
        if (dev->ctrl.hmpre) {
                result = nvme_setup_host_mem(dev);
                if (result < 0)
-                       goto out;
+                       return result;
        }
 
        result = nvme_setup_io_queues(dev);
        if (result)
-               goto out;
+               return result;
 
        /*
         * Keep the controller around but remove all namespaces if we don't have
@@ -2382,15 +2380,23 @@ static void nvme_reset_work(struct work_struct *work)
         */
        if (!nvme_change_ctrl_state(&dev->ctrl, new_state)) {
                dev_warn(dev->ctrl.device,
-                       "failed to mark controller state %d\n", new_state);
-               goto out;
+                        "failed to mark controller state %d\n", new_state);
+               return 0;
        }
 
        nvme_start_ctrl(&dev->ctrl);
-       return;
+       return 0;
+
+}
+static void nvme_reset_work(struct work_struct *work)
+{
+       struct nvme_dev *dev =
+               container_of(work, struct nvme_dev, ctrl.reset_work);
+       int result;
 
- out:
-       nvme_remove_dead_ctrl(dev, result);
+       result = do_nvme_reset_work(dev);
+       if (result < 0)
+               nvme_remove_dead_ctrl(dev, result);
 }
 
 static void nvme_remove_dead_ctrl_work(struct work_struct *work)
-- 
2.14.3

Reply via email to