diff options
Diffstat (limited to 'drivers/block/xd.c')
-rw-r--r-- | drivers/block/xd.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/block/xd.c b/drivers/block/xd.c index 68b6d7b154cf..97f5dab24b5a 100644 --- a/drivers/block/xd.c +++ b/drivers/block/xd.c | |||
@@ -128,9 +128,12 @@ static DEFINE_SPINLOCK(xd_lock); | |||
128 | 128 | ||
129 | static struct gendisk *xd_gendisk[2]; | 129 | static struct gendisk *xd_gendisk[2]; |
130 | 130 | ||
131 | static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo); | ||
132 | |||
131 | static struct block_device_operations xd_fops = { | 133 | static struct block_device_operations xd_fops = { |
132 | .owner = THIS_MODULE, | 134 | .owner = THIS_MODULE, |
133 | .ioctl = xd_ioctl, | 135 | .ioctl = xd_ioctl, |
136 | .getgeo = xd_getgeo, | ||
134 | }; | 137 | }; |
135 | static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int); | 138 | static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int); |
136 | static u_char xd_drives, xd_irq = 5, xd_dma = 3, xd_maxsectors; | 139 | static u_char xd_drives, xd_irq = 5, xd_dma = 3, xd_maxsectors; |
@@ -330,22 +333,20 @@ static void do_xd_request (request_queue_t * q) | |||
330 | } | 333 | } |
331 | } | 334 | } |
332 | 335 | ||
336 | static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | ||
337 | { | ||
338 | XD_INFO *p = bdev->bd_disk->private_data; | ||
339 | |||
340 | geo->heads = p->heads; | ||
341 | geo->sectors = p->sectors; | ||
342 | geo->cylinders = p->cylinders; | ||
343 | return 0; | ||
344 | } | ||
345 | |||
333 | /* xd_ioctl: handle device ioctl's */ | 346 | /* xd_ioctl: handle device ioctl's */ |
334 | static int xd_ioctl (struct inode *inode,struct file *file,u_int cmd,u_long arg) | 347 | static int xd_ioctl (struct inode *inode,struct file *file,u_int cmd,u_long arg) |
335 | { | 348 | { |
336 | XD_INFO *p = inode->i_bdev->bd_disk->private_data; | ||
337 | |||
338 | switch (cmd) { | 349 | switch (cmd) { |
339 | case HDIO_GETGEO: | ||
340 | { | ||
341 | struct hd_geometry g; | ||
342 | struct hd_geometry __user *geom= (void __user *)arg; | ||
343 | g.heads = p->heads; | ||
344 | g.sectors = p->sectors; | ||
345 | g.cylinders = p->cylinders; | ||
346 | g.start = get_start_sect(inode->i_bdev); | ||
347 | return copy_to_user(geom, &g, sizeof(g)) ? -EFAULT : 0; | ||
348 | } | ||
349 | case HDIO_SET_DMA: | 350 | case HDIO_SET_DMA: |
350 | if (!capable(CAP_SYS_ADMIN)) return -EACCES; | 351 | if (!capable(CAP_SYS_ADMIN)) return -EACCES; |
351 | if (xdc_busy) return -EBUSY; | 352 | if (xdc_busy) return -EBUSY; |