diff options
Diffstat (limited to 'drivers/ide')
-rw-r--r-- | drivers/ide/ide-disk.c | 12 | ||||
-rw-r--r-- | drivers/ide/ide-floppy.c | 12 | ||||
-rw-r--r-- | drivers/ide/ide.c | 13 | ||||
-rw-r--r-- | drivers/ide/legacy/hd.c | 24 |
4 files changed, 32 insertions, 29 deletions
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 4b441720b6ba..cab362ea0336 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -1130,6 +1130,17 @@ static int idedisk_release(struct inode *inode, struct file *filp) | |||
1130 | return 0; | 1130 | return 0; |
1131 | } | 1131 | } |
1132 | 1132 | ||
1133 | static int idedisk_getgeo(struct block_device *bdev, struct hd_geometry *geo) | ||
1134 | { | ||
1135 | struct ide_disk_obj *idkp = ide_disk_g(bdev->bd_disk); | ||
1136 | ide_drive_t *drive = idkp->drive; | ||
1137 | |||
1138 | geo->heads = drive->bios_head; | ||
1139 | geo->sectors = drive->bios_sect; | ||
1140 | geo->cylinders = (u16)drive->bios_cyl; /* truncate */ | ||
1141 | return 0; | ||
1142 | } | ||
1143 | |||
1133 | static int idedisk_ioctl(struct inode *inode, struct file *file, | 1144 | static int idedisk_ioctl(struct inode *inode, struct file *file, |
1134 | unsigned int cmd, unsigned long arg) | 1145 | unsigned int cmd, unsigned long arg) |
1135 | { | 1146 | { |
@@ -1164,6 +1175,7 @@ static struct block_device_operations idedisk_ops = { | |||
1164 | .open = idedisk_open, | 1175 | .open = idedisk_open, |
1165 | .release = idedisk_release, | 1176 | .release = idedisk_release, |
1166 | .ioctl = idedisk_ioctl, | 1177 | .ioctl = idedisk_ioctl, |
1178 | .getgeo = idedisk_getgeo, | ||
1167 | .media_changed = idedisk_media_changed, | 1179 | .media_changed = idedisk_media_changed, |
1168 | .revalidate_disk= idedisk_revalidate_disk | 1180 | .revalidate_disk= idedisk_revalidate_disk |
1169 | }; | 1181 | }; |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index fba3fffc2d66..5945f551aaaa 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -2031,6 +2031,17 @@ static int idefloppy_release(struct inode *inode, struct file *filp) | |||
2031 | return 0; | 2031 | return 0; |
2032 | } | 2032 | } |
2033 | 2033 | ||
2034 | static int idefloppy_getgeo(struct block_device *bdev, struct hd_geometry *geo) | ||
2035 | { | ||
2036 | struct ide_floppy_obj *floppy = ide_floppy_g(bdev->bd_disk); | ||
2037 | ide_drive_t *drive = floppy->drive; | ||
2038 | |||
2039 | geo->heads = drive->bios_head; | ||
2040 | geo->sectors = drive->bios_sect; | ||
2041 | geo->cylinders = (u16)drive->bios_cyl; /* truncate */ | ||
2042 | return 0; | ||
2043 | } | ||
2044 | |||
2034 | static int idefloppy_ioctl(struct inode *inode, struct file *file, | 2045 | static int idefloppy_ioctl(struct inode *inode, struct file *file, |
2035 | unsigned int cmd, unsigned long arg) | 2046 | unsigned int cmd, unsigned long arg) |
2036 | { | 2047 | { |
@@ -2120,6 +2131,7 @@ static struct block_device_operations idefloppy_ops = { | |||
2120 | .open = idefloppy_open, | 2131 | .open = idefloppy_open, |
2121 | .release = idefloppy_release, | 2132 | .release = idefloppy_release, |
2122 | .ioctl = idefloppy_ioctl, | 2133 | .ioctl = idefloppy_ioctl, |
2134 | .getgeo = idefloppy_getgeo, | ||
2123 | .media_changed = idefloppy_media_changed, | 2135 | .media_changed = idefloppy_media_changed, |
2124 | .revalidate_disk= idefloppy_revalidate_disk | 2136 | .revalidate_disk= idefloppy_revalidate_disk |
2125 | }; | 2137 | }; |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 4b524f6b3ecd..b069b13b75a7 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -1278,19 +1278,6 @@ int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device | |||
1278 | up(&ide_setting_sem); | 1278 | up(&ide_setting_sem); |
1279 | 1279 | ||
1280 | switch (cmd) { | 1280 | switch (cmd) { |
1281 | case HDIO_GETGEO: | ||
1282 | { | ||
1283 | struct hd_geometry geom; | ||
1284 | if (!p || (drive->media != ide_disk && drive->media != ide_floppy)) return -EINVAL; | ||
1285 | geom.heads = drive->bios_head; | ||
1286 | geom.sectors = drive->bios_sect; | ||
1287 | geom.cylinders = (u16)drive->bios_cyl; /* truncate */ | ||
1288 | geom.start = get_start_sect(bdev); | ||
1289 | if (copy_to_user(p, &geom, sizeof(struct hd_geometry))) | ||
1290 | return -EFAULT; | ||
1291 | return 0; | ||
1292 | } | ||
1293 | |||
1294 | case HDIO_OBSOLETE_IDENTITY: | 1281 | case HDIO_OBSOLETE_IDENTITY: |
1295 | case HDIO_GET_IDENTITY: | 1282 | case HDIO_GET_IDENTITY: |
1296 | if (bdev != bdev->bd_contains) | 1283 | if (bdev != bdev->bd_contains) |
diff --git a/drivers/ide/legacy/hd.c b/drivers/ide/legacy/hd.c index 242029c9c0ca..6439dec66881 100644 --- a/drivers/ide/legacy/hd.c +++ b/drivers/ide/legacy/hd.c | |||
@@ -658,22 +658,14 @@ static void do_hd_request (request_queue_t * q) | |||
658 | enable_irq(HD_IRQ); | 658 | enable_irq(HD_IRQ); |
659 | } | 659 | } |
660 | 660 | ||
661 | static int hd_ioctl(struct inode * inode, struct file * file, | 661 | static int hd_getgeo(struct block_device *bdev, struct hd_geometry *geo) |
662 | unsigned int cmd, unsigned long arg) | ||
663 | { | 662 | { |
664 | struct hd_i_struct *disk = inode->i_bdev->bd_disk->private_data; | 663 | struct hd_i_struct *disk = bdev->bd_disk->private_data; |
665 | struct hd_geometry __user *loc = (struct hd_geometry __user *) arg; | 664 | |
666 | struct hd_geometry g; | 665 | geo->heads = disk->head; |
667 | 666 | geo->sectors = disk->sect; | |
668 | if (cmd != HDIO_GETGEO) | 667 | geo->cylinders = disk->cyl; |
669 | return -EINVAL; | 668 | return 0; |
670 | if (!loc) | ||
671 | return -EINVAL; | ||
672 | g.heads = disk->head; | ||
673 | g.sectors = disk->sect; | ||
674 | g.cylinders = disk->cyl; | ||
675 | g.start = get_start_sect(inode->i_bdev); | ||
676 | return copy_to_user(loc, &g, sizeof g) ? -EFAULT : 0; | ||
677 | } | 669 | } |
678 | 670 | ||
679 | /* | 671 | /* |
@@ -695,7 +687,7 @@ static irqreturn_t hd_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
695 | } | 687 | } |
696 | 688 | ||
697 | static struct block_device_operations hd_fops = { | 689 | static struct block_device_operations hd_fops = { |
698 | .ioctl = hd_ioctl, | 690 | .getgeo = hd_getgeo, |
699 | }; | 691 | }; |
700 | 692 | ||
701 | /* | 693 | /* |