diff options
Diffstat (limited to 'block/ioctl.c')
-rw-r--r-- | block/ioctl.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/block/ioctl.c b/block/ioctl.c index 6e278474f9a8..82030e1dfd63 100644 --- a/block/ioctl.c +++ b/block/ioctl.c | |||
@@ -1,6 +1,7 @@ | |||
1 | #include <linux/sched.h> /* for capable() */ | 1 | #include <linux/sched.h> /* for capable() */ |
2 | #include <linux/blkdev.h> | 2 | #include <linux/blkdev.h> |
3 | #include <linux/blkpg.h> | 3 | #include <linux/blkpg.h> |
4 | #include <linux/hdreg.h> | ||
4 | #include <linux/backing-dev.h> | 5 | #include <linux/backing-dev.h> |
5 | #include <linux/buffer_head.h> | 6 | #include <linux/buffer_head.h> |
6 | #include <linux/smp_lock.h> | 7 | #include <linux/smp_lock.h> |
@@ -245,6 +246,27 @@ int blkdev_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
245 | set_device_ro(bdev, n); | 246 | set_device_ro(bdev, n); |
246 | unlock_kernel(); | 247 | unlock_kernel(); |
247 | return 0; | 248 | return 0; |
249 | case HDIO_GETGEO: { | ||
250 | struct hd_geometry geo; | ||
251 | |||
252 | if (!arg) | ||
253 | return -EINVAL; | ||
254 | if (!disk->fops->getgeo) | ||
255 | return -ENOTTY; | ||
256 | |||
257 | /* | ||
258 | * We need to set the startsect first, the driver may | ||
259 | * want to override it. | ||
260 | */ | ||
261 | geo.start = get_start_sect(bdev); | ||
262 | ret = disk->fops->getgeo(bdev, &geo); | ||
263 | if (ret) | ||
264 | return ret; | ||
265 | if (copy_to_user((struct hd_geometry __user *)arg, &geo, | ||
266 | sizeof(geo))) | ||
267 | return -EFAULT; | ||
268 | return 0; | ||
269 | } | ||
248 | } | 270 | } |
249 | 271 | ||
250 | lock_kernel(); | 272 | lock_kernel(); |