diff options
author | Christoph Hellwig <hch@lst.de> | 2008-11-05 08:58:42 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2008-12-04 04:22:57 -0500 |
commit | fd4ce1acd0f8558033b1a6968001552bd7671e6d (patch) | |
tree | 7ce54f2b2c967fe2315917ffa2eb8eb7d47e7a2b | |
parent | ebbefc011e56bd85b4745d01e5b8d7d05d95ed5d (diff) |
[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>
-rw-r--r-- | block/compat_ioctl.c | 8 | ||||
-rw-r--r-- | drivers/scsi/sd.c | 2 | ||||
-rw-r--r-- | drivers/scsi/sr.c | 2 | ||||
-rw-r--r-- | fs/block_dev.c | 10 | ||||
-rw-r--r-- | include/linux/fs.h | 1 |
5 files changed, 18 insertions, 5 deletions
diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c index d43e6087badc..67eb93cff699 100644 --- a/block/compat_ioctl.c +++ b/block/compat_ioctl.c | |||
@@ -722,8 +722,14 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg) | |||
722 | struct backing_dev_info *bdi; | 722 | struct backing_dev_info *bdi; |
723 | loff_t size; | 723 | loff_t size; |
724 | 724 | ||
725 | /* | ||
726 | * O_NDELAY can be altered using fcntl(.., F_SETFL, ..), so we have | ||
727 | * to updated it before every ioctl. | ||
728 | */ | ||
725 | if (file->f_flags & O_NDELAY) | 729 | if (file->f_flags & O_NDELAY) |
726 | mode |= FMODE_NDELAY_NOW; | 730 | mode |= FMODE_NDELAY; |
731 | else | ||
732 | mode &= ~FMODE_NDELAY; | ||
727 | 733 | ||
728 | switch (cmd) { | 734 | switch (cmd) { |
729 | case HDIO_GETGEO: | 735 | case HDIO_GETGEO: |
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index c9e1242eaf25..5081b3981d3c 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
@@ -757,7 +757,7 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode, | |||
757 | * access to the device is prohibited. | 757 | * access to the device is prohibited. |
758 | */ | 758 | */ |
759 | error = scsi_nonblockable_ioctl(sdp, cmd, p, | 759 | error = scsi_nonblockable_ioctl(sdp, cmd, p, |
760 | (mode & FMODE_NDELAY_NOW) != 0); | 760 | (mode & FMODE_NDELAY) != 0); |
761 | if (!scsi_block_when_processing_errors(sdp) || !error) | 761 | if (!scsi_block_when_processing_errors(sdp) || !error) |
762 | return error; | 762 | return error; |
763 | 763 | ||
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 62b6633e3a97..45b66b98a516 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
@@ -521,7 +521,7 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, | |||
521 | * if it doesn't recognise the ioctl | 521 | * if it doesn't recognise the ioctl |
522 | */ | 522 | */ |
523 | ret = scsi_nonblockable_ioctl(sdev, cmd, argp, | 523 | ret = scsi_nonblockable_ioctl(sdev, cmd, argp, |
524 | (mode & FMODE_NDELAY_NOW) != 0); | 524 | (mode & FMODE_NDELAY) != 0); |
525 | if (ret != -ENODEV) | 525 | if (ret != -ENODEV) |
526 | return ret; | 526 | return ret; |
527 | return scsi_ioctl(sdev, cmd, argp); | 527 | return scsi_ioctl(sdev, cmd, argp); |
diff --git a/fs/block_dev.c b/fs/block_dev.c index 7c727523bc54..99e0ae1a4c78 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c | |||
@@ -1206,8 +1206,16 @@ static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg) | |||
1206 | { | 1206 | { |
1207 | struct block_device *bdev = I_BDEV(file->f_mapping->host); | 1207 | struct block_device *bdev = I_BDEV(file->f_mapping->host); |
1208 | fmode_t mode = file->f_mode; | 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 | */ | ||
1209 | if (file->f_flags & O_NDELAY) | 1214 | if (file->f_flags & O_NDELAY) |
1210 | mode |= FMODE_NDELAY_NOW; | 1215 | mode |= FMODE_NDELAY; |
1216 | else | ||
1217 | mode &= ~FMODE_NDELAY; | ||
1218 | |||
1211 | return blkdev_ioctl(bdev, mode, cmd, arg); | 1219 | return blkdev_ioctl(bdev, mode, cmd, arg); |
1212 | } | 1220 | } |
1213 | 1221 | ||
diff --git a/include/linux/fs.h b/include/linux/fs.h index 0dcdd9458f4b..b3345a90e11a 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -79,7 +79,6 @@ extern int dir_notify_enable; | |||
79 | #define FMODE_NDELAY ((__force fmode_t)32) | 79 | #define FMODE_NDELAY ((__force fmode_t)32) |
80 | #define FMODE_EXCL ((__force fmode_t)64) | 80 | #define FMODE_EXCL ((__force fmode_t)64) |
81 | #define FMODE_WRITE_IOCTL ((__force fmode_t)128) | 81 | #define FMODE_WRITE_IOCTL ((__force fmode_t)128) |
82 | #define FMODE_NDELAY_NOW ((__force fmode_t)256) | ||
83 | 82 | ||
84 | #define RW_MASK 1 | 83 | #define RW_MASK 1 |
85 | #define RWA_MASK 2 | 84 | #define RWA_MASK 2 |