diff options
| author | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 11:59:37 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <tglx@linutronix.de> | 2010-05-10 14:20:42 +0200 | 
| commit | dbb6be6d5e974c42bbecd183effaa0df69e1dd8b (patch) | |
| tree | 5735cb47e70853d057a9881dd0ce44b83e88fa63 /drivers/scsi/scsi_transport_fc.c | |
| parent | 6a867a395558a7f882d041783e4cdea6744ca2bf (diff) | |
| parent | b57f95a38233a2e73b679bea4a5453a1cc2a1cc9 (diff) | |
| download | olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.tar.xz olio-linux-3.10-dbb6be6d5e974c42bbecd183effaa0df69e1dd8b.zip  | |
Merge branch 'linus' into timers/core
Reason: Further posix_cpu_timer patches depend on mainline changes
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'drivers/scsi/scsi_transport_fc.c')
| -rw-r--r-- | drivers/scsi/scsi_transport_fc.c | 29 | 
1 files changed, 15 insertions, 14 deletions
diff --git a/drivers/scsi/scsi_transport_fc.c b/drivers/scsi/scsi_transport_fc.c index 79660ee3e21..6cfffc88022 100644 --- a/drivers/scsi/scsi_transport_fc.c +++ b/drivers/scsi/scsi_transport_fc.c @@ -27,6 +27,7 @@   */  #include <linux/module.h>  #include <linux/init.h> +#include <linux/slab.h>  #include <linux/delay.h>  #include <scsi/scsi_device.h>  #include <scsi/scsi_host.h> @@ -1232,6 +1233,15 @@ store_fc_vport_delete(struct device *dev, struct device_attribute *attr,  {  	struct fc_vport *vport = transport_class_to_vport(dev);  	struct Scsi_Host *shost = vport_to_shost(vport); +	unsigned long flags; + +	spin_lock_irqsave(shost->host_lock, flags); +	if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)) { +		spin_unlock_irqrestore(shost->host_lock, flags); +		return -EBUSY; +	} +	vport->flags |= FC_VPORT_DELETING; +	spin_unlock_irqrestore(shost->host_lock, flags);  	fc_queue_work(shost, &vport->vport_delete_work);  	return count; @@ -1821,6 +1831,9 @@ store_fc_host_vport_delete(struct device *dev, struct device_attribute *attr,  	list_for_each_entry(vport, &fc_host->vports, peers) {  		if ((vport->channel == 0) &&  		    (vport->port_name == wwpn) && (vport->node_name == wwnn)) { +			if (vport->flags & (FC_VPORT_DEL | FC_VPORT_CREATING)) +				break; +			vport->flags |= FC_VPORT_DELETING;  			match = 1;  			break;  		} @@ -3370,18 +3383,6 @@ fc_vport_terminate(struct fc_vport *vport)  	unsigned long flags;  	int stat; -	spin_lock_irqsave(shost->host_lock, flags); -	if (vport->flags & FC_VPORT_CREATING) { -		spin_unlock_irqrestore(shost->host_lock, flags); -		return -EBUSY; -	} -	if (vport->flags & (FC_VPORT_DEL)) { -		spin_unlock_irqrestore(shost->host_lock, flags); -		return -EALREADY; -	} -	vport->flags |= FC_VPORT_DELETING; -	spin_unlock_irqrestore(shost->host_lock, flags); -  	if (i->f->vport_delete)  		stat = i->f->vport_delete(vport);  	else @@ -3852,7 +3853,7 @@ fc_bsg_request_handler(struct request_queue *q, struct Scsi_Host *shost,  		if (rport && (rport->port_state != FC_PORTSTATE_ONLINE)) {  			req->errors = -ENXIO;  			spin_unlock_irq(q->queue_lock); -			blk_end_request(req, -ENXIO, blk_rq_bytes(req)); +			blk_end_request_all(req, -ENXIO);  			spin_lock_irq(q->queue_lock);  			continue;  		} @@ -3862,7 +3863,7 @@ fc_bsg_request_handler(struct request_queue *q, struct Scsi_Host *shost,  		ret = fc_req_to_bsgjob(shost, rport, req);  		if (ret) {  			req->errors = ret; -			blk_end_request(req, ret, blk_rq_bytes(req)); +			blk_end_request_all(req, ret);  			spin_lock_irq(q->queue_lock);  			continue;  		}  |