@@ -85,6 +85,8 @@ static void cm_add_one(struct ib_device *device);
85
85
static void cm_remove_one (struct ib_device * device , void * client_data );
86
86
static int cm_send_dreq_locked (struct cm_id_private * cm_id_priv ,
87
87
const void * private_data , u8 private_data_len );
88
+ static int cm_send_drep_locked (struct cm_id_private * cm_id_priv ,
89
+ void * private_data , u8 private_data_len );
88
90
89
91
static struct ib_client cm_client = {
90
92
.name = "cm" ,
@@ -1100,8 +1102,8 @@ static void cm_destroy_id(struct ib_cm_id *cm_id, int err)
1100
1102
spin_unlock_irq (& cm_id_priv -> lock );
1101
1103
break ;
1102
1104
case IB_CM_DREQ_RCVD :
1105
+ cm_send_drep_locked (cm_id_priv , NULL , 0 );
1103
1106
spin_unlock_irq (& cm_id_priv -> lock );
1104
- ib_send_cm_drep (cm_id , NULL , 0 );
1105
1107
break ;
1106
1108
default :
1107
1109
spin_unlock_irq (& cm_id_priv -> lock );
@@ -2685,51 +2687,60 @@ static void cm_format_drep(struct cm_drep_msg *drep_msg,
2685
2687
private_data_len );
2686
2688
}
2687
2689
2688
- int ib_send_cm_drep (struct ib_cm_id * cm_id ,
2689
- const void * private_data ,
2690
- u8 private_data_len )
2690
+ static int cm_send_drep_locked (struct cm_id_private * cm_id_priv ,
2691
+ void * private_data , u8 private_data_len )
2691
2692
{
2692
- struct cm_id_private * cm_id_priv ;
2693
2693
struct ib_mad_send_buf * msg ;
2694
- unsigned long flags ;
2695
- void * data ;
2696
2694
int ret ;
2697
2695
2696
+ lockdep_assert_held (& cm_id_priv -> lock );
2697
+
2698
2698
if (private_data && private_data_len > IB_CM_DREP_PRIVATE_DATA_SIZE )
2699
2699
return - EINVAL ;
2700
2700
2701
- data = cm_copy_private_data (private_data , private_data_len );
2702
- if (IS_ERR (data ))
2703
- return PTR_ERR (data );
2704
-
2705
- cm_id_priv = container_of (cm_id , struct cm_id_private , id );
2706
- spin_lock_irqsave (& cm_id_priv -> lock , flags );
2707
- if (cm_id -> state != IB_CM_DREQ_RCVD ) {
2708
- pr_debug ("%s: local_id %d, cm_idcm_id->state(%d) != IB_CM_DREQ_RCVD\n" ,
2709
- __func__ , be32_to_cpu (cm_id -> local_id ), cm_id -> state );
2710
- spin_unlock_irqrestore (& cm_id_priv -> lock , flags );
2711
- kfree (data );
2701
+ if (cm_id_priv -> id .state != IB_CM_DREQ_RCVD ) {
2702
+ pr_debug (
2703
+ "%s: local_id %d, cm_idcm_id->state(%d) != IB_CM_DREQ_RCVD\n" ,
2704
+ __func__ , be32_to_cpu (cm_id_priv -> id .local_id ),
2705
+ cm_id_priv -> id .state );
2706
+ kfree (private_data );
2712
2707
return - EINVAL ;
2713
2708
}
2714
2709
2715
- cm_set_private_data (cm_id_priv , data , private_data_len );
2710
+ cm_set_private_data (cm_id_priv , private_data , private_data_len );
2716
2711
cm_enter_timewait (cm_id_priv );
2717
2712
2718
2713
ret = cm_alloc_msg (cm_id_priv , & msg );
2719
2714
if (ret )
2720
- goto out ;
2715
+ return ret ;
2721
2716
2722
2717
cm_format_drep ((struct cm_drep_msg * ) msg -> mad , cm_id_priv ,
2723
2718
private_data , private_data_len );
2724
2719
2725
2720
ret = ib_post_send_mad (msg , NULL );
2726
2721
if (ret ) {
2727
- spin_unlock_irqrestore (& cm_id_priv -> lock , flags );
2728
2722
cm_free_msg (msg );
2729
2723
return ret ;
2730
2724
}
2725
+ return 0 ;
2726
+ }
2731
2727
2732
- out : spin_unlock_irqrestore (& cm_id_priv -> lock , flags );
2728
+ int ib_send_cm_drep (struct ib_cm_id * cm_id , const void * private_data ,
2729
+ u8 private_data_len )
2730
+ {
2731
+ struct cm_id_private * cm_id_priv =
2732
+ container_of (cm_id , struct cm_id_private , id );
2733
+ unsigned long flags ;
2734
+ void * data ;
2735
+ int ret ;
2736
+
2737
+ data = cm_copy_private_data (private_data , private_data_len );
2738
+ if (IS_ERR (data ))
2739
+ return PTR_ERR (data );
2740
+
2741
+ spin_lock_irqsave (& cm_id_priv -> lock , flags );
2742
+ ret = cm_send_drep_locked (cm_id_priv , data , private_data_len );
2743
+ spin_unlock_irqrestore (& cm_id_priv -> lock , flags );
2733
2744
return ret ;
2734
2745
}
2735
2746
EXPORT_SYMBOL (ib_send_cm_drep );
0 commit comments