[PATCH V2 2/2] nvmet-tcp: remove redundant calls to nvmet_tcp_fatal_error()

Maurizio Lombardi mlombard at arkamax.eu
Fri Mar 13 01:14:09 PDT 2026


On Fri Mar 13, 2026 at 9:11 AM CET, Hannes Reinecke wrote:
> On 3/13/26 08:51, Maurizio Lombardi wrote:
>> On Fri Mar 13, 2026 at 8:20 AM CET, Hannes Reinecke wrote:
>>> On 3/12/26 14:40, Maurizio Lombardi wrote:
>>>> Executing nvmet_tcp_fatal_error() is generally the responsibility
>>>> of the caller (nvmet_tcp_try_recv); all other functions should
>>>> just return the error code.
>>>>
>>>> Signed-off-by: Maurizio Lombardi <mlombard at redhat.com>
>>>> ---
>>>>    drivers/nvme/target/tcp.c | 22 +++++-----------------
>>>>    1 file changed, 5 insertions(+), 17 deletions(-)
>>>>
>>>> diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
>>>> index 1fbf12df1183..b250b13854b4 100644
>>>> --- a/drivers/nvme/target/tcp.c
>>>> +++ b/drivers/nvme/target/tcp.c
>>>> @@ -885,7 +885,6 @@ static int nvmet_tcp_handle_icreq(struct nvmet_tcp_queue *queue)
>>>>    	if (le32_to_cpu(icreq->hdr.plen) != sizeof(struct nvme_tcp_icreq_pdu)) {
>>>>    		pr_err("bad nvme-tcp pdu length (%d)\n",
>>>>    			le32_to_cpu(icreq->hdr.plen));
>>>> -		nvmet_tcp_fatal_error(queue);
>>>>    		return -EPROTO;
>>>>    	}
>>>>    
>>>> @@ -951,7 +950,6 @@ static int nvmet_tcp_handle_req_failure(struct nvmet_tcp_queue *queue,
>>>>    	ret = nvmet_tcp_map_data(cmd);
>>>>    	if (unlikely(ret)) {
>>>>    		pr_err("queue %d: failed to map data\n", queue->idx);
>>>> -		nvmet_tcp_fatal_error(queue);
>>>>    		return -EPROTO;
>>>>    	}
>>>>    
>>>> @@ -1024,7 +1022,6 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue)
>>>>    
>>>>    err_proto:
>>>>    	/* FIXME: use proper transport errors */
>>>> -	nvmet_tcp_fatal_error(queue);
>>>>    	return -EPROTO;
>>>>    }
>>>>    
>>>> @@ -1039,7 +1036,6 @@ static int nvmet_tcp_done_recv_pdu(struct nvmet_tcp_queue *queue)
>>>>    		if (hdr->type != nvme_tcp_icreq) {
>>>>    			pr_err("unexpected pdu type (%d) before icreq\n",
>>>>    				hdr->type);
>>>> -			nvmet_tcp_fatal_error(queue);
>>>>    			return -EPROTO;
>>>>    		}
>>>>    		return nvmet_tcp_handle_icreq(queue);
>>>> @@ -1048,7 +1044,6 @@ static int nvmet_tcp_done_recv_pdu(struct nvmet_tcp_queue *queue)
>>>>    	if (unlikely(hdr->type == nvme_tcp_icreq)) {
>>>>    		pr_err("queue %d: received icreq pdu in state %d\n",
>>>>    			queue->idx, queue->state);
>>>> -		nvmet_tcp_fatal_error(queue);
>>>>    		return -EPROTO;
>>>>    	}
>>>>    
>>>> @@ -1065,7 +1060,6 @@ static int nvmet_tcp_done_recv_pdu(struct nvmet_tcp_queue *queue)
>>>>    		pr_err("queue %d: out of commands (%d) send_list_len: %d, opcode: %d",
>>>>    			queue->idx, queue->nr_cmds, queue->send_list_len,
>>>>    			nvme_cmd->common.opcode);
>>>> -		nvmet_tcp_fatal_error(queue);
>>>>    		return -ENOMEM;
>>>>    	}
>>>>    
>>>> @@ -1086,9 +1080,9 @@ static int nvmet_tcp_done_recv_pdu(struct nvmet_tcp_queue *queue)
>>>>    	if (unlikely(ret)) {
>>>>    		pr_err("queue %d: failed to map data\n", queue->idx);
>>>>    		if (nvmet_tcp_has_inline_data(queue->cmd))
>>>> -			nvmet_tcp_fatal_error(queue);
>>>> -		else
>>>> -			nvmet_req_complete(req, ret);
>>>> +			return -EPROTO;
>>>> +
>>>> +		nvmet_req_complete(req, ret);
>>>>    		ret = -EAGAIN;
>>>>    		goto out;
>>>>    	}
>>>> @@ -1211,7 +1205,6 @@ static int nvmet_tcp_try_recv_pdu(struct nvmet_tcp_queue *queue)
>>>>    
>>>>    		if (unlikely(!nvmet_tcp_pdu_valid(hdr->type))) {
>>>>    			pr_err("unexpected pdu type %d\n", hdr->type);
>>>> -			nvmet_tcp_fatal_error(queue);
>>>>    			return -EIO;
>>>>    		}
>>>>    
>>>> @@ -1225,16 +1218,12 @@ static int nvmet_tcp_try_recv_pdu(struct nvmet_tcp_queue *queue)
>>>>    	}
>>>>    
>>>>    	if (queue->hdr_digest &&
>>>> -	    nvmet_tcp_verify_hdgst(queue, &queue->pdu, hdr->hlen)) {
>>>> -		nvmet_tcp_fatal_error(queue); /* fatal */
>>>> +	    nvmet_tcp_verify_hdgst(queue, &queue->pdu, hdr->hlen))
>>>>    		return -EPROTO;
>>>> -	}
>>>>    
>>>>    	if (queue->data_digest &&
>>>> -	    nvmet_tcp_check_ddgst(queue, &queue->pdu)) {
>>>> -		nvmet_tcp_fatal_error(queue); /* fatal */
>>>> +	    nvmet_tcp_check_ddgst(queue, &queue->pdu))
>>>>    		return -EPROTO;
>>>> -	}
>>>>    
>>>>    	return nvmet_tcp_done_recv_pdu(queue);
>>>>    }
>>>> @@ -1319,7 +1308,6 @@ static int nvmet_tcp_try_recv_ddgst(struct nvmet_tcp_queue *queue)
>>>>    			le32_to_cpu(cmd->exp_ddgst));
>>>>    		nvmet_req_uninit(&cmd->req);
>>>>    		nvmet_tcp_free_cmd_buffers(cmd);
>>>> -		nvmet_tcp_fatal_error(queue);
>>>>    		ret = -EPROTO;
>>>>    		goto out;
>>>>    	}
>>>
>>> I seem to be missing something crucial here. But after applying this
>>> patch _all_ invocations to nvmet_tcp_fatal_error() are gone.
>>> (Applying the patches on top of linus tree with topmost commit
>>> 0257f64bdac7fdca30fa3cae0df8b9ecbec7733a)
>>>
>>> I must be missing something crucial here ...
>> 
>> I've just rebased my branch on top of master and I can still
>> see nvmet_tcp_socket_error() calling nvmet_tcp_fatal_error()
>> 
>> nvmet_tcp_socket_error() is called by both nvmet_tcp_try_send()
>> and nvmet_tcp_try_recv() in case of errors, so it's still here.
>> with us.
>> 
> Right.
> But now nvmet_tcp_fatal_error() has just a single caller, so please
> fold it into nvmet_tcp_socket_error() (and remove the forward declaration).

Ok, will send a V3.

Thanks for the review.

Maurizio



More information about the Linux-nvme mailing list