Commit 83ff6fe8 authored by Al Viro's avatar Al Viro

[PATCH] don't mess with file in scsi_nonblockable_ioctl()

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 633a08b8
...@@ -277,14 +277,14 @@ EXPORT_SYMBOL(scsi_ioctl); ...@@ -277,14 +277,14 @@ EXPORT_SYMBOL(scsi_ioctl);
* @filp: either NULL or a &struct file which must have the O_NONBLOCK flag. * @filp: either NULL or a &struct file which must have the O_NONBLOCK flag.
*/ */
int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd, int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd,
void __user *arg, struct file *filp) void __user *arg, int ndelay)
{ {
int val, result; int val, result;
/* The first set of iocts may be executed even if we're doing /* The first set of iocts may be executed even if we're doing
* error processing, as long as the device was opened * error processing, as long as the device was opened
* non-blocking */ * non-blocking */
if (filp && (filp->f_flags & O_NONBLOCK)) { if (ndelay) {
if (scsi_host_in_recovery(sdev->host)) if (scsi_host_in_recovery(sdev->host))
return -ENODEV; return -ENODEV;
} else if (!scsi_block_when_processing_errors(sdev)) } else if (!scsi_block_when_processing_errors(sdev))
......
...@@ -761,7 +761,8 @@ static int sd_ioctl(struct inode * inode, struct file * filp, ...@@ -761,7 +761,8 @@ static int sd_ioctl(struct inode * inode, struct file * filp,
* may try and take the device offline, in which case all further * may try and take the device offline, in which case all further
* access to the device is prohibited. * access to the device is prohibited.
*/ */
error = scsi_nonblockable_ioctl(sdp, cmd, p, filp); error = scsi_nonblockable_ioctl(sdp, cmd, p,
filp ? filp->f_flags & O_NDELAY : 0);
if (!scsi_block_when_processing_errors(sdp) || !error) if (!scsi_block_when_processing_errors(sdp) || !error)
return error; return error;
......
...@@ -524,7 +524,8 @@ static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd, ...@@ -524,7 +524,8 @@ static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd,
* case fall through to scsi_ioctl, which will return ENDOEV again * case fall through to scsi_ioctl, which will return ENDOEV again
* if it doesn't recognise the ioctl * if it doesn't recognise the ioctl
*/ */
ret = scsi_nonblockable_ioctl(sdev, cmd, argp, NULL); ret = scsi_nonblockable_ioctl(sdev, cmd, argp,
file ? file->f_flags & O_NDELAY : 0);
if (ret != -ENODEV) if (ret != -ENODEV)
return ret; return ret;
return scsi_ioctl(sdev, cmd, argp); return scsi_ioctl(sdev, cmd, argp);
......
...@@ -3263,7 +3263,8 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg) ...@@ -3263,7 +3263,8 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
* may try and take the device offline, in which case all further * may try and take the device offline, in which case all further
* access to the device is prohibited. * access to the device is prohibited.
*/ */
retval = scsi_nonblockable_ioctl(STp->device, cmd_in, p, file); retval = scsi_nonblockable_ioctl(STp->device, cmd_in, p,
file->f_flags & O_NDELAY);
if (!scsi_block_when_processing_errors(STp->device) || retval != -ENODEV) if (!scsi_block_when_processing_errors(STp->device) || retval != -ENODEV)
goto out; goto out;
retval = 0; retval = 0;
......
...@@ -42,7 +42,7 @@ typedef struct scsi_fctargaddress { ...@@ -42,7 +42,7 @@ typedef struct scsi_fctargaddress {
extern int scsi_ioctl(struct scsi_device *, int, void __user *); extern int scsi_ioctl(struct scsi_device *, int, void __user *);
extern int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd, extern int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd,
void __user *arg, struct file *filp); void __user *arg, int ndelay);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _SCSI_IOCTL_H */ #endif /* _SCSI_IOCTL_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment