diff options
Diffstat (limited to 'drivers/ide/ide-ioctls.c')
| -rw-r--r-- | drivers/ide/ide-ioctls.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/drivers/ide/ide-ioctls.c b/drivers/ide/ide-ioctls.c index 82f252c3ee6..6233fa2cb8a 100644 --- a/drivers/ide/ide-ioctls.c +++ b/drivers/ide/ide-ioctls.c @@ -2,8 +2,10 @@ * IDE ioctls handling. */ +#include <linux/export.h> #include <linux/hdreg.h> #include <linux/ide.h> +#include <linux/slab.h> static const struct ide_ioctl_devset ide_ioctl_settings[] = { { HDIO_GET_32BIT, HDIO_SET_32BIT, &ide_devset_io_32bit }, @@ -64,7 +66,8 @@ static int ide_get_identity_ioctl(ide_drive_t *drive, unsigned int cmd, goto out; } - id = kmalloc(size, GFP_KERNEL); + /* ata_id_to_hd_driveid() relies on 'id' to be fully allocated. */ + id = kmalloc(ATA_ID_WORDS * 2, GFP_KERNEL); if (id == NULL) { rc = -ENOMEM; goto out; @@ -138,8 +141,8 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg) if (args[0] == ATA_CMD_SMART) { tf->nsect = args[3]; tf->lbal = args[1]; - tf->lbam = 0x4f; - tf->lbah = 0xc2; + tf->lbam = ATA_SMART_LBAM_PASS; + tf->lbah = ATA_SMART_LBAH_PASS; cmd.valid.out.tf = IDE_VALID_OUT_TF; cmd.valid.in.tf = IDE_VALID_NSECT; } else { @@ -161,11 +164,13 @@ 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) { - xfer_rate = ide_find_dma_mode(drive, XFER_UDMA_6); + xfer_rate = ide_find_dma_mode(drive, tf->nsect); if (xfer_rate != tf->nsect) { err = -EINVAL; goto abort; } + + cmd.tf_flags |= IDE_TFLAG_SET_XFER; } err = ide_raw_taskfile(drive, &cmd, buf, args[3]); @@ -173,12 +178,6 @@ static int ide_cmd_ioctl(ide_drive_t *drive, unsigned long arg) args[0] = tf->status; args[1] = tf->error; args[2] = tf->nsect; - - if (!err && xfer_rate) { - /* active-retuning-calls future */ - ide_set_xfer_rate(drive, xfer_rate); - ide_driveid_update(drive); - } abort: if (copy_to_user((void __user *)arg, &args, 4)) err = -EFAULT; |
