diff options
Diffstat (limited to 'drivers/block/viodasd.c')
-rw-r--r-- | drivers/block/viodasd.c | 44 |
1 files changed, 9 insertions, 35 deletions
diff --git a/drivers/block/viodasd.c b/drivers/block/viodasd.c index 063f0304a163..d1aaf31bd97e 100644 --- a/drivers/block/viodasd.c +++ b/drivers/block/viodasd.c | |||
@@ -247,43 +247,17 @@ static int viodasd_release(struct inode *ino, struct file *fil) | |||
247 | 247 | ||
248 | /* External ioctl entry point. | 248 | /* External ioctl entry point. |
249 | */ | 249 | */ |
250 | static int viodasd_ioctl(struct inode *ino, struct file *fil, | 250 | static int viodasd_getgeo(struct block_device *bdev, struct hd_geometry *geo) |
251 | unsigned int cmd, unsigned long arg) | ||
252 | { | 251 | { |
253 | unsigned char sectors; | 252 | struct gendisk *disk = bdev->bd_disk; |
254 | unsigned char heads; | 253 | struct viodasd_device *d = disk->private_data; |
255 | unsigned short cylinders; | ||
256 | struct hd_geometry *geo; | ||
257 | struct gendisk *gendisk; | ||
258 | struct viodasd_device *d; | ||
259 | 254 | ||
260 | switch (cmd) { | 255 | geo->sectors = d->sectors ? d->sectors : 0; |
261 | case HDIO_GETGEO: | 256 | geo->heads = d->tracks ? d->tracks : 64; |
262 | geo = (struct hd_geometry *)arg; | 257 | geo->cylinders = d->cylinders ? d->cylinders : |
263 | if (geo == NULL) | 258 | get_capacity(disk) / (geo->cylinders * geo->heads); |
264 | return -EINVAL; | ||
265 | if (!access_ok(VERIFY_WRITE, geo, sizeof(*geo))) | ||
266 | return -EFAULT; | ||
267 | gendisk = ino->i_bdev->bd_disk; | ||
268 | d = gendisk->private_data; | ||
269 | sectors = d->sectors; | ||
270 | if (sectors == 0) | ||
271 | sectors = 32; | ||
272 | heads = d->tracks; | ||
273 | if (heads == 0) | ||
274 | heads = 64; | ||
275 | cylinders = d->cylinders; | ||
276 | if (cylinders == 0) | ||
277 | cylinders = get_capacity(gendisk) / (sectors * heads); | ||
278 | if (__put_user(sectors, &geo->sectors) || | ||
279 | __put_user(heads, &geo->heads) || | ||
280 | __put_user(cylinders, &geo->cylinders) || | ||
281 | __put_user(get_start_sect(ino->i_bdev), &geo->start)) | ||
282 | return -EFAULT; | ||
283 | return 0; | ||
284 | } | ||
285 | 259 | ||
286 | return -EINVAL; | 260 | return 0; |
287 | } | 261 | } |
288 | 262 | ||
289 | /* | 263 | /* |
@@ -293,7 +267,7 @@ static struct block_device_operations viodasd_fops = { | |||
293 | .owner = THIS_MODULE, | 267 | .owner = THIS_MODULE, |
294 | .open = viodasd_open, | 268 | .open = viodasd_open, |
295 | .release = viodasd_release, | 269 | .release = viodasd_release, |
296 | .ioctl = viodasd_ioctl, | 270 | .getgeo = viodasd_getgeo, |
297 | }; | 271 | }; |
298 | 272 | ||
299 | /* | 273 | /* |