aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide.c
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-10-10 16:39:29 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-10-10 16:39:29 -0400
commit9fa295e12d490fd571c614b221defaa9212c20dc (patch)
tree82e37a95d7ec3441f4a5f8cb311e9970a91f70e0 /drivers/ide/ide.c
parent02d599a365d04658bc9ea71762ed17c895079927 (diff)
ide: factor out HDIO_*_NICE ioctl handling to ide_*_nice_ioctl()
Factor out HDIO_{GET,SET}_NICE ioctl handling from generic_ide_ioctl() to ide_{get,set}_nice_ioctl(). Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/ide.c')
-rw-r--r--drivers/ide/ide.c40
1 files changed, 26 insertions, 14 deletions
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index 4d0c661e78a5..12618d2aed2c 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -558,6 +558,28 @@ out:
558 return rc; 558 return rc;
559} 559}
560 560
561static int ide_get_nice_ioctl(ide_drive_t *drive, unsigned long arg)
562{
563 return put_user((drive->dsc_overlap << IDE_NICE_DSC_OVERLAP) |
564 (drive->nice1 << IDE_NICE_1), (long __user *)arg);
565}
566
567static int ide_set_nice_ioctl(ide_drive_t *drive, unsigned long arg)
568{
569 if (arg != (arg & ((1 << IDE_NICE_DSC_OVERLAP) | (1 << IDE_NICE_1))))
570 return -EPERM;
571
572 if (((arg >> IDE_NICE_DSC_OVERLAP) & 1) &&
573 (drive->media == ide_disk || drive->media == ide_floppy ||
574 drive->scsi))
575 return -EPERM;
576
577 drive->dsc_overlap = (arg >> IDE_NICE_DSC_OVERLAP) & 1;
578 drive->nice1 = (arg >> IDE_NICE_1) & 1;
579
580 return 0;
581}
582
561int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev, 583int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev,
562 unsigned int cmd, unsigned long arg) 584 unsigned int cmd, unsigned long arg)
563{ 585{
@@ -583,9 +605,7 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
583 return -EINVAL; 605 return -EINVAL;
584 return ide_get_identity_ioctl(drive, cmd, arg); 606 return ide_get_identity_ioctl(drive, cmd, arg);
585 case HDIO_GET_NICE: 607 case HDIO_GET_NICE:
586 return put_user(drive->dsc_overlap << IDE_NICE_DSC_OVERLAP | 608 return ide_get_nice_ioctl(drive, arg);
587 drive->nice1 << IDE_NICE_1,
588 (long __user *) arg);
589#ifdef CONFIG_IDE_TASK_IOCTL 609#ifdef CONFIG_IDE_TASK_IOCTL
590 case HDIO_DRIVE_TASKFILE: 610 case HDIO_DRIVE_TASKFILE:
591 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) 611 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
@@ -608,17 +628,9 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device
608 return -EACCES; 628 return -EACCES;
609 return ide_task_ioctl(drive, cmd, arg); 629 return ide_task_ioctl(drive, cmd, arg);
610 case HDIO_SET_NICE: 630 case HDIO_SET_NICE:
611 if (!capable(CAP_SYS_ADMIN)) return -EACCES; 631 if (!capable(CAP_SYS_ADMIN))
612 if (arg != (arg & ((1 << IDE_NICE_DSC_OVERLAP) | (1 << IDE_NICE_1)))) 632 return -EACCES;
613 return -EPERM; 633 return ide_set_nice_ioctl(drive, arg);
614 if (((arg >> IDE_NICE_DSC_OVERLAP) & 1) &&
615 (drive->media == ide_disk ||
616 drive->media == ide_floppy ||
617 drive->scsi))
618 return -EPERM;
619 drive->dsc_overlap = (arg >> IDE_NICE_DSC_OVERLAP) & 1;
620 drive->nice1 = (arg >> IDE_NICE_1) & 1;
621 return 0;
622 case HDIO_DRIVE_RESET: 634 case HDIO_DRIVE_RESET:
623 if (!capable(CAP_SYS_ADMIN)) 635 if (!capable(CAP_SYS_ADMIN))
624 return -EACCES; 636 return -EACCES;