summary refs log tree commit diff
path: root/drivers/scsi/ch.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2014-10-11 16:25:31 +0200
committerChristoph Hellwig <hch@lst.de>2014-11-12 11:16:11 +0100
commit906d15fbd23c1267addab361063c1c8119992215 (patch)
tree419ba148925c3651fe9337af24a932097e2c3d8a /drivers/scsi/ch.c
parent176aa9d6ee2db582e7e856dbe1983004a82869b4 (diff)
downloadlinux-906d15fbd23c1267addab361063c1c8119992215.tar.gz
scsi: split scsi_nonblockable_ioctl
The calling conventions for this function are bad as it could return
-ENODEV both for a device not currently online and a not recognized ioctl.

Add a new scsi_ioctl_block_when_processing_errors function that wraps
scsi_block_when_processing_errors with the a special case for the
SG_SCSI_RESET ioctl command, and handle the SG_SCSI_RESET case itself
in scsi_ioctl.  All callers of scsi_ioctl now must call the above helper
to check for the EH state, so that the ioctl handler itself doesn't
have to.

Reported-by: Robert Elliott <Elliott@hp.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Diffstat (limited to 'drivers/scsi/ch.c')
-rw-r--r--drivers/scsi/ch.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/scsi/ch.c b/drivers/scsi/ch.c
index 226ef771efff..4f502f95f3b8 100644
--- a/drivers/scsi/ch.c
+++ b/drivers/scsi/ch.c
@@ -616,6 +616,11 @@ static long ch_ioctl(struct file *file,
 	int retval;
 	void __user *argp = (void __user *)arg;
 
+	retval = scsi_ioctl_block_when_processing_errors(ch->device, cmd,
+			file->f_flags & O_NDELAY);
+	if (retval)
+		return retval;
+
 	switch (cmd) {
 	case CHIOGPARAMS:
 	{