diff options
Diffstat (limited to 'drivers/s390/cio/device_ops.c')
| -rw-r--r-- | drivers/s390/cio/device_ops.c | 20 | 
1 files changed, 15 insertions, 5 deletions
diff --git a/drivers/s390/cio/device_ops.c b/drivers/s390/cio/device_ops.c index f98698d5735..ec7fb6d3b47 100644 --- a/drivers/s390/cio/device_ops.c +++ b/drivers/s390/cio/device_ops.c @@ -198,7 +198,7 @@ int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa,  	if (cdev->private->state == DEV_STATE_VERIFY) {  		/* Remember to fake irb when finished. */  		if (!cdev->private->flags.fake_irb) { -			cdev->private->flags.fake_irb = 1; +			cdev->private->flags.fake_irb = FAKE_CMD_IRB;  			cdev->private->intparm = intparm;  			return 0;  		} else @@ -213,9 +213,9 @@ int ccw_device_start_key(struct ccw_device *cdev, struct ccw1 *cpa,  	ret = cio_set_options (sch, flags);  	if (ret)  		return ret; -	/* Adjust requested path mask to excluded varied off paths. */ +	/* Adjust requested path mask to exclude unusable paths. */  	if (lpm) { -		lpm &= sch->opm; +		lpm &= sch->lpm;  		if (lpm == 0)  			return -EACCES;  	} @@ -605,11 +605,21 @@ int ccw_device_tm_start_key(struct ccw_device *cdev, struct tcw *tcw,  	sch = to_subchannel(cdev->dev.parent);  	if (!sch->schib.pmcw.ena)  		return -EINVAL; +	if (cdev->private->state == DEV_STATE_VERIFY) { +		/* Remember to fake irb when finished. */ +		if (!cdev->private->flags.fake_irb) { +			cdev->private->flags.fake_irb = FAKE_TM_IRB; +			cdev->private->intparm = intparm; +			return 0; +		} else +			/* There's already a fake I/O around. */ +			return -EBUSY; +	}  	if (cdev->private->state != DEV_STATE_ONLINE)  		return -EIO; -	/* Adjust requested path mask to excluded varied off paths. */ +	/* Adjust requested path mask to exclude unusable paths. */  	if (lpm) { -		lpm &= sch->opm; +		lpm &= sch->lpm;  		if (lpm == 0)  			return -EACCES;  	}  |