Commit fd4ce1ac authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Al Viro

[PATCH 1/2] kill FMODE_NDELAY_NOW

Update FMODE_NDELAY before each ioctl call so that we can kill the
magic FMODE_NDELAY_NOW.  It would be even better to do this directly
in setfl(), but for that we'd need to have FMODE_NDELAY for all files,
not just block special files.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent ebbefc01
...@@ -722,8 +722,14 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) ...@@ -722,8 +722,14 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
struct backing_dev_info *bdi; struct backing_dev_info *bdi;
loff_t size; loff_t size;
/*
* O_NDELAY can be altered using fcntl(.., F_SETFL, ..), so we have
* to updated it before every ioctl.
*/
if (file->f_flags & O_NDELAY) if (file->f_flags & O_NDELAY)
mode |= FMODE_NDELAY_NOW; mode |= FMODE_NDELAY;
else
mode &= ~FMODE_NDELAY;
switch (cmd) { switch (cmd) {
case HDIO_GETGEO: case HDIO_GETGEO:
......
...@@ -757,7 +757,7 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -757,7 +757,7 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode,
* access to the device is prohibited. * access to the device is prohibited.
*/ */
error = scsi_nonblockable_ioctl(sdp, cmd, p, error = scsi_nonblockable_ioctl(sdp, cmd, p,
(mode & FMODE_NDELAY_NOW) != 0); (mode & FMODE_NDELAY) != 0);
if (!scsi_block_when_processing_errors(sdp) || !error) if (!scsi_block_when_processing_errors(sdp) || !error)
return error; return error;
......
...@@ -521,7 +521,7 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, ...@@ -521,7 +521,7 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
* if it doesn't recognise the ioctl * if it doesn't recognise the ioctl
*/ */
ret = scsi_nonblockable_ioctl(sdev, cmd, argp, ret = scsi_nonblockable_ioctl(sdev, cmd, argp,
(mode & FMODE_NDELAY_NOW) != 0); (mode & FMODE_NDELAY) != 0);
if (ret != -ENODEV) if (ret != -ENODEV)
return ret; return ret;
return scsi_ioctl(sdev, cmd, argp); return scsi_ioctl(sdev, cmd, argp);
......
...@@ -1206,8 +1206,16 @@ static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg) ...@@ -1206,8 +1206,16 @@ static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg)
{ {
struct block_device *bdev = I_BDEV(file->f_mapping->host); struct block_device *bdev = I_BDEV(file->f_mapping->host);
fmode_t mode = file->f_mode; fmode_t mode = file->f_mode;
/*
* O_NDELAY can be altered using fcntl(.., F_SETFL, ..), so we have
* to updated it before every ioctl.
*/
if (file->f_flags & O_NDELAY) if (file->f_flags & O_NDELAY)
mode |= FMODE_NDELAY_NOW; mode |= FMODE_NDELAY;
else
mode &= ~FMODE_NDELAY;
return blkdev_ioctl(bdev, mode, cmd, arg); return blkdev_ioctl(bdev, mode, cmd, arg);
} }
......
...@@ -79,7 +79,6 @@ extern int dir_notify_enable; ...@@ -79,7 +79,6 @@ extern int dir_notify_enable;
#define FMODE_NDELAY ((__force fmode_t)32) #define FMODE_NDELAY ((__force fmode_t)32)
#define FMODE_EXCL ((__force fmode_t)64) #define FMODE_EXCL ((__force fmode_t)64)
#define FMODE_WRITE_IOCTL ((__force fmode_t)128) #define FMODE_WRITE_IOCTL ((__force fmode_t)128)
#define FMODE_NDELAY_NOW ((__force fmode_t)256)
#define RW_MASK 1 #define RW_MASK 1
#define RWA_MASK 2 #define RWA_MASK 2
......
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