Signed-off-by: Pascal Bouchareine diff -ru xen-unstable.hg/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c xen-unstable.hg.new/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c --- xen-unstable.hg/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Sun Apr 30 13:36:52 2006 +++ xen-unstable.hg.new/linux-2.6-xen-sparse/drivers/xen/blkfront/blkfront.c Mon May 15 20:01:07 2006 @@ -424,7 +424,6 @@ return 0; } - int blkif_release(struct inode *inode, struct file *filep) { struct blkfront_info *info = inode->i_bdev->bd_disk->private_data; @@ -442,19 +441,46 @@ return 0; } +int blkif_getgeo(struct block_device *bdev, struct hd_geometry *geo) +{ + struct gendisk *gd; + struct hd_struct *part; + int dpart; + + DPRINTK_IOCTL("blkif ioctl(HDIO_GETGEO)\n"); + gd = bdev->bd_disk; + + geo->start = 0x00; + geo->heads = 0xff; + geo->sectors = 0x3f; + geo->cylinders = (gd->capacity >> 14) + (geo->heads + geo->sectors + 1); + + return 0; +} int blkif_ioctl(struct inode *inode, struct file *filep, unsigned command, unsigned long argument) { - int i; + dev_t dev = inode->i_rdev; + struct gendisk *gd; + struct hd_struct *part; + int i, num, dpart; DPRINTK_IOCTL("command: 0x%x, argument: 0x%lx, dev: 0x%04x\n", command, (long)argument, inode->i_rdev); + gd = get_gendisk(dev, &dpart); + part = gd->part[MINOR(dev)]; + switch (command) { - case HDIO_GETGEO: - /* return ENOSYS to use defaults */ - return -ENOSYS; + case BLKGETSIZE: + DPRINTK_IOCTL(" BLKGETSIZE: %x %lx\n", BLKGETSIZE, part->nr_sects); + return put_user(part->nr_sects, (unsigned long *) argument); + + case BLKGETSIZE64: + DPRINTK_IOCTL(" BLKGETSIZE64: %x %lx\n", BLKGETSIZE64, + (u64)part->nr_sects * 512); + return put_user((u64)part->nr_sects * 512, (u64 *) argument); case CDROMMULTISESSION: DPRINTK("FIXME: support multisession CDs later\n"); diff -ru xen-unstable.hg/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h xen-unstable.hg.new/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h --- xen-unstable.hg/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Sun Apr 30 13:36:52 2006 +++ xen-unstable.hg.new/linux-2.6-xen-sparse/drivers/xen/blkfront/block.h Mon May 15 15:57:58 2006 @@ -138,6 +138,7 @@ extern int blkif_open(struct inode *inode, struct file *filep); extern int blkif_release(struct inode *inode, struct file *filep); +extern int blkif_getgeo(struct block_device *bdev, struct hd_geometry *geo); extern int blkif_ioctl(struct inode *inode, struct file *filep, unsigned command, unsigned long argument); extern int blkif_check(dev_t dev); diff -ru xen-unstable.hg/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c xen-unstable.hg.new/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c --- xen-unstable.hg/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c Sun Apr 30 13:36:52 2006 +++ xen-unstable.hg.new/linux-2.6-xen-sparse/drivers/xen/blkfront/vbd.c Mon May 15 15:57:58 2006 @@ -91,6 +91,7 @@ .open = blkif_open, .release = blkif_release, .ioctl = blkif_ioctl, + .getgeo = blkif_getgeo, }; spinlock_t blkif_io_lock = SPIN_LOCK_UNLOCKED;