All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chris Lalancette <clalance@redhat.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [PATCH 1/4]: Fix blkfront to accept expanded devices
Date: Mon, 23 Jun 2008 20:26:31 +0200	[thread overview]
Message-ID: <485FEAD7.9070206@redhat.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 463 bytes --]

This patch implements the new extended allocation scheme on the blkfront end.
Note that there is a new xenbus node for the extended stuff, called
"virtual-device-ext".  On a blkfront_probe(), if nothing is found in
"virtual-device", then it will go looking in "virtual-device-ext".  This
prevents old guest kernels from potentially mis-interpreting data in
"virtual-device" (and then subsequently crashing).

Signed-off-by: Chris Lalancette <clalance@redhat.com>

[-- Attachment #2: xen-unstable-greater-16-vbd-kernel-blkfront-fixes.patch --]
[-- Type: text/x-patch, Size: 4378 bytes --]

diff -r 5201a184f513 drivers/xen/blkfront/blkfront.c
--- a/drivers/xen/blkfront/blkfront.c	Fri Jun 20 17:43:16 2008 +0100
+++ b/drivers/xen/blkfront/blkfront.c	Mon Jun 23 17:56:00 2008 +0200
@@ -92,8 +92,13 @@ static int blkfront_probe(struct xenbus_
 	err = xenbus_scanf(XBT_NIL, dev->nodename,
 			   "virtual-device", "%i", &vdevice);
 	if (err != 1) {
-		xenbus_dev_fatal(dev, err, "reading virtual-device");
-		return err;
+		/* go looking in the extended area instead */
+		err = xenbus_scanf(XBT_NIL, dev->nodename, "virtual-device-ext",
+			"%i", &vdevice);
+		if (err != 1) {
+			xenbus_dev_fatal(dev, err, "reading virtual-device");
+			return err;
+		}
 	}
 
 	info = kzalloc(sizeof(*info), GFP_KERNEL);
diff -r 5201a184f513 drivers/xen/blkfront/vbd.c
--- a/drivers/xen/blkfront/vbd.c	Fri Jun 20 17:43:16 2008 +0100
+++ b/drivers/xen/blkfront/vbd.c	Mon Jun 23 17:56:00 2008 +0200
@@ -43,6 +43,9 @@
 #define BLKIF_MAJOR(dev) ((dev)>>8)
 #define BLKIF_MINOR(dev) ((dev) & 0xff)
 
+#define VDEV_IS_EXTENDED(dev) (dev & (1<<28))
+#define BLKIF_MINOR_EXT(dev) ((dev)&0x0FFFFFFF)
+
 /*
  * For convenience we distinguish between ide, scsi and 'other' (i.e.,
  * potentially combinations of the two) in the naming scheme and in a few other
@@ -84,10 +87,6 @@ static struct xlbd_major_info *major_inf
 #define XLBD_MAJOR_IDE_RANGE	XLBD_MAJOR_IDE_START ... XLBD_MAJOR_SCSI_START - 1
 #define XLBD_MAJOR_SCSI_RANGE	XLBD_MAJOR_SCSI_START ... XLBD_MAJOR_VBD_START - 1
 #define XLBD_MAJOR_VBD_RANGE	XLBD_MAJOR_VBD_START ... XLBD_MAJOR_VBD_START + NUM_VBD_MAJORS - 1
-
-/* Information about our VBDs. */
-#define MAX_VBDS 64
-static LIST_HEAD(vbds_list);
 
 static struct block_device_operations xlvbd_block_fops =
 {
@@ -144,8 +143,14 @@ xlbd_get_major_info(int vdevice)
 	struct xlbd_major_info *mi;
 	int major, minor, index;
 
-	major = BLKIF_MAJOR(vdevice);
-	minor = BLKIF_MINOR(vdevice);
+	if (!VDEV_IS_EXTENDED(vdevice)) {
+		major = BLKIF_MAJOR(vdevice);
+		minor = BLKIF_MINOR(vdevice);
+	}
+	else {
+		major = 202;
+		minor = BLKIF_MINOR_EXT(vdevice);
+	}
 
 	switch (major) {
 	case IDE0_MAJOR: index = 0; break;
@@ -231,6 +236,7 @@ xlvbd_alloc_gendisk(int minor, blkif_sec
 	int nr_minors = 1;
 	int err = -ENODEV;
 	unsigned int offset;
+	int part_shift;
 
 	BUG_ON(info->gd != NULL);
 	BUG_ON(info->mi != NULL);
@@ -241,15 +247,19 @@ xlvbd_alloc_gendisk(int minor, blkif_sec
 		goto out;
 	info->mi = mi;
 
-	if ((minor & ((1 << mi->type->partn_shift) - 1)) == 0)
-		nr_minors = 1 << mi->type->partn_shift;
+	part_shift = mi->type->partn_shift;
+	if (VDEV_IS_EXTENDED(vdevice))
+		part_shift += 4;
+
+	if ((minor & ((1 << part_shift) - 1)) == 0)
+		nr_minors = 1 << part_shift;
 
 	gd = alloc_disk(nr_minors);
 	if (gd == NULL)
 		goto out;
 
-	offset =  mi->index * mi->type->disks_per_major +
-			(minor >> mi->type->partn_shift);
+	offset =  mi->index * mi->type->disks_per_major + (minor >> part_shift);
+
 	if (nr_minors > 1) {
 		if (offset < 26) {
 			sprintf(gd->disk_name, "%s%c",
@@ -266,13 +276,13 @@ xlvbd_alloc_gendisk(int minor, blkif_sec
 			sprintf(gd->disk_name, "%s%c%d",
 				mi->type->diskname,
 				'a' + offset,
-				minor & ((1 << mi->type->partn_shift) - 1));
+				minor & ((1 << part_shift) - 1));
 		}
 		else {
 			sprintf(gd->disk_name, "%s%c%c%d",
 				mi->type->diskname,
 				'a' + ((offset/26)-1), 'a' + (offset%26),
-				minor & ((1 << mi->type->partn_shift) - 1));
+				minor & ((1 << part_shift) - 1));
 		}
 	}
 
@@ -319,14 +329,26 @@ xlvbd_add(blkif_sector_t capacity, int v
 	struct block_device *bd;
 	int err = 0;
 
-	info->dev = MKDEV(BLKIF_MAJOR(vdevice), BLKIF_MINOR(vdevice));
+	if (!VDEV_IS_EXTENDED(vdevice)) {
+		info->dev = MKDEV(BLKIF_MAJOR(vdevice), BLKIF_MINOR(vdevice));
+		bd = bdget(info->dev);
+		if (bd == NULL)
+			return -ENODEV;
 
-	bd = bdget(info->dev);
-	if (bd == NULL)
-		return -ENODEV;
+		err = xlvbd_alloc_gendisk(BLKIF_MINOR(vdevice), capacity,
+					  vdevice, vdisk_info, sector_size,
+					  info);
+	}
+	else {
+		info->dev = MKDEV(202, BLKIF_MINOR_EXT(vdevice));
+		bd = bdget(info->dev);
+		if (bd == NULL)
+			return -ENODEV;
 
-	err = xlvbd_alloc_gendisk(BLKIF_MINOR(vdevice), capacity, vdevice,
-				  vdisk_info, sector_size, info);
+		err = xlvbd_alloc_gendisk(BLKIF_MINOR_EXT(vdevice), capacity,
+					  vdevice, vdisk_info, sector_size,
+					  info);
+	}
 
 	bdput(bd);
 	return err;

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

             reply	other threads:[~2008-06-23 18:26 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-06-23 18:26 Chris Lalancette [this message]
2008-06-23 18:26 ` [PATCH 0/4]: Expand xvd to support > 16 devices Chris Lalancette
2008-06-23 19:24   ` Ian Jackson
2008-06-25  9:45     ` Chris Lalancette
2008-06-25 11:19       ` Keir Fraser

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=485FEAD7.9070206@redhat.com \
    --to=clalance@redhat.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.