nvmet: fix a use-after-free
[linux-2.6-block.git] / drivers / nvme / target / core.c
index a1345790005f428ce84a718469178157975736cc..7f4083cf953a658499cd09c1047ac7dd97cf971c 100644 (file)
@@ -735,6 +735,8 @@ static void nvmet_set_error(struct nvmet_req *req, u16 status)
 
 static void __nvmet_req_complete(struct nvmet_req *req, u16 status)
 {
+       struct nvmet_ns *ns = req->ns;
+
        if (!req->sq->sqhd_disabled)
                nvmet_update_sq_head(req);
        req->cqe->sq_id = cpu_to_le16(req->sq->qid);
@@ -745,9 +747,9 @@ static void __nvmet_req_complete(struct nvmet_req *req, u16 status)
 
        trace_nvmet_req_complete(req);
 
-       if (req->ns)
-               nvmet_put_namespace(req->ns);
        req->ops->queue_response(req);
+       if (ns)
+               nvmet_put_namespace(ns);
 }
 
 void nvmet_req_complete(struct nvmet_req *req, u16 status)