aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz2008-04-17 17:46:24 -0500
committerBartlomiej Zolnierkiewicz2008-04-17 17:46:24 -0500
commit93de00fd1c70e1a23a73a865e0f9abfe74a7a719 (patch)
tree44a0112d29bc82bb619fe4b0437a64fd92620968 /block/compat_ioctl.c
parent9a0e77f28b50128df0c9e26ae489e44e29a7270a (diff)
downloadkernel-common-93de00fd1c70e1a23a73a865e0f9abfe74a7a719.tar.gz
kernel-common-93de00fd1c70e1a23a73a865e0f9abfe74a7a719.tar.xz
kernel-common-93de00fd1c70e1a23a73a865e0f9abfe74a7a719.zip
ide: remove broken/dangerous HDIO_[UNREGISTER,SCAN]_HWIF ioctls (take 3)
hdparm explicitely marks HDIO_[UNREGISTER,SCAN]_HWIF ioctls as DANGEROUS and given the number of bugs we can assume that there are no real users: * DMA has no chance of working because DMA resources are released by ide_unregister() and they are never allocated again. * Since ide_init_hwif_ports() is used for ->io_ports[] setup the ioctls don't work for almost all hosts with "non-standard" (== non ISA-like) layout of IDE taskfile registers (there is a lot of such host drivers). * ide_port_init_devices() is not called when probing IDE devices so: - drive->autotune is never set and IDE host/devices are not programmed for the correct PIO/DMA transfer modes (=> possible data corruption) - host specific I/O 32-bit and IRQ unmasking settings are not applied (=> possible data corruption) - host specific ->port_init_devs method is not called (=> no luck with ht6560b, qd65xx and opti621 host drivers) * ->rw_disk method is not preserved (=> no HPT3xxN chipsets support). * ->serialized flag is not preserved (=> possible data corruption when using icside, aec62xx (ATP850UF chipset), cmd640, cs5530, hpt366 (HPT3xxN chipsets), rz1000, sc1200, dtc2278 and ht6560b host drivers). * ->ack_intr method is not preserved (=> needed by ide-cris, buddha, gayle and macide host drivers). * ->sata_scr[] and sata_misc[] is cleared by ide_unregister() and it isn't initialized again (SiI3112 support needs them). * To issue an ioctl() there need to be at least one IDE device present in the system. * ->cable_detect method is not preserved + it is not called when probing IDE devices so cable detection is broken (however since DMA support is also broken it doesn't really matter ;-). * Some objects which may have already been freed in ide_unregister() are restored by ide_hwif_restore() (i.e. ->hwgroup). * ide_register_hw() may unregister unrelated IDE ports if free ide_hwifs[] slot cannot be found. * When IDE host drivers are modular unregistered port may be re-used by different host driver that owned it first causing subtle bugs. Since we now have a proper warm-plug support remove these ioctls, then remove no longer needed: - ide_register_hw() and ide_hwif_restore() functions - 'init_default' and 'restore' arguments of ide_unregister() - zeroeing of hwif->{dma,extra}_* fields in ide_unregister() As an added bonus IDE core code size shrinks by ~3kB (x86-32). v2: * fix ide_unregister() arguments in cleanup_module() (Andrew Morton). v3: * fix ide_unregister() arguments in palm_bk3710.c. Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'block/compat_ioctl.c')
-rw-r--r--block/compat_ioctl.c1
1 files changed, 0 insertions, 1 deletions
diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c
index b73373216b0..c70d0b6f666 100644
--- a/block/compat_ioctl.c
+++ b/block/compat_ioctl.c
@@ -624,7 +624,6 @@ static int compat_blkdev_driver_ioctl(struct inode *inode, struct file *file,
624 case HDIO_GET_IDENTITY: 624 case HDIO_GET_IDENTITY:
625 case HDIO_DRIVE_TASK: 625 case HDIO_DRIVE_TASK:
626 case HDIO_DRIVE_CMD: 626 case HDIO_DRIVE_CMD:
627 case HDIO_SCAN_HWIF:
628 /* 0x330 is reserved -- it used to be HDIO_GETGEO_BIG */ 627 /* 0x330 is reserved -- it used to be HDIO_GETGEO_BIG */
629 case 0x330: 628 case 0x330:
630 /* 0x02 -- Floppy ioctls */ 629 /* 0x02 -- Floppy ioctls */