diff options
Diffstat (limited to 'drivers/scsi/scsi_transport_fc.c')
| -rw-r--r-- | drivers/scsi/scsi_transport_fc.c | 30 | 
1 files changed, 9 insertions, 21 deletions
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 28c33506e4a..1b214910b71 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c @@ -422,8 +422,7 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev,  	snprintf(fc_host->work_q_name, sizeof(fc_host->work_q_name),  		 "fc_wq_%d", shost->host_no); -	fc_host->work_q = create_singlethread_workqueue( -					fc_host->work_q_name); +	fc_host->work_q = alloc_workqueue(fc_host->work_q_name, 0, 0);  	if (!fc_host->work_q)  		return -ENOMEM; @@ -431,8 +430,8 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev,  	snprintf(fc_host->devloss_work_q_name,  		 sizeof(fc_host->devloss_work_q_name),  		 "fc_dl_%d", shost->host_no); -	fc_host->devloss_work_q = create_singlethread_workqueue( -					fc_host->devloss_work_q_name); +	fc_host->devloss_work_q = +			alloc_workqueue(fc_host->devloss_work_q_name, 0, 0);  	if (!fc_host->devloss_work_q) {  		destroy_workqueue(fc_host->work_q);  		fc_host->work_q = NULL; @@ -2489,6 +2488,8 @@ fc_rport_final_delete(struct work_struct *work)  	unsigned long flags;  	int do_callback = 0; +	fc_terminate_rport_io(rport); +  	/*  	 * if a scan is pending, flush the SCSI Host work_q so that  	 * that we can reclaim the rport scan work element. @@ -2496,8 +2497,6 @@ fc_rport_final_delete(struct work_struct *work)  	if (rport->flags & FC_RPORT_SCAN_PENDING)  		scsi_flush_work(shost); -	fc_terminate_rport_io(rport); -  	/*  	 * Cancel any outstanding timers. These should really exist  	 * only when rmmod'ing the LLDD and we're asking for @@ -3816,28 +3815,17 @@ fail_host_msg:  static void  fc_bsg_goose_queue(struct fc_rport *rport)  { -	int flagset; -	unsigned long flags; -  	if (!rport->rqst_q)  		return; +	/* +	 * This get/put dance makes no sense +	 */  	get_device(&rport->dev); - -	spin_lock_irqsave(rport->rqst_q->queue_lock, flags); -	flagset = test_bit(QUEUE_FLAG_REENTER, &rport->rqst_q->queue_flags) && -		  !test_bit(QUEUE_FLAG_REENTER, &rport->rqst_q->queue_flags); -	if (flagset) -		queue_flag_set(QUEUE_FLAG_REENTER, rport->rqst_q); -	__blk_run_queue(rport->rqst_q); -	if (flagset) -		queue_flag_clear(QUEUE_FLAG_REENTER, rport->rqst_q); -	spin_unlock_irqrestore(rport->rqst_q->queue_lock, flags); - +	blk_run_queue_async(rport->rqst_q);  	put_device(&rport->dev);  } -  /**   * fc_bsg_rport_dispatch - process rport bsg requests and dispatch to LLDD   * @q:		rport request queue  |