[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: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

authored by Christoph Hellwig and committed by Al Viro fd4ce1ac ebbefc01

+18 -5
+7 -1
block/compat_ioctl.c
··· 722 struct backing_dev_info *bdi; 723 loff_t size; 724 725 if (file->f_flags & O_NDELAY) 726 - mode |= FMODE_NDELAY_NOW; 727 728 switch (cmd) { 729 case HDIO_GETGEO:
··· 722 struct backing_dev_info *bdi; 723 loff_t size; 724 725 + /* 726 + * O_NDELAY can be altered using fcntl(.., F_SETFL, ..), so we have 727 + * to updated it before every ioctl. 728 + */ 729 if (file->f_flags & O_NDELAY) 730 + mode |= FMODE_NDELAY; 731 + else 732 + mode &= ~FMODE_NDELAY; 733 734 switch (cmd) { 735 case HDIO_GETGEO:
+1 -1
drivers/scsi/sd.c
··· 757 * access to the device is prohibited. 758 */ 759 error = scsi_nonblockable_ioctl(sdp, cmd, p, 760 - (mode & FMODE_NDELAY_NOW) != 0); 761 if (!scsi_block_when_processing_errors(sdp) || !error) 762 return error; 763
··· 757 * access to the device is prohibited. 758 */ 759 error = scsi_nonblockable_ioctl(sdp, cmd, p, 760 + (mode & FMODE_NDELAY) != 0); 761 if (!scsi_block_when_processing_errors(sdp) || !error) 762 return error; 763
+1 -1
drivers/scsi/sr.c
··· 521 * if it doesn't recognise the ioctl 522 */ 523 ret = scsi_nonblockable_ioctl(sdev, cmd, argp, 524 - (mode & FMODE_NDELAY_NOW) != 0); 525 if (ret != -ENODEV) 526 return ret; 527 return scsi_ioctl(sdev, cmd, argp);
··· 521 * if it doesn't recognise the ioctl 522 */ 523 ret = scsi_nonblockable_ioctl(sdev, cmd, argp, 524 + (mode & FMODE_NDELAY) != 0); 525 if (ret != -ENODEV) 526 return ret; 527 return scsi_ioctl(sdev, cmd, argp);
+9 -1
fs/block_dev.c
··· 1206 { 1207 struct block_device *bdev = I_BDEV(file->f_mapping->host); 1208 fmode_t mode = file->f_mode; 1209 if (file->f_flags & O_NDELAY) 1210 - mode |= FMODE_NDELAY_NOW; 1211 return blkdev_ioctl(bdev, mode, cmd, arg); 1212 } 1213
··· 1206 { 1207 struct block_device *bdev = I_BDEV(file->f_mapping->host); 1208 fmode_t mode = file->f_mode; 1209 + 1210 + /* 1211 + * O_NDELAY can be altered using fcntl(.., F_SETFL, ..), so we have 1212 + * to updated it before every ioctl. 1213 + */ 1214 if (file->f_flags & O_NDELAY) 1215 + mode |= FMODE_NDELAY; 1216 + else 1217 + mode &= ~FMODE_NDELAY; 1218 + 1219 return blkdev_ioctl(bdev, mode, cmd, arg); 1220 } 1221
-1
include/linux/fs.h
··· 79 #define FMODE_NDELAY ((__force fmode_t)32) 80 #define FMODE_EXCL ((__force fmode_t)64) 81 #define FMODE_WRITE_IOCTL ((__force fmode_t)128) 82 - #define FMODE_NDELAY_NOW ((__force fmode_t)256) 83 84 #define RW_MASK 1 85 #define RWA_MASK 2
··· 79 #define FMODE_NDELAY ((__force fmode_t)32) 80 #define FMODE_EXCL ((__force fmode_t)64) 81 #define FMODE_WRITE_IOCTL ((__force fmode_t)128) 82 83 #define RW_MASK 1 84 #define RWA_MASK 2