[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

RFC: Adding CDROM_GET_CAPABILITY to Lenny's Xen blkfront driver



Does anyone have any objections to pushing the attached patch (+second
cleanup patch) to the Lenny branch? It adds support for the
CDROM_GET_CAPABILITY ioctl to the Xen block device driver.

It's not super critical or anything and is possibly a bit of a stretch
for the stable update policy but let me explain my reason for asking...
I've recently been looking at producing (Unofficial) Xen compatible
Lenny install isos and the lack of this ioctl means I need some ugly
hacks in the udev and partman .udebs, if I can add the kernel side now
then if/when the installer is refreshed those hacks can be dropped.

FWIW, I think the patch itself is pretty harmless...

Ian.

-- 
Ian Campbell

No man's ambition has a right to stand in the way of performing a simple
act of justice.
		-- John Altgeld
commit 440a01a7f46742400c74d9d346118523e81d188b
Author: Christian Limpach <Christian.Limpach@xensource.com>
Date:   Tue Jun 17 10:47:08 2008 +0200

    xen/blkfront: Add the CDROM_GET_CAPABILITY ioctl to blkfront.
    
    Return 0 instead of -EINVAL if the blkfront device is a cdrom,
    i.e. had the VDISK_CDROM attribute.  This allows udev's cdrom_id
    to correctly detect the device as a cdrom device.
    
    [ Add blkif_ioctl, and CDROMMULTISESSION ]
    
    [ linux-2.6.18-xen changeset d2bd9af846b5 ]
    
    Signed-off-by: Christian Limpach <Christian.Limpach@xensource.com>
    Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index e8d3bf6..da3fee6 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -38,6 +38,7 @@
 #include <linux/interrupt.h>
 #include <linux/blkdev.h>
 #include <linux/hdreg.h>
+#include <linux/cdrom.h>
 #include <linux/module.h>
 
 #include <xen/xenbus.h>
@@ -153,6 +154,40 @@ static int blkif_getgeo(struct block_device *bd, struct hd_geometry *hg)
 	return 0;
 }
 
+int blkif_ioctl(struct inode *inode, struct file *filep,
+		unsigned command, unsigned long argument)
+{
+	struct blkfront_info *info =
+		inode->i_bdev->bd_disk->private_data;
+	int i;
+
+	dev_dbg(&info->xbdev->dev, "command: 0x%x, argument: 0x%lx\n",
+		command, (long)argument);
+
+	switch (command) {
+	case CDROMMULTISESSION:
+		dev_dbg(&info->xbdev->dev, "FIXME: support multisession CDs later\n");
+		for (i = 0; i < sizeof(struct cdrom_multisession); i++)
+			if (put_user(0, (char __user *)(argument + i)))
+				return -EFAULT;
+		return 0;
+
+	case CDROM_GET_CAPABILITY: {
+		struct gendisk *gd = info->gd;
+		if (gd->flags & GENHD_FL_CD)
+			return 0;
+		return -EINVAL;
+	}
+
+	default:
+		/*printk(KERN_ALERT "ioctl %08x not supported by Xen blkdev\n",
+		  command);*/
+		return -EINVAL; /* same return as native Linux */
+	}
+
+	return 0;
+}
+
 /*
  * blkif_queue_request
  *
@@ -974,6 +1009,7 @@ static struct block_device_operations xlvbd_block_fops =
 	.open = blkif_open,
 	.release = blkif_release,
 	.getgeo = blkif_getgeo,
+	.ioctl = blkif_ioctl,
 };
 
 
commit 62aa0054da220b8bbe6f23c0eb1d97a99005d0b3
Author: Adrian Bunk <bunk@kernel.org>
Date:   Mon Aug 4 11:59:05 2008 +0200

    xen-blkfront.c: make blkif_ioctl() static
    
    This patch makes the needlessly global blkif_ioctl() static.
    
    Signed-off-by: Adrian Bunk <bunk@kernel.org>
    Acked-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    Signed-off-by: Jens Axboe <jens.axboe@oracle.com>

diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index 9ae05c5..3ca643c 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -154,8 +154,8 @@ static int blkif_getgeo(struct block_device *bd, struct hd_geometry *hg)
 	return 0;
 }
 
-int blkif_ioctl(struct inode *inode, struct file *filep,
-		unsigned command, unsigned long argument)
+static int blkif_ioctl(struct inode *inode, struct file *filep,
+		       unsigned command, unsigned long argument)
 {
 	struct blkfront_info *info =
 		inode->i_bdev->bd_disk->private_data;

Attachment: signature.asc
Description: This is a digitally signed message part


Reply to: