[PATCH] nvme-fc: Fix initialization order

James Smart jsmart2021 at gmail.com
Wed Jan 25 10:40:41 PST 2023


On 1/20/2023 9:43 AM, Ross Lagerwall wrote:
> ctrl->ops is used by nvme_alloc_admin_tag_set() but set by
> nvme_init_ctrl() so reorder the calls to avoid a NULL pointer
> dereference.
> 
> Fixes: 6dfba1c09c10 ("nvme-fc: use the tagset alloc/free helpers")
> Signed-off-by: Ross Lagerwall <ross.lagerwall at citrix.com>
> Cc: stable at vger.kernel.org
> ---
>   drivers/nvme/host/fc.c | 18 ++++++++----------
>   1 file changed, 8 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
> index 4564f16a0b20..456ee42a6133 100644
> --- a/drivers/nvme/host/fc.c
> +++ b/drivers/nvme/host/fc.c
> @@ -3521,13 +3521,6 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts,
>   
>   	nvme_fc_init_queue(ctrl, 0);
>   
> -	ret = nvme_alloc_admin_tag_set(&ctrl->ctrl, &ctrl->admin_tag_set,
> -			&nvme_fc_admin_mq_ops,
> -			struct_size((struct nvme_fcp_op_w_sgl *)NULL, priv,
> -				    ctrl->lport->ops->fcprqst_priv_sz));
> -	if (ret)
> -		goto out_free_queues;
> -
>   	/*
>   	 * Would have been nice to init io queues tag set as well.
>   	 * However, we require interaction from the controller
> @@ -3537,10 +3530,17 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts,
>   
>   	ret = nvme_init_ctrl(&ctrl->ctrl, dev, &nvme_fc_ctrl_ops, 0);
>   	if (ret)
> -		goto out_cleanup_tagset;
> +		goto out_free_queues;
>   
>   	/* at this point, teardown path changes to ref counting on nvme ctrl */
>   
> +	ret = nvme_alloc_admin_tag_set(&ctrl->ctrl, &ctrl->admin_tag_set,
> +			&nvme_fc_admin_mq_ops,
> +			struct_size((struct nvme_fcp_op_w_sgl *)NULL, priv,
> +				    ctrl->lport->ops->fcprqst_priv_sz));
> +	if (ret)
> +		goto fail_ctrl;
> +
>   	spin_lock_irqsave(&rport->lock, flags);
>   	list_add_tail(&ctrl->ctrl_list, &rport->ctrl_list);
>   	spin_unlock_irqrestore(&rport->lock, flags);
> @@ -3592,8 +3592,6 @@ nvme_fc_init_ctrl(struct device *dev, struct nvmf_ctrl_options *opts,
>   
>   	return ERR_PTR(-EIO);
>   
> -out_cleanup_tagset:
> -	nvme_remove_admin_tag_set(&ctrl->ctrl);
>   out_free_queues:
>   	kfree(ctrl->queues);
>   out_free_ida:

Yep. Thanks

Reviewed-by: James Smart <jsmart2021 at gmail.com>

-- james





More information about the Linux-nvme mailing list