@@ -572,7 +572,7 @@ static int nvme_tcp_handle_comp(struct nvme_tcp_queue *queue,
572
572
return ret ;
573
573
}
574
574
575
- static int nvme_tcp_setup_h2c_data_pdu (struct nvme_tcp_request * req ,
575
+ static void nvme_tcp_setup_h2c_data_pdu (struct nvme_tcp_request * req ,
576
576
struct nvme_tcp_r2t_pdu * pdu )
577
577
{
578
578
struct nvme_tcp_data_pdu * data = req -> pdu ;
@@ -581,32 +581,11 @@ static int nvme_tcp_setup_h2c_data_pdu(struct nvme_tcp_request *req,
581
581
u8 hdgst = nvme_tcp_hdgst_len (queue );
582
582
u8 ddgst = nvme_tcp_ddgst_len (queue );
583
583
584
+ req -> state = NVME_TCP_SEND_H2C_PDU ;
585
+ req -> offset = 0 ;
584
586
req -> pdu_len = le32_to_cpu (pdu -> r2t_length );
585
587
req -> pdu_sent = 0 ;
586
588
587
- if (unlikely (!req -> pdu_len )) {
588
- dev_err (queue -> ctrl -> ctrl .device ,
589
- "req %d r2t len is %u, probably a bug...\n" ,
590
- rq -> tag , req -> pdu_len );
591
- return - EPROTO ;
592
- }
593
-
594
- if (unlikely (req -> data_sent + req -> pdu_len > req -> data_len )) {
595
- dev_err (queue -> ctrl -> ctrl .device ,
596
- "req %d r2t len %u exceeded data len %u (%zu sent)\n" ,
597
- rq -> tag , req -> pdu_len , req -> data_len ,
598
- req -> data_sent );
599
- return - EPROTO ;
600
- }
601
-
602
- if (unlikely (le32_to_cpu (pdu -> r2t_offset ) < req -> data_sent )) {
603
- dev_err (queue -> ctrl -> ctrl .device ,
604
- "req %d unexpected r2t offset %u (expected %zu)\n" ,
605
- rq -> tag , le32_to_cpu (pdu -> r2t_offset ),
606
- req -> data_sent );
607
- return - EPROTO ;
608
- }
609
-
610
589
memset (data , 0 , sizeof (* data ));
611
590
data -> hdr .type = nvme_tcp_h2c_data ;
612
591
data -> hdr .flags = NVME_TCP_F_DATA_LAST ;
@@ -622,15 +601,14 @@ static int nvme_tcp_setup_h2c_data_pdu(struct nvme_tcp_request *req,
622
601
data -> command_id = nvme_cid (rq );
623
602
data -> data_offset = pdu -> r2t_offset ;
624
603
data -> data_length = cpu_to_le32 (req -> pdu_len );
625
- return 0 ;
626
604
}
627
605
628
606
static int nvme_tcp_handle_r2t (struct nvme_tcp_queue * queue ,
629
607
struct nvme_tcp_r2t_pdu * pdu )
630
608
{
631
609
struct nvme_tcp_request * req ;
632
610
struct request * rq ;
633
- int ret ;
611
+ u32 r2t_length = le32_to_cpu ( pdu -> r2t_length ) ;
634
612
635
613
rq = nvme_find_rq (nvme_tcp_tagset (queue ), pdu -> command_id );
636
614
if (!rq ) {
@@ -641,13 +619,28 @@ static int nvme_tcp_handle_r2t(struct nvme_tcp_queue *queue,
641
619
}
642
620
req = blk_mq_rq_to_pdu (rq );
643
621
644
- ret = nvme_tcp_setup_h2c_data_pdu (req , pdu );
645
- if (unlikely (ret ))
646
- return ret ;
622
+ if (unlikely (!r2t_length )) {
623
+ dev_err (queue -> ctrl -> ctrl .device ,
624
+ "req %d r2t len is %u, probably a bug...\n" ,
625
+ rq -> tag , r2t_length );
626
+ return - EPROTO ;
627
+ }
647
628
648
- req -> state = NVME_TCP_SEND_H2C_PDU ;
649
- req -> offset = 0 ;
629
+ if (unlikely (req -> data_sent + r2t_length > req -> data_len )) {
630
+ dev_err (queue -> ctrl -> ctrl .device ,
631
+ "req %d r2t len %u exceeded data len %u (%zu sent)\n" ,
632
+ rq -> tag , r2t_length , req -> data_len , req -> data_sent );
633
+ return - EPROTO ;
634
+ }
635
+
636
+ if (unlikely (le32_to_cpu (pdu -> r2t_offset ) < req -> data_sent )) {
637
+ dev_err (queue -> ctrl -> ctrl .device ,
638
+ "req %d unexpected r2t offset %u (expected %zu)\n" ,
639
+ rq -> tag , le32_to_cpu (pdu -> r2t_offset ), req -> data_sent );
640
+ return - EPROTO ;
641
+ }
650
642
643
+ nvme_tcp_setup_h2c_data_pdu (req , pdu );
651
644
nvme_tcp_queue_request (req , false, true);
652
645
653
646
return 0 ;
0 commit comments