static void nvmet_async_events_free(struct nvmet_ctrl *ctrl)
 {
-       struct nvmet_req *req;
+       struct nvmet_async_event *aen, *tmp;
 
        mutex_lock(&ctrl->lock);
-       while (ctrl->nr_async_event_cmds) {
-               req = ctrl->async_event_cmds[--ctrl->nr_async_event_cmds];
-               mutex_unlock(&ctrl->lock);
-               nvmet_req_complete(req, NVME_SC_INTERNAL | NVME_SC_DNR);
-               mutex_lock(&ctrl->lock);
+       list_for_each_entry_safe(aen, tmp, &ctrl->async_events, entry) {
+               list_del(&aen->entry);
+               kfree(aen);
        }
        mutex_unlock(&ctrl->lock);
 }
         * If this is the admin queue, complete all AERs so that our
         * queue doesn't have outstanding requests on it.
         */
-       if (ctrl && ctrl->sqs && ctrl->sqs[0] == sq) {
+       if (ctrl && ctrl->sqs && ctrl->sqs[0] == sq)
                nvmet_async_events_process(ctrl, status);
-               nvmet_async_events_free(ctrl);
-       }
        percpu_ref_kill_and_confirm(&sq->ref, nvmet_confirm_sq);
        wait_for_completion(&sq->confirm_done);
        wait_for_completion(&sq->free_done);
 
        ida_simple_remove(&cntlid_ida, ctrl->cntlid);
 
+       nvmet_async_events_free(ctrl);
        kfree(ctrl->sqs);
        kfree(ctrl->cqs);
        kfree(ctrl->changed_ns_list);