diff options
Diffstat (limited to 'drivers/block/paride/pd.c')
| -rw-r--r-- | drivers/block/paride/pd.c | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c index fa49d62626ba..62d2464c12f2 100644 --- a/drivers/block/paride/pd.c +++ b/drivers/block/paride/pd.c | |||
| @@ -747,32 +747,33 @@ static int pd_open(struct inode *inode, struct file *file) | |||
| 747 | return 0; | 747 | return 0; |
| 748 | } | 748 | } |
| 749 | 749 | ||
| 750 | static int pd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | ||
| 751 | { | ||
| 752 | struct pd_unit *disk = bdev->bd_disk->private_data; | ||
| 753 | |||
| 754 | if (disk->alt_geom) { | ||
| 755 | geo->heads = PD_LOG_HEADS; | ||
| 756 | geo->sectors = PD_LOG_SECTS; | ||
| 757 | geo->cylinders = disk->capacity / (geo->heads * geo->sectors); | ||
| 758 | } else { | ||
| 759 | geo->heads = disk->heads; | ||
| 760 | geo->sectors = disk->sectors; | ||
| 761 | geo->cylinders = disk->cylinders; | ||
| 762 | } | ||
| 763 | |||
| 764 | return 0; | ||
| 765 | } | ||
| 766 | |||
| 750 | static int pd_ioctl(struct inode *inode, struct file *file, | 767 | static int pd_ioctl(struct inode *inode, struct file *file, |
| 751 | unsigned int cmd, unsigned long arg) | 768 | unsigned int cmd, unsigned long arg) |
| 752 | { | 769 | { |
| 753 | struct pd_unit *disk = inode->i_bdev->bd_disk->private_data; | 770 | struct pd_unit *disk = inode->i_bdev->bd_disk->private_data; |
| 754 | struct hd_geometry __user *geo = (struct hd_geometry __user *) arg; | ||
| 755 | struct hd_geometry g; | ||
| 756 | 771 | ||
| 757 | switch (cmd) { | 772 | switch (cmd) { |
| 758 | case CDROMEJECT: | 773 | case CDROMEJECT: |
| 759 | if (disk->access == 1) | 774 | if (disk->access == 1) |
| 760 | pd_special_command(disk, pd_eject); | 775 | pd_special_command(disk, pd_eject); |
| 761 | return 0; | 776 | return 0; |
| 762 | case HDIO_GETGEO: | ||
| 763 | if (disk->alt_geom) { | ||
| 764 | g.heads = PD_LOG_HEADS; | ||
| 765 | g.sectors = PD_LOG_SECTS; | ||
| 766 | g.cylinders = disk->capacity / (g.heads * g.sectors); | ||
| 767 | } else { | ||
| 768 | g.heads = disk->heads; | ||
| 769 | g.sectors = disk->sectors; | ||
| 770 | g.cylinders = disk->cylinders; | ||
| 771 | } | ||
| 772 | g.start = get_start_sect(inode->i_bdev); | ||
| 773 | if (copy_to_user(geo, &g, sizeof(struct hd_geometry))) | ||
| 774 | return -EFAULT; | ||
| 775 | return 0; | ||
| 776 | default: | 777 | default: |
| 777 | return -EINVAL; | 778 | return -EINVAL; |
| 778 | } | 779 | } |
| @@ -815,6 +816,7 @@ static struct block_device_operations pd_fops = { | |||
| 815 | .open = pd_open, | 816 | .open = pd_open, |
| 816 | .release = pd_release, | 817 | .release = pd_release, |
| 817 | .ioctl = pd_ioctl, | 818 | .ioctl = pd_ioctl, |
| 819 | .getgeo = pd_getgeo, | ||
| 818 | .media_changed = pd_check_media, | 820 | .media_changed = pd_check_media, |
| 819 | .revalidate_disk= pd_revalidate | 821 | .revalidate_disk= pd_revalidate |
| 820 | }; | 822 | }; |
