ide: filter out invalid DMA xfer mode changes in HDIO_DRIVE_CMD ioctl handler
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Mon, 15 Jun 2009 20:13:45 +0000 (22:13 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Mon, 15 Jun 2009 20:13:45 +0000 (22:13 +0200)
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-ioctls.c

index 5991b23793f20ee33f164a2dea752804f7580310..82f252c3ee6e500eb85fc466f1fc26e5c71b6d5a 100644 (file)
@@ -118,7 +118,6 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg)
        u8 args[4], xfer_rate = 0;
        struct ide_cmd cmd;
        struct ide_taskfile *tf = &cmd.tf;
-       u16 *id = drive->id;
 
        if (NULL == (void *) arg) {
                struct request *rq;
@@ -161,14 +160,10 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg)
 
        if (tf->command == ATA_CMD_SET_FEATURES &&
            tf->feature == SETFEATURES_XFER &&
-           tf->nsect >= XFER_SW_DMA_0 &&
-           (id[ATA_ID_UDMA_MODES] ||
-            id[ATA_ID_MWDMA_MODES] ||
-            id[ATA_ID_SWDMA_MODES])) {
-               xfer_rate = args[1];
-               if (tf->nsect > XFER_UDMA_2 && !eighty_ninty_three(drive)) {
-                       printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot "
-                                           "be set\n", drive->name);
+           tf->nsect >= XFER_SW_DMA_0) {
+               xfer_rate = ide_find_dma_mode(drive, XFER_UDMA_6);
+               if (xfer_rate != tf->nsect) {
+                       err = -EINVAL;
                        goto abort;
                }
        }