[PATCH] nvmet_fc: correct ref counting error when deferred rcv used

Christoph Hellwig hch at infradead.org
Sun Nov 19 23:31:42 PST 2017


Thanks,

pplied to nvme-4.15.

On Fri, Nov 10, 2017 at 03:38:45PM -0800, James Smart wrote:
> Whenever a cmd is received a reference is taken while looking up the
> queue. The reference is removed after the cmd is done as the iod is
> returned for reuse. The fod may be reused for a deferred (recevied but
> no job context) cmd.  Existing code removes the reference only if the
> fod is not reused for another command. Given the fod may be used for
> one or more ios, although a reference was taken per io, it won't be
> matched on the frees.
> 
> Remove the reference on every fod free. This pairs the references to
> each io.
> 
> Signed-off-by: James Smart <james.smart at broadcom.com>
> ---
>  drivers/nvme/target/fc.c | 9 ++++++---
>  1 file changed, 6 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c
> index 5f2570f5dfa9..5da4777ab8fb 100644
> --- a/drivers/nvme/target/fc.c
> +++ b/drivers/nvme/target/fc.c
> @@ -534,15 +534,15 @@ nvmet_fc_free_fcp_iod(struct nvmet_fc_tgt_queue *queue,
>  
>  	tgtport->ops->fcp_req_release(&tgtport->fc_target_port, fcpreq);
>  
> +	/* release the queue lookup reference on the completed IO */
> +	nvmet_fc_tgt_q_put(queue);
> +
>  	spin_lock_irqsave(&queue->qlock, flags);
>  	deferfcp = list_first_entry_or_null(&queue->pending_cmd_list,
>  				struct nvmet_fc_defer_fcp_req, req_list);
>  	if (!deferfcp) {
>  		list_add_tail(&fod->fcp_list, &fod->queue->fod_list);
>  		spin_unlock_irqrestore(&queue->qlock, flags);
> -
> -		/* Release reference taken at queue lookup and fod allocation */
> -		nvmet_fc_tgt_q_put(queue);
>  		return;
>  	}
>  
> @@ -761,6 +761,9 @@ nvmet_fc_delete_target_queue(struct nvmet_fc_tgt_queue *queue)
>  		tgtport->ops->fcp_req_release(&tgtport->fc_target_port,
>  				deferfcp->fcp_req);
>  
> +		/* release the queue lookup reference */
> +		nvmet_fc_tgt_q_put(queue);
> +
>  		kfree(deferfcp);
>  
>  		spin_lock_irqsave(&queue->qlock, flags);
> -- 
> 2.13.1
> 
> 
> _______________________________________________
> Linux-nvme mailing list
> Linux-nvme at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-nvme
---end quoted text---



More information about the Linux-nvme mailing list