u32 perms;
        int ctxid = -1;
        u64 rctxid = 0UL;
-       struct file *file;
+       struct file *file = NULL;
 
-       struct cxl_context *ctx;
+       struct cxl_context *ctx = NULL;
 
        int fd = -1;
 
        if (unlikely(!lun_access)) {
                dev_err(dev, "%s: Unable to allocate lun_access!\n", __func__);
                rc = -ENOMEM;
-               goto err0;
+               goto err;
        }
 
        lun_access->lli = lli;
                dev_err(dev, "%s: Could not initialize context %p\n",
                        __func__, ctx);
                rc = -ENODEV;
-               goto err1;
+               goto err;
        }
 
        ctxid = cxl_process_element(ctx);
        if (unlikely((ctxid >= MAX_CONTEXT) || (ctxid < 0))) {
                dev_err(dev, "%s: ctxid (%d) invalid!\n", __func__, ctxid);
                rc = -EPERM;
-               goto err2;
+               goto err;
        }
 
        file = cxl_get_fd(ctx, &cfg->cxl_fops, &fd);
        if (unlikely(fd < 0)) {
                rc = -ENODEV;
                dev_err(dev, "%s: Could not get file descriptor\n", __func__);
-               goto err2;
+               goto err;
        }
 
        /* Translate read/write O_* flags from fcntl.h to AFU permission bits */
        if (unlikely(!ctxi)) {
                dev_err(dev, "%s: Failed to create context! (%d)\n",
                        __func__, ctxid);
-               goto err3;
+               goto err;
        }
 
        /* Context mutex is locked upon return */
        if (unlikely(rc)) {
                dev_dbg(dev, "%s: Could not start context rc=%d\n",
                        __func__, rc);
-               goto err4;
+               goto err;
        }
 
        rc = afu_attach(cfg, ctxi);
        if (unlikely(rc)) {
                dev_err(dev, "%s: Could not attach AFU rc %d\n", __func__, rc);
-               goto err5;
+               goto err;
        }
 
        /*
                __func__, ctxid, fd, attach->block_size, rc, attach->last_lba);
        return rc;
 
-err5:
-       cxl_stop_context(ctx);
-err4:
-       put_context(ctxi);
-       destroy_context(cfg, ctxi);
-       ctxi = NULL;
-err3:
+err:
+       /* Cleanup CXL context; okay to 'stop' even if it was not started */
+       if (!IS_ERR_OR_NULL(ctx)) {
+               cxl_stop_context(ctx);
+               cxl_release_context(ctx);
+               ctx = NULL;
+       }
+
        /*
         * Here, we're overriding the fops with a dummy all-NULL fops because
         * fput() calls the release fop, which will cause us to mistakenly
         * to that routine (cxlflash_cxl_release) we should try to fix the
         * issue here.
         */
-       file->f_op = &null_fops;
-       fput(file);
-       put_unused_fd(fd);
-       fd = -1;
-err2:
-       cxl_release_context(ctx);
-err1:
+       if (fd > 0) {
+               file->f_op = &null_fops;
+               fput(file);
+               put_unused_fd(fd);
+               fd = -1;
+               file = NULL;
+       }
+
+       /* Cleanup our context; safe to call even with mutex locked */
+       if (ctxi) {
+               destroy_context(cfg, ctxi);
+               ctxi = NULL;
+       }
+
        kfree(lun_access);
-err0:
        scsi_device_put(sdev);
        goto out;
 }