@@ -549,18 +549,24 @@ static void srp_unmap_data(struct scsi_cmnd *scmnd,
549
549
scsi_sg_count (scmnd ), scmnd -> sc_data_direction );
550
550
}
551
551
552
- static void srp_remove_req (struct srp_target_port * target , struct srp_request * req )
552
+ static void srp_remove_req (struct srp_target_port * target ,
553
+ struct srp_request * req , s32 req_lim_delta )
553
554
{
555
+ unsigned long flags ;
556
+
554
557
srp_unmap_data (req -> scmnd , target , req );
558
+ spin_lock_irqsave (target -> scsi_host -> host_lock , flags );
559
+ target -> req_lim += req_lim_delta ;
555
560
req -> scmnd = NULL ;
556
561
list_add_tail (& req -> list , & target -> free_reqs );
562
+ spin_unlock_irqrestore (target -> scsi_host -> host_lock , flags );
557
563
}
558
564
559
565
static void srp_reset_req (struct srp_target_port * target , struct srp_request * req )
560
566
{
561
567
req -> scmnd -> result = DID_RESET << 16 ;
562
568
req -> scmnd -> scsi_done (req -> scmnd );
563
- srp_remove_req (target , req );
569
+ srp_remove_req (target , req , 0 );
564
570
}
565
571
566
572
static int srp_reconnect_target (struct srp_target_port * target )
@@ -595,13 +601,11 @@ static int srp_reconnect_target(struct srp_target_port *target)
595
601
while (ib_poll_cq (target -> send_cq , 1 , & wc ) > 0 )
596
602
; /* nothing */
597
603
598
- spin_lock_irq (target -> scsi_host -> host_lock );
599
604
for (i = 0 ; i < SRP_CMD_SQ_SIZE ; ++ i ) {
600
605
struct srp_request * req = & target -> req_ring [i ];
601
606
if (req -> scmnd )
602
607
srp_reset_req (target , req );
603
608
}
604
- spin_unlock_irq (target -> scsi_host -> host_lock );
605
609
606
610
INIT_LIST_HEAD (& target -> free_tx );
607
611
for (i = 0 ; i < SRP_SQ_SIZE ; ++ i )
@@ -914,15 +918,12 @@ static void srp_process_rsp(struct srp_target_port *target, struct srp_rsp *rsp)
914
918
struct srp_request * req ;
915
919
struct scsi_cmnd * scmnd ;
916
920
unsigned long flags ;
917
- s32 delta ;
918
-
919
- delta = (s32 ) be32_to_cpu (rsp -> req_lim_delta );
920
-
921
- spin_lock_irqsave (target -> scsi_host -> host_lock , flags );
922
-
923
- target -> req_lim += delta ;
924
921
925
922
if (unlikely (rsp -> tag & SRP_TAG_TSK_MGMT )) {
923
+ spin_lock_irqsave (target -> scsi_host -> host_lock , flags );
924
+ target -> req_lim += be32_to_cpu (rsp -> req_lim_delta );
925
+ spin_unlock_irqrestore (target -> scsi_host -> host_lock , flags );
926
+
926
927
target -> tsk_mgmt_status = -1 ;
927
928
if (be32_to_cpu (rsp -> resp_data_len ) >= 4 )
928
929
target -> tsk_mgmt_status = rsp -> data [3 ];
@@ -948,12 +949,10 @@ static void srp_process_rsp(struct srp_target_port *target, struct srp_rsp *rsp)
948
949
else if (rsp -> flags & (SRP_RSP_FLAG_DIOVER | SRP_RSP_FLAG_DIUNDER ))
949
950
scsi_set_resid (scmnd , be32_to_cpu (rsp -> data_in_res_cnt ));
950
951
952
+ srp_remove_req (target , req , be32_to_cpu (rsp -> req_lim_delta ));
951
953
scmnd -> host_scribble = NULL ;
952
954
scmnd -> scsi_done (scmnd );
953
- srp_remove_req (target , req );
954
955
}
955
-
956
- spin_unlock_irqrestore (target -> scsi_host -> host_lock , flags );
957
956
}
958
957
959
958
static int srp_response_common (struct srp_target_port * target , s32 req_delta ,
@@ -1498,18 +1497,14 @@ static int srp_abort(struct scsi_cmnd *scmnd)
1498
1497
SRP_TSK_ABORT_TASK ))
1499
1498
return FAILED ;
1500
1499
1501
- spin_lock_irq (target -> scsi_host -> host_lock );
1502
-
1503
1500
if (req -> scmnd ) {
1504
1501
if (!target -> tsk_mgmt_status ) {
1505
- srp_remove_req (target , req );
1502
+ srp_remove_req (target , req , 0 );
1506
1503
scmnd -> result = DID_ABORT << 16 ;
1507
1504
} else
1508
1505
ret = FAILED ;
1509
1506
}
1510
1507
1511
- spin_unlock_irq (target -> scsi_host -> host_lock );
1512
-
1513
1508
return ret ;
1514
1509
}
1515
1510
@@ -1528,16 +1523,12 @@ static int srp_reset_device(struct scsi_cmnd *scmnd)
1528
1523
if (target -> tsk_mgmt_status )
1529
1524
return FAILED ;
1530
1525
1531
- spin_lock_irq (target -> scsi_host -> host_lock );
1532
-
1533
1526
for (i = 0 ; i < SRP_CMD_SQ_SIZE ; ++ i ) {
1534
1527
struct srp_request * req = & target -> req_ring [i ];
1535
1528
if (req -> scmnd && req -> scmnd -> device == scmnd -> device )
1536
1529
srp_reset_req (target , req );
1537
1530
}
1538
1531
1539
- spin_unlock_irq (target -> scsi_host -> host_lock );
1540
-
1541
1532
return SUCCESS ;
1542
1533
}
1543
1534
0 commit comments