@@ -1862,12 +1862,11 @@ static void __srpt_close_ch(struct srpt_rdma_ch *ch)
18621862 */
18631863static void srpt_close_ch (struct srpt_rdma_ch * ch )
18641864{
1865- struct srpt_device * sdev ;
1865+ struct srpt_device * sdev = ch -> sport -> sdev ;
18661866
1867- sdev = ch -> sport -> sdev ;
1868- spin_lock_irq (& sdev -> spinlock );
1867+ mutex_lock (& sdev -> mutex );
18691868 __srpt_close_ch (ch );
1870- spin_unlock_irq (& sdev -> spinlock );
1869+ mutex_unlock (& sdev -> mutex );
18711870}
18721871
18731872/**
@@ -1954,11 +1953,11 @@ static void srpt_release_channel_work(struct work_struct *w)
19541953 ch -> sport -> sdev , ch -> rq_size ,
19551954 ch -> rsp_size , DMA_TO_DEVICE );
19561955
1957- spin_lock_irq (& sdev -> spinlock );
1956+ mutex_lock (& sdev -> mutex );
19581957 list_del_init (& ch -> list );
19591958 if (ch -> release_done )
19601959 complete (ch -> release_done );
1961- spin_unlock_irq (& sdev -> spinlock );
1960+ mutex_unlock (& sdev -> mutex );
19621961
19631962 wake_up (& sdev -> ch_releaseQ );
19641963
@@ -2039,7 +2038,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
20392038 if ((req -> req_flags & SRP_MTCH_ACTION ) == SRP_MULTICHAN_SINGLE ) {
20402039 rsp -> rsp_flags = SRP_LOGIN_RSP_MULTICHAN_NO_CHAN ;
20412040
2042- spin_lock_irq (& sdev -> spinlock );
2041+ mutex_lock (& sdev -> mutex );
20432042
20442043 list_for_each_entry_safe (ch , tmp_ch , & sdev -> rch_list , list ) {
20452044 if (!memcmp (ch -> i_port_id , req -> initiator_port_id , 16 )
@@ -2063,7 +2062,7 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
20632062 }
20642063 }
20652064
2066- spin_unlock_irq (& sdev -> spinlock );
2065+ mutex_unlock (& sdev -> mutex );
20672066
20682067 } else
20692068 rsp -> rsp_flags = SRP_LOGIN_RSP_MULTICHAN_MAINTAINED ;
@@ -2208,9 +2207,9 @@ static int srpt_cm_req_recv(struct ib_cm_id *cm_id,
22082207 goto release_channel ;
22092208 }
22102209
2211- spin_lock_irq (& sdev -> spinlock );
2210+ mutex_lock (& sdev -> mutex );
22122211 list_add_tail (& ch -> list , & sdev -> rch_list );
2213- spin_unlock_irq (& sdev -> spinlock );
2212+ mutex_unlock (& sdev -> mutex );
22142213
22152214 goto out ;
22162215
@@ -2653,17 +2652,6 @@ static void srpt_refresh_port_work(struct work_struct *work)
26532652 srpt_refresh_port (sport );
26542653}
26552654
2656- static int srpt_ch_list_empty (struct srpt_device * sdev )
2657- {
2658- int res ;
2659-
2660- spin_lock_irq (& sdev -> spinlock );
2661- res = list_empty (& sdev -> rch_list );
2662- spin_unlock_irq (& sdev -> spinlock );
2663-
2664- return res ;
2665- }
2666-
26672655/**
26682656 * srpt_release_sdev() - Free the channel resources associated with a target.
26692657 */
@@ -2676,13 +2664,13 @@ static int srpt_release_sdev(struct srpt_device *sdev)
26762664
26772665 BUG_ON (!sdev );
26782666
2679- spin_lock_irq (& sdev -> spinlock );
2667+ mutex_lock (& sdev -> mutex );
26802668 list_for_each_entry_safe (ch , tmp_ch , & sdev -> rch_list , list )
26812669 __srpt_close_ch (ch );
2682- spin_unlock_irq (& sdev -> spinlock );
2670+ mutex_unlock (& sdev -> mutex );
26832671
26842672 res = wait_event_interruptible (sdev -> ch_releaseQ ,
2685- srpt_ch_list_empty ( sdev ));
2673+ list_empty_careful ( & sdev -> rch_list ));
26862674 if (res )
26872675 pr_err ("%s: interrupted.\n" , __func__ );
26882676
@@ -2743,7 +2731,7 @@ static void srpt_add_one(struct ib_device *device)
27432731 sdev -> device = device ;
27442732 INIT_LIST_HEAD (& sdev -> rch_list );
27452733 init_waitqueue_head (& sdev -> ch_releaseQ );
2746- spin_lock_init (& sdev -> spinlock );
2734+ mutex_init (& sdev -> mutex );
27472735
27482736 sdev -> pd = ib_alloc_pd (device );
27492737 if (IS_ERR (sdev -> pd ))
@@ -2971,12 +2959,12 @@ static void srpt_close_session(struct se_session *se_sess)
29712959 pr_debug ("ch %s-%d state %d\n" , ch -> sess_name , ch -> qp -> qp_num ,
29722960 ch -> state );
29732961
2974- spin_lock_irq (& sdev -> spinlock );
2962+ mutex_lock (& sdev -> mutex );
29752963 BUG_ON (ch -> release_done );
29762964 ch -> release_done = & release_done ;
29772965 wait = !list_empty (& ch -> list );
29782966 __srpt_close_ch (ch );
2979- spin_unlock_irq (& sdev -> spinlock );
2967+ mutex_unlock (& sdev -> mutex );
29802968
29812969 if (!wait )
29822970 return ;
0 commit comments