diff options
Diffstat (limited to 'drivers/md/md.c')
-rw-r--r-- | drivers/md/md.c | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c index 1b76fb29fb70..e423a16ba3c9 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -3598,12 +3598,21 @@ static int set_disk_faulty(mddev_t *mddev, dev_t dev) | |||
3598 | return 0; | 3598 | return 0; |
3599 | } | 3599 | } |
3600 | 3600 | ||
3601 | static int md_getgeo(struct block_device *bdev, struct hd_geometry *geo) | ||
3602 | { | ||
3603 | mddev_t *mddev = bdev->bd_disk->private_data; | ||
3604 | |||
3605 | geo->heads = 2; | ||
3606 | geo->sectors = 4; | ||
3607 | geo->cylinders = get_capacity(mddev->gendisk) / 8; | ||
3608 | return 0; | ||
3609 | } | ||
3610 | |||
3601 | static int md_ioctl(struct inode *inode, struct file *file, | 3611 | static int md_ioctl(struct inode *inode, struct file *file, |
3602 | unsigned int cmd, unsigned long arg) | 3612 | unsigned int cmd, unsigned long arg) |
3603 | { | 3613 | { |
3604 | int err = 0; | 3614 | int err = 0; |
3605 | void __user *argp = (void __user *)arg; | 3615 | void __user *argp = (void __user *)arg; |
3606 | struct hd_geometry __user *loc = argp; | ||
3607 | mddev_t *mddev = NULL; | 3616 | mddev_t *mddev = NULL; |
3608 | 3617 | ||
3609 | if (!capable(CAP_SYS_ADMIN)) | 3618 | if (!capable(CAP_SYS_ADMIN)) |
@@ -3765,24 +3774,6 @@ static int md_ioctl(struct inode *inode, struct file *file, | |||
3765 | * 4 sectors (with a BIG number of cylinders...). This drives | 3774 | * 4 sectors (with a BIG number of cylinders...). This drives |
3766 | * dosfs just mad... ;-) | 3775 | * dosfs just mad... ;-) |
3767 | */ | 3776 | */ |
3768 | case HDIO_GETGEO: | ||
3769 | if (!loc) { | ||
3770 | err = -EINVAL; | ||
3771 | goto abort_unlock; | ||
3772 | } | ||
3773 | err = put_user (2, (char __user *) &loc->heads); | ||
3774 | if (err) | ||
3775 | goto abort_unlock; | ||
3776 | err = put_user (4, (char __user *) &loc->sectors); | ||
3777 | if (err) | ||
3778 | goto abort_unlock; | ||
3779 | err = put_user(get_capacity(mddev->gendisk)/8, | ||
3780 | (short __user *) &loc->cylinders); | ||
3781 | if (err) | ||
3782 | goto abort_unlock; | ||
3783 | err = put_user (get_start_sect(inode->i_bdev), | ||
3784 | (long __user *) &loc->start); | ||
3785 | goto done_unlock; | ||
3786 | } | 3777 | } |
3787 | 3778 | ||
3788 | /* | 3779 | /* |
@@ -3911,6 +3902,7 @@ static struct block_device_operations md_fops = | |||
3911 | .open = md_open, | 3902 | .open = md_open, |
3912 | .release = md_release, | 3903 | .release = md_release, |
3913 | .ioctl = md_ioctl, | 3904 | .ioctl = md_ioctl, |
3905 | .getgeo = md_getgeo, | ||
3914 | .media_changed = md_media_changed, | 3906 | .media_changed = md_media_changed, |
3915 | .revalidate_disk= md_revalidate, | 3907 | .revalidate_disk= md_revalidate, |
3916 | }; | 3908 | }; |