[PATCH] don't mess with file in scsi_nonblockable_ioctl()
Al Viro [Sun, 2 Mar 2008 13:15:49 +0000 (08:15 -0500)]
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

drivers/scsi/scsi_ioctl.c
drivers/scsi/sd.c
drivers/scsi/sr.c
drivers/scsi/st.c
include/scsi/scsi_ioctl.h

index 1f08f5a..dc1cfb2 100644 (file)
@@ -277,14 +277,14 @@ EXPORT_SYMBOL(scsi_ioctl);
  * @filp: either NULL or a &struct file which must have the O_NONBLOCK flag.
  */
 int scsi_nonblockable_ioctl(struct scsi_device *sdev, int cmd,
-                           void __user *arg, struct file *filp)
+                           void __user *arg, int ndelay)
 {
        int val, result;
 
        /* The first set of iocts may be executed even if we're doing
         * error processing, as long as the device was opened
         * non-blocking */
-       if (filp && (filp->f_flags & O_NONBLOCK)) {
+       if (ndelay) {
                if (scsi_host_in_recovery(sdev->host))
                        return -ENODEV;
        } else if (!scsi_block_when_processing_errors(sdev))
index 5d74413..5a18528 100644 (file)
@@ -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
         * 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)
                return error;
 
index b92e2da..2fb8d4d 100644 (file)
@@ -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
         * 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)
                return ret;
        return scsi_ioctl(sdev, cmd, argp);
index 8dffac9..c959bdc 100644 (file)
@@ -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
         * 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)
                goto out;
        retval = 0;
index edb9525..b900684 100644 (file)
@@ -42,7 +42,7 @@ typedef struct scsi_fctargaddress {
 
 extern int scsi_ioctl(struct scsi_device *, int, void __user *);
 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 /* _SCSI_IOCTL_H */