@@ -463,13 +463,7 @@ static void fc_exch_delete(struct fc_exch *ep)
463
463
fc_exch_release (ep ); /* drop hold for exch in mp */
464
464
}
465
465
466
- /**
467
- * fc_seq_send() - Send a frame using existing sequence/exchange pair
468
- * @lport: The local port that the exchange will be sent on
469
- * @sp: The sequence to be sent
470
- * @fp: The frame to be sent on the exchange
471
- */
472
- static int fc_seq_send (struct fc_lport * lport , struct fc_seq * sp ,
466
+ static int fc_seq_send_locked (struct fc_lport * lport , struct fc_seq * sp ,
473
467
struct fc_frame * fp )
474
468
{
475
469
struct fc_exch * ep ;
@@ -479,7 +473,7 @@ static int fc_seq_send(struct fc_lport *lport, struct fc_seq *sp,
479
473
u8 fh_type = fh -> fh_type ;
480
474
481
475
ep = fc_seq_exch (sp );
482
- WARN_ON ((ep -> esb_stat & ESB_ST_SEQ_INIT ) != ESB_ST_SEQ_INIT );
476
+ WARN_ON (! (ep -> esb_stat & ESB_ST_SEQ_INIT ));
483
477
484
478
f_ctl = ntoh24 (fh -> fh_f_ctl );
485
479
fc_exch_setup_hdr (ep , fp , f_ctl );
@@ -502,17 +496,34 @@ static int fc_seq_send(struct fc_lport *lport, struct fc_seq *sp,
502
496
error = lport -> tt .frame_send (lport , fp );
503
497
504
498
if (fh_type == FC_TYPE_BLS )
505
- return error ;
499
+ goto out ;
506
500
507
501
/*
508
502
* Update the exchange and sequence flags,
509
503
* assuming all frames for the sequence have been sent.
510
504
* We can only be called to send once for each sequence.
511
505
*/
512
- spin_lock_bh (& ep -> ex_lock );
513
506
ep -> f_ctl = f_ctl & ~FC_FC_FIRST_SEQ ; /* not first seq */
514
507
if (f_ctl & FC_FC_SEQ_INIT )
515
508
ep -> esb_stat &= ~ESB_ST_SEQ_INIT ;
509
+ out :
510
+ return error ;
511
+ }
512
+
513
+ /**
514
+ * fc_seq_send() - Send a frame using existing sequence/exchange pair
515
+ * @lport: The local port that the exchange will be sent on
516
+ * @sp: The sequence to be sent
517
+ * @fp: The frame to be sent on the exchange
518
+ */
519
+ static int fc_seq_send (struct fc_lport * lport , struct fc_seq * sp ,
520
+ struct fc_frame * fp )
521
+ {
522
+ struct fc_exch * ep ;
523
+ int error ;
524
+ ep = fc_seq_exch (sp );
525
+ spin_lock_bh (& ep -> ex_lock );
526
+ error = fc_seq_send_locked (lport , sp , fp );
516
527
spin_unlock_bh (& ep -> ex_lock );
517
528
return error ;
518
529
}
@@ -629,7 +640,7 @@ static int fc_exch_abort_locked(struct fc_exch *ep,
629
640
if (fp ) {
630
641
fc_fill_fc_hdr (fp , FC_RCTL_BA_ABTS , ep -> did , ep -> sid ,
631
642
FC_TYPE_BLS , FC_FC_END_SEQ | FC_FC_SEQ_INIT , 0 );
632
- error = fc_seq_send (ep -> lp , sp , fp );
643
+ error = fc_seq_send_locked (ep -> lp , sp , fp );
633
644
} else
634
645
error = - ENOBUFS ;
635
646
return error ;
@@ -1132,7 +1143,7 @@ static void fc_seq_send_last(struct fc_seq *sp, struct fc_frame *fp,
1132
1143
f_ctl = FC_FC_LAST_SEQ | FC_FC_END_SEQ | FC_FC_SEQ_INIT ;
1133
1144
f_ctl |= ep -> f_ctl ;
1134
1145
fc_fill_fc_hdr (fp , rctl , ep -> did , ep -> sid , fh_type , f_ctl , 0 );
1135
- fc_seq_send (ep -> lp , sp , fp );
1146
+ fc_seq_send_locked (ep -> lp , sp , fp );
1136
1147
}
1137
1148
1138
1149
/**
@@ -1307,8 +1318,8 @@ static void fc_exch_recv_abts(struct fc_exch *ep, struct fc_frame *rx_fp)
1307
1318
ap -> ba_low_seq_cnt = htons (sp -> cnt );
1308
1319
}
1309
1320
sp = fc_seq_start_next_locked (sp );
1310
- spin_unlock_bh (& ep -> ex_lock );
1311
1321
fc_seq_send_last (sp , fp , FC_RCTL_BA_ACC , FC_TYPE_BLS );
1322
+ spin_unlock_bh (& ep -> ex_lock );
1312
1323
fc_frame_free (rx_fp );
1313
1324
return ;
1314
1325
0 commit comments