# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 28ffbefb0966106b1a79eedd733c0d5ec9883480
# Parent 33263455b079d7a1a5c68a9b519029925d427c2a
Add backing support for HDIO_GETGEO ioctl to blkfront.
Inspired by an earlier patch from Charles Coffing.
Signed-Off-By: Jan Beulich <jbeulich@xxxxxxxxxx>
xen-unstable changeset: 10258:bcc2c9ea60d83e26940985d0e840d101e260ee57
xen-unstable date: Fri Jun 2 12:13:34 2006 +0100
---
linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c | 21 +++++++++++++++----
linux-2.6-xen-sparse/drivers/xen/blkfront/block.h | 1
linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c | 1
3 files changed, 19 insertions(+), 4 deletions(-)
diff -r 33263455b079 -r 28ffbefb0966
linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Fri Jun 02
12:00:25 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Fri Jun 02
12:15:49 2006 +0100
@@ -452,10 +452,6 @@ int blkif_ioctl(struct inode *inode, str
command, (long)argument, inode->i_rdev);
switch (command) {
- case HDIO_GETGEO:
- /* return ENOSYS to use defaults */
- return -ENOSYS;
-
case CDROMMULTISESSION:
DPRINTK("FIXME: support multisession CDs later\n");
for (i = 0; i < sizeof(struct cdrom_multisession); i++)
@@ -469,6 +465,23 @@ int blkif_ioctl(struct inode *inode, str
return -EINVAL; /* same return as native Linux */
}
+ return 0;
+}
+
+
+int blkif_getgeo(struct block_device *bd, struct hd_geometry *hg)
+{
+ /* We don't have real geometry info, but let's at least return
+ values consistent with the size of the device */
+ sector_t nsect = get_capacity(bd->bd_disk);
+ sector_t cylinders = nsect;
+
+ hg->heads = 0xff;
+ hg->sectors = 0x3f;
+ sector_div(cylinders, hg->heads * hg->sectors);
+ hg->cylinders = cylinders;
+ if ((sector_t)(hg->cylinders + 1) * hg->heads * hg->sectors < nsect)
+ hg->cylinders = 0xffff;
return 0;
}
diff -r 33263455b079 -r 28ffbefb0966
linux-2.6-xen-sparse/drivers/xen/blkfront/block.h
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Fri Jun 02 12:00:25
2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Fri Jun 02 12:15:49
2006 +0100
@@ -140,6 +140,7 @@ extern int blkif_release(struct inode *i
extern int blkif_release(struct inode *inode, struct file *filep);
extern int blkif_ioctl(struct inode *inode, struct file *filep,
unsigned command, unsigned long argument);
+extern int blkif_getgeo(struct block_device *, struct hd_geometry *);
extern int blkif_check(dev_t dev);
extern int blkif_revalidate(dev_t dev);
extern void do_blkif_request (request_queue_t *rq);
diff -r 33263455b079 -r 28ffbefb0966
linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c
--- a/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c Fri Jun 02 12:00:25
2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c Fri Jun 02 12:15:49
2006 +0100
@@ -91,6 +91,7 @@ static struct block_device_operations xl
.open = blkif_open,
.release = blkif_release,
.ioctl = blkif_ioctl,
+ .getgeo = blkif_getgeo
};
spinlock_t blkif_io_lock = SPIN_LOCK_UNLOCKED;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|