nvmet: release a ns reference in nvmet_req_uninit if needed
authorSagi Grimberg <sagi@grimberg.me>
Sun, 14 Jan 2018 16:34:22 +0000 (18:34 +0200)
committerChristoph Hellwig <hch@lst.de>
Mon, 15 Jan 2018 16:09:32 +0000 (17:09 +0100)
nvmet_req_init looked up a namespace and took a reference on it (unless it
failed prior to that). If the request is uninitialized (in error cases) we
need to remove that reference in case it was taken, otherwise we leak
namespace reference when calling nvme_req_uninit.

Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/target/core.c

index 7282ea8d3b96c9b49cda238695a90e78d957652b..0bd737117a80a172745aab1868fb8a4ecf6f1e8c 100644 (file)
@@ -512,6 +512,7 @@ bool nvmet_req_init(struct nvmet_req *req, struct nvmet_cq *cq,
        req->sg_cnt = 0;
        req->transfer_len = 0;
        req->rsp->status = 0;
+       req->ns = NULL;
 
        /* no support for fused commands yet */
        if (unlikely(flags & (NVME_CMD_FUSE_FIRST | NVME_CMD_FUSE_SECOND))) {
@@ -557,6 +558,8 @@ EXPORT_SYMBOL_GPL(nvmet_req_init);
 void nvmet_req_uninit(struct nvmet_req *req)
 {
        percpu_ref_put(&req->sq->ref);
+       if (req->ns)
+               nvmet_put_namespace(req->ns);
 }
 EXPORT_SYMBOL_GPL(nvmet_req_uninit);