[PATCH 2/2][PV-on-HVM][linux-2.6.18-xen.hg] Enable Front-end drivers for
2.4 kernels
This patch enables front end drivers to build under Linux 2.4 (RHEL3-U8)
Signed-off-by: Paul Burkacki <pburkacki@xxxxxxxxxxxxxxx>
Signed-off-by: Ben Guthro <buthro@xxxxxxxxxxxxxxx>
diffstat linux-RHEL3U8-port.patch
b/include/xen/kerncompat.h | 216
+++++++++++++++++++++++++++
drivers/xen/balloon/balloon.c | 4
drivers/xen/balloon/sysfs.c | 4
drivers/xen/blkfront/blkfront.c | 124 +++++++++++++--
drivers/xen/blkfront/block.h | 8 +
drivers/xen/blkfront/vbd.c | 207
+++++++++++++++++++++++++
drivers/xen/core/features.c | 4
drivers/xen/core/gnttab.c | 6
drivers/xen/core/reboot.c | 16 +-
drivers/xen/netfront/accel.c | 4
drivers/xen/netfront/netfront.c | 2
drivers/xen/xenbus/Makefile | 21 ++
drivers/xen/xenbus/xenbus_client.c | 4
drivers/xen/xenbus/xenbus_comms.c | 4
drivers/xen/xenbus/xenbus_dev.c | 6
drivers/xen/xenbus/xenbus_probe.c | 4
drivers/xen/xenbus/xenbus_probe_backend.c | 4
drivers/xen/xenbus/xenbus_xs.c | 4
include/asm-i386/mach-xen/asm/synch_bitops.h | 4
19 files changed, 577 insertions(+), 69 deletions(-)
[PATCH 2/2][PV-on-HVM][linux-2.6.18-xen.hg] Enable Front-end drivers for 2.4
kernels
This patch enables front end drivers to build under Linux 2.4 (RHEL3-U8)
Signed-off-by: Paul Burkacki <pburkacki@xxxxxxxxxxxxxxx>
Signed-off-by: Ben Guthro <buthro@xxxxxxxxxxxxxxx>
diff -r fc406f9e9a0a drivers/xen/balloon/balloon.c
--- a/drivers/xen/balloon/balloon.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/balloon/balloon.c Tue Dec 18 11:27:24 2007 -0500
@@ -59,9 +59,7 @@
#include <xen/xenbus.h>
#include "common.h"
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
#ifdef CONFIG_PROC_FS
static struct proc_dir_entry *balloon_pde;
diff -r fc406f9e9a0a drivers/xen/balloon/sysfs.c
--- a/drivers/xen/balloon/sysfs.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/balloon/sysfs.c Tue Dec 18 11:27:24 2007 -0500
@@ -35,9 +35,7 @@
#include <linux/sysdev.h>
#include "common.h"
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
#define BALLOON_CLASS_NAME "memory"
diff -r fc406f9e9a0a drivers/xen/blkfront/blkfront.c
--- a/drivers/xen/blkfront/blkfront.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/blkfront/blkfront.c Tue Dec 18 16:35:19 2007 -0500
@@ -49,9 +49,7 @@
#include <asm/hypervisor.h>
#include <asm/maddr.h>
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
#define BLKIF_STATE_DISCONNECTED 0
#define BLKIF_STATE_CONNECTED 1
@@ -353,7 +351,7 @@ static void connect(struct blkfront_info
kick_pending_request_queues(info);
spin_unlock_irq(&blkif_io_lock);
- add_disk(info->gd);
+ compat_add_disk(info->gd, info->dev);
info->is_ready = 1;
}
@@ -460,7 +458,11 @@ static void blkif_restart_queue_callback
int blkif_open(struct inode *inode, struct file *filep)
{
- struct blkfront_info *info = inode->i_bdev->bd_disk->private_data;
+ struct blkfront_info *info = compat_inode_to_info(inode);
+
+ if (info == NULL)
+ return -ENODEV;
+
info->users++;
return 0;
}
@@ -468,7 +470,8 @@ int blkif_open(struct inode *inode, stru
int blkif_release(struct inode *inode, struct file *filep)
{
- struct blkfront_info *info = inode->i_bdev->bd_disk->private_data;
+ struct blkfront_info *info = compat_inode_to_info(inode);
+
info->users--;
if (info->users == 0) {
/* Check whether we have been instructed to close. We will
@@ -487,6 +490,9 @@ int blkif_ioctl(struct inode *inode, str
int blkif_ioctl(struct inode *inode, struct file *filep,
unsigned command, unsigned long argument)
{
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+ struct gendisk *disk = get_gendisk(inode->i_rdev);
+#endif
int i;
DPRINTK_IOCTL("command: 0x%x, argument: 0x%lx, dev: 0x%04x\n",
@@ -514,6 +520,26 @@ int blkif_ioctl(struct inode *inode, str
return 0;
}
#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+ case HDIO_GETGEO_BIG:
+// Is this needed?
+ return -ENOSYS;
+
+ case BLKGETSIZE64:
+ return put_user((uint64_t)
(disk->part[MINOR(inode->i_rdev)].nr_sects * 512),
+ (uint64_t *) argument);
+
+ case BLKGETSIZE:
+ return put_user(disk->part[MINOR(inode->i_rdev)].nr_sects,
(unsigned long *) argument);
+
+ case BLKSSZGET:
+ return
hardsect_size[MAJOR(inode->i_rdev)][MINOR(inode->i_rdev)];
+
+ case BLKRRPART:
+ return blkif_revalidate(inode->i_rdev);
+#endif
+
case CDROMMULTISESSION:
DPRINTK("FIXME: support multisession CDs later\n");
for (i = 0; i < sizeof(struct cdrom_multisession); i++)
@@ -522,10 +548,9 @@ int blkif_ioctl(struct inode *inode, str
return 0;
case CDROM_GET_CAPABILITY: {
- struct blkfront_info *info =
- inode->i_bdev->bd_disk->private_data;
+ struct blkfront_info *info = compat_inode_to_info(inode);
struct gendisk *gd = info->gd;
- if (gd->flags & GENHD_FL_CD)
+ if (compat_get_disk_flags(gd) & GENHD_FL_CD)
return 0;
return -EINVAL;
}
@@ -538,12 +563,11 @@ int blkif_ioctl(struct inode *inode, str
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 nsect = compat_get_capacity(bd);
sector_t cylinders = nsect;
hg->heads = 0xff;
@@ -555,6 +579,59 @@ int blkif_getgeo(struct block_device *bd
return 0;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+int blkif_revalidate(dev_t dev)
+{
+ struct block_device *bd;
+ struct gendisk *gd;
+ struct blkfront_info *info;
+ struct inode inode;
+ unsigned long capacity;
+ int i, rc = 0;
+
+ if ((bd = bdget(dev)) == NULL)
+ return -EINVAL;
+
+ /*
+ * Update of partition info, and check of usage count, is protected
+ * by the per-block-device semaphore.
+ */
+ down(&bd->bd_sem);
+
+ inode.i_rdev = dev;
+
+ if (((gd = get_gendisk(dev)) == NULL) ||
+ ((info = compat_inode_to_info(&inode)) == NULL) ||
+ ((capacity = gd->part[MINOR(dev)].nr_sects) == 0)) {
+ rc = -EINVAL;
+ goto out;
+ }
+
+ /* Only reread partition table if VBDs aren't mapped to partitions. */
+ if (!(gd->flags[MINOR(dev) >> gd->minor_shift] & GENHD_FL_VIRT_PARTNS))
{
+ for (i = gd->max_p - 1; i >= 0; i--) {
+ invalidate_device(dev+i, 1);
+ gd->part[MINOR(dev+i)].start_sect = 0;
+ gd->part[MINOR(dev+i)].nr_sects = 0;
+ gd->sizes[MINOR(dev+i)] = 0;
+ }
+
+ /*
+ * FIXME: The correct thing to do is to re-read the
+ * size from xenbus here. That would be more intrusive
+ * than I would like right now.
+ */
+ gd->part[MINOR(dev)].nr_sects = capacity;
+
+ compat_add_disk(gd, dev);
+ }
+
+ out:
+ up(&bd->bd_sem);
+ bdput(bd);
+ return rc;
+}
+#endif
/*
* blkif_queue_request
@@ -568,7 +645,7 @@ int blkif_getgeo(struct block_device *bd
*/
static int blkif_queue_request(struct request *req)
{
- struct blkfront_info *info = req->rq_disk->private_data;
+ struct blkfront_info *info = compat_req_to_info(req);
unsigned long buffer_mfn;
blkif_request_t *ring_req;
struct bio *bio;
@@ -598,7 +675,7 @@ static int blkif_queue_request(struct re
info->shadow[id].request = (unsigned long)req;
ring_req->id = id;
- ring_req->sector_number = (blkif_sector_t)req->sector;
+ ring_req->sector_number = (blkif_sector_t)
compat_get_sector_number(req);
ring_req->handle = info->handle;
ring_req->operation = rq_data_dir(req) ?
@@ -662,21 +739,30 @@ void do_blkif_request(request_queue_t *r
queued = 0;
while ((req = elv_next_request(rq)) != NULL) {
- info = req->rq_disk->private_data;
+ info = compat_req_to_info(req);
if (!blk_fs_request(req)) {
- end_request(req, 0);
+ compat_end_request(req, 0);
continue;
}
if (RING_FULL(&info->ring))
goto wait;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+ DPRINTK("do_blk_req %p: cmd %u, sec %lx, "
+ "(%lu/%li) buffer:%p [%s]\n",
+ req, req->cmd, (unsigned long)req->sector,
+ req->current_nr_sectors,
+ req->nr_sectors, req->buffer,
+ rq_data_dir(req) ? "write" : "read");
+#else
DPRINTK("do_blk_req %p: cmd %p, sec %llx, "
"(%u/%li) buffer:%p [%s]\n",
req, req->cmd, (long long)req->sector,
req->current_nr_sectors,
req->nr_sectors, req->buffer,
rq_data_dir(req) ? "write" : "read");
+#endif
blkdev_dequeue_request(req);
@@ -733,7 +819,7 @@ static irqreturn_t blkif_int(int irq, vo
case BLKIF_OP_WRITE_BARRIER:
if (unlikely(bret->status == BLKIF_RSP_EOPNOTSUPP)) {
printk("blkfront: %s: write barrier op
failed\n",
- info->gd->disk_name);
+ compat_get_disk_name(info));
uptodate = -EOPNOTSUPP;
info->feature_barrier = 0;
xlvbd_barrier(info);
@@ -745,10 +831,10 @@ static irqreturn_t blkif_int(int irq, vo
DPRINTK("Bad return from blkdev data "
"request: %x\n", bret->status);
- ret = end_that_request_first(req, uptodate,
- req->hard_nr_sectors);
+ ret = compat_end_that_request_first(req, uptodate,
+
req->hard_nr_sectors);
BUG_ON(ret);
- end_that_request_last(req, uptodate);
+ compat_end_that_request_last(req, uptodate);
break;
default:
BUG();
diff -r fc406f9e9a0a drivers/xen/blkfront/block.h
--- a/drivers/xen/blkfront/block.h Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/blkfront/block.h Tue Dec 18 16:35:19 2007 -0500
@@ -118,6 +118,11 @@ struct blkfront_info
* hot-unplug unless this is 0.
*/
int users;
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+ request_queue_t req_queue;
+ int req_queue_busy;
+#endif
};
extern spinlock_t blkif_io_lock;
@@ -139,5 +144,8 @@ int xlvbd_add(blkif_sector_t capacity, i
u16 vdisk_info, u16 sector_size, struct blkfront_info *info);
void xlvbd_del(struct blkfront_info *info);
int xlvbd_barrier(struct blkfront_info *info);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+void xlvbd_register_disk(struct gendisk *gd, dev_t dev);
+#endif
#endif /* __XEN_DRIVERS_BLOCK_H__ */
diff -r fc406f9e9a0a drivers/xen/blkfront/vbd.c
--- a/drivers/xen/blkfront/vbd.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/blkfront/vbd.c Tue Dec 18 11:27:24 2007 -0500
@@ -36,9 +36,7 @@
#include <linux/blkdev.h>
#include <linux/list.h>
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
#define BLKIF_MAJOR(dev) ((dev)>>8)
#define BLKIF_MINOR(dev) ((dev) & 0xff)
@@ -98,9 +96,15 @@ static struct block_device_operations xl
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
.getgeo = blkif_getgeo
#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+ .revalidate = blkif_revalidate,
+#endif
};
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
DEFINE_SPINLOCK(blkif_io_lock);
+#endif
static struct xlbd_major_info *
xlbd_alloc_major_info(int major, int minor, int index)
@@ -128,7 +132,7 @@ xlbd_alloc_major_info(int major, int min
break;
}
- if (register_blkdev(ptr->major, ptr->type->devname)) {
+ if (compat_register_blkdev(ptr->major, ptr->type->devname,
&xlvbd_block_fops)) {
kfree(ptr);
return NULL;
}
@@ -183,6 +187,163 @@ xlbd_put_major_info(struct xlbd_major_in
/* XXX: release major if 0 */
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+static inline request_queue_t * xlvbd_find_queue(dev_t dev)
+{
+ struct inode inode;
+ struct blkfront_info *info;
+
+ inode.i_rdev = dev;
+ info = compat_inode_to_info(&inode);
+
+ if (info)
+ return info->rq;
+
+ return NULL;
+}
+
+static int xlvbd_alloc_gendisk(int minor, blkif_sector_t capacity, int vdevice,
+ u16 vdisk_info, u16 sector_size, struct
blkfront_info *info)
+{
+ struct gendisk *gd;
+ struct xlbd_major_info *mi;
+ int nr_minors = 1;
+ int i;
+ int err = -ENODEV;
+
+ BUG_ON(info->gd != NULL);
+ BUG_ON(info->mi != NULL);
+ BUG_ON(info->rq != NULL);
+
+ mi = xlbd_get_major_info(vdevice);
+ if (mi == NULL)
+ goto out;
+ info->mi = mi;
+
+ if ((minor & ((1 << mi->type->partn_shift) - 1)) == 0)
+ nr_minors = 1 << mi->type->partn_shift;
+
+ if ((gd = get_gendisk(vdevice)) != NULL)
+ goto already_got_one;
+
+ gd = kmalloc(sizeof(struct gendisk), GFP_KERNEL);
+
+ if (gd == NULL) {
+ err = -ENOMEM;
+ goto out;
+ }
+
+ memset(gd, 0, sizeof(struct gendisk));
+
+ /*
+ * Initialize kernel's block device arrays.
+ *
+ * TODO: note that 8192 bytes of data can be saved here when IDE disks
+ * are accelerated. This is because only disks of type SCSI and VBD
+ * create 256 minors (mi->type->disks_per_major * (1 <<
mi->type->partn_shift)).
+ * Disks of type IDE need only 128. However, for now, a hardcoded value
+ * of 256 is used below.
+ */
+ blksize_size[mi->major] = kmalloc(256 * sizeof(int), GFP_KERNEL);
+ hardsect_size[mi->major] = kmalloc(256 * sizeof(int), GFP_KERNEL);
+ max_sectors[mi->major] = kmalloc(256 * sizeof(int), GFP_KERNEL);
+
+ if (blksize_size[mi->major] == NULL || hardsect_size[mi->major] == NULL
||
+ max_sectors[mi->major] == NULL)
+ goto out_free;
+
+ for (i = 0; i < 256; i++) {
+ blksize_size[mi->major][i] = 1024;
+ hardsect_size[mi->major][i] = 512;
+ max_sectors[mi->major][i] = BLKIF_MAX_SEGMENTS_PER_REQUEST;
+ }
+
+ read_ahead[mi->major] = 8;
+
+ blk_dev[MAJOR(vdevice)].queue = xlvbd_find_queue;
+
+ gd->major = mi->major;
+ gd->major_name = mi->type->devname;
+ gd->fops = &xlvbd_block_fops;
+ gd->minor_shift = mi->type->partn_shift;
+ gd->max_p = 1 << mi->type->partn_shift;
+ gd->nr_real = mi->type->disks_per_major;
+
+ gd->real_devices = kmalloc(gd->max_p * gd->nr_real * sizeof(struct
blkfront_info *),
+ GFP_KERNEL);
+ memset(gd->real_devices, 0, gd->max_p * gd->nr_real * sizeof(struct
blkfront_info *));
+
+ gd->sizes = kmalloc(gd->max_p * gd->nr_real * sizeof(int), GFP_KERNEL);
+ gd->part = kmalloc(gd->max_p * gd->nr_real * sizeof(struct hd_struct),
GFP_KERNEL);
+ memset(gd->sizes, 0, gd->max_p * gd->nr_real * sizeof(int));
+ memset(gd->part, 0, gd->max_p * gd->nr_real * sizeof(struct hd_struct));
+
+ gd->next = NULL;
+
+ gd->de_arr = kmalloc(gd->nr_real * sizeof(*gd->de_arr), GFP_KERNEL);
+ gd->flags = kmalloc(gd->nr_real * sizeof(*gd->flags), GFP_KERNEL);
+ memset(gd->de_arr, 0, gd->nr_real * sizeof(*gd->de_arr));
+ memset(gd->flags, 0, gd->nr_real * sizeof(*gd->flags));
+
+ blk_size[mi->major] = gd->sizes;
+
+ add_gendisk(gd);
+
+already_got_one:
+ memset(&info->req_queue, 0, sizeof(request_queue_t));
+ info->req_queue_busy = 0;
+
+ blk_init_queue(&info->req_queue, do_blkif_request);
+ /*
+ * Xen implementation makes this call but our original code chose not
+ * to. Should we go ahead and call this?
+ */
+// blk_queue_headactive(&info->req_queue, 0);
+
+ info->rq = &info->req_queue;
+
+ ((struct blkfront_info **)gd->real_devices)[minor] = info;
+
+ /* Setup needed for partitions with minors other than 0. */
+ if (minor & (gd->max_p - 1)) {
+ gd->part[minor].start_sect = 0;
+ gd->flags[minor >> gd->minor_shift] |= GENHD_FL_VIRT_PARTNS;
+ }
+
+ /* Setup needed for all partitions. */
+ gd->part[minor].nr_sects = capacity;
+ gd->sizes[minor] = capacity >> (BLOCK_SIZE_BITS - 9);
+ hardsect_size[mi->major][minor] = sector_size;
+ set_blocksize(vdevice, sector_size);
+
+ if (vdisk_info & VDISK_READONLY)
+ set_device_ro(vdevice, 1);
+
+ if (vdisk_info & VDISK_REMOVABLE)
+ gd->flags[minor >> gd->minor_shift] |= GENHD_FL_REMOVABLE;
+
+ if (vdisk_info & VDISK_CDROM)
+ gd->flags[gd->major] |= GENHD_FL_CD;
+
+ info->gd = gd;
+
+ return 0;
+
+ out_free:
+ kfree(blksize_size[mi->major]);
+ kfree(hardsect_size[mi->major]);
+ kfree(max_sectors[mi->major]);
+ kfree(gd);
+
+ out:
+ if (mi)
+ xlbd_put_major_info(mi);
+ info->mi = NULL;
+ return err;
+}
+
+#else /* 2.6 version of xlvbd_init_blk_queue() and xlvbd_alloc_gendisk() */
+
static int
xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
{
@@ -312,6 +473,8 @@ xlvbd_alloc_gendisk(int minor, blkif_sec
return err;
}
+#endif
+
int
xlvbd_add(blkif_sector_t capacity, int vdevice, u16 vdisk_info,
u16 sector_size, struct blkfront_info *info)
@@ -335,6 +498,14 @@ void
void
xlvbd_del(struct blkfront_info *info)
{
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+ struct block_device *bd;
+
+ bd = bdget(info->dev);
+ if (bd == NULL)
+ return;
+#endif
+
if (info->mi == NULL)
return;
@@ -349,6 +520,19 @@ xlvbd_del(struct blkfront_info *info)
BUG_ON(info->rq == NULL);
blk_cleanup_queue(info->rq);
info->rq = NULL;
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+ /* Clean up the global arrays */
+ read_ahead[MAJOR(info->dev)] = 0;
+ kfree(blk_size[MAJOR(info->dev)]);
+ blk_size[MAJOR(info->dev)] = NULL;
+ kfree(blksize_size[MAJOR(info->dev)]);
+ blksize_size[MAJOR(info->dev)] = NULL;
+ kfree(hardsect_size[MAJOR(info->dev)]);
+ hardsect_size[MAJOR(info->dev)] = NULL;
+
+ bdput(bd);
+#endif
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
@@ -362,14 +546,25 @@ xlvbd_barrier(struct blkfront_info *info
if (err)
return err;
printk(KERN_INFO "blkfront: %s: barriers %s\n",
- info->gd->disk_name, info->feature_barrier ? "enabled" :
"disabled");
+ compat_get_disk_name(info), info->feature_barrier ? "enabled" :
"disabled");
return 0;
}
#else
int
xlvbd_barrier(struct blkfront_info *info)
{
- printk(KERN_INFO "blkfront: %s: barriers disabled\n",
info->gd->disk_name);
+ printk(KERN_INFO "blkfront: %s: barriers disabled\n",
compat_get_disk_name(info));
return -ENOSYS;
}
#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+void xlvbd_register_disk(struct gendisk *gd, dev_t dev)
+{
+ if ((gd->max_p - 1) & dev)
+ return;
+
+ register_disk(gd, dev, gd->max_p, &xlvbd_block_fops,
+ gd->part[MINOR(dev)].nr_sects);
+}
+#endif
diff -r fc406f9e9a0a drivers/xen/core/features.c
--- a/drivers/xen/core/features.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/core/features.c Tue Dec 18 11:27:24 2007 -0500
@@ -11,9 +11,7 @@
#include <asm/hypervisor.h>
#include <xen/features.h>
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
u8 xen_features[XENFEAT_NR_SUBMAPS * 32] __read_mostly;
/* Not a GPL symbol: used in ubiquitous macros, so too restrictive. */
diff -r fc406f9e9a0a drivers/xen/core/gnttab.c
--- a/drivers/xen/core/gnttab.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/core/gnttab.c Tue Dec 18 11:27:24 2007 -0500
@@ -45,9 +45,7 @@
#include <xen/driver_util.h>
#include <asm/gnttab_dma.h>
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
/* External tools reserve first few grant table entries. */
#define NR_RESERVED_ENTRIES 8
@@ -120,7 +118,7 @@ static void do_free_callbacks(void)
static inline void check_free_callbacks(void)
{
- if (unlikely(gnttab_free_callback_list))
+ if (unlikely(gnttab_free_callback_list != NULL))
do_free_callbacks();
}
diff -r fc406f9e9a0a drivers/xen/core/reboot.c
--- a/drivers/xen/core/reboot.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/core/reboot.c Tue Dec 18 16:36:01 2007 -0500
@@ -9,11 +9,11 @@
#include <xen/xenbus.h>
#include <linux/kmod.h>
#include <linux/slab.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
#include <linux/workqueue.h>
-
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
#endif
+
+#include <xen/kerncompat.h>
MODULE_LICENSE("Dual BSD/GPL");
@@ -49,8 +49,8 @@ static int shutdown_process(void *__unus
if ((shutting_down == SHUTDOWN_POWEROFF) ||
(shutting_down == SHUTDOWN_HALT)) {
- if (call_usermodehelper("/sbin/poweroff", poweroff_argv,
- envp, 0) < 0) {
+ if (compat_call_usermodehelper("/sbin/poweroff", poweroff_argv,
+ envp, 0) < 0) {
#ifdef CONFIG_XEN
sys_reboot(LINUX_REBOOT_MAGIC1,
LINUX_REBOOT_MAGIC2,
@@ -69,8 +69,8 @@ static int xen_suspend(void *__unused)
{
int err;
- daemonize("suspend");
- err = set_cpus_allowed(current, cpumask_of_cpu(0));
+ compat_daemonize("suspend");
+ err = compat_set_cpus_allowed(current, cpumask_of_cpu(0));
if (err) {
printk(KERN_ERR "Xen suspend can't run on CPU0 (%d)\n", err);
goto out;
@@ -177,7 +177,7 @@ static void sysrq_handler(struct xenbus_
#ifdef CONFIG_MAGIC_SYSRQ
if (sysrq_key != '\0')
- handle_sysrq(sysrq_key, NULL, NULL);
+ compat_handle_sysrq(sysrq_key, NULL, NULL);
#endif
}
diff -r fc406f9e9a0a drivers/xen/netfront/accel.c
--- a/drivers/xen/netfront/accel.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/netfront/accel.c Tue Dec 18 11:27:24 2007 -0500
@@ -37,6 +37,8 @@
#include "netfront.h"
+#include <xen/kerncompat.h>
+
#define DPRINTK(fmt, args...) \
pr_debug("netfront/accel (%s:%d) " fmt, \
__FUNCTION__, __LINE__, ##args)
@@ -272,7 +274,7 @@ int netfront_load_accelerator(struct net
DPRINTK("requesting module %s\n", frontend);
/* load module */
- request_module("%s", frontend);
+ compat_request_module("%s", frontend);
/*
* Module should now call netfront_accelerator_loaded() once
diff -r fc406f9e9a0a drivers/xen/netfront/netfront.c
--- a/drivers/xen/netfront/netfront.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/netfront/netfront.c Tue Dec 18 16:35:19 2007 -0500
@@ -1862,6 +1862,7 @@ static struct ethtool_ops network_ethtoo
{
.get_tx_csum = ethtool_op_get_tx_csum,
.set_tx_csum = ethtool_op_set_tx_csum,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
.get_sg = ethtool_op_get_sg,
.set_sg = xennet_set_sg,
#if HAVE_TSO
@@ -1869,6 +1870,7 @@ static struct ethtool_ops network_ethtoo
.set_tso = xennet_set_tso,
#endif
.get_link = ethtool_op_get_link,
+#endif
};
#ifdef CONFIG_SYSFS
diff -r fc406f9e9a0a drivers/xen/xenbus/Makefile
--- a/drivers/xen/xenbus/Makefile Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/xenbus/Makefile Tue Dec 18 11:27:24 2007 -0500
@@ -1,3 +1,4 @@ obj-y += xenbus_client.o xenbus_comms.o
+ifeq ($(VERSION).$(PATCHLEVEL),2.6)
obj-y += xenbus_client.o xenbus_comms.o xenbus_xs.o xenbus_probe.o
obj-$(CONFIG_XEN_BACKEND) += xenbus_be.o
@@ -7,3 +8,23 @@ xenbus-$(CONFIG_XEN_BACKEND) += xenbus_p
xenbus-$(CONFIG_XEN_BACKEND) += xenbus_probe_backend.o
obj-y += $(xenbus-y) $(xenbus-m)
obj-$(CONFIG_XEN_XENBUS_DEV) += xenbus_dev.o
+endif
+
+ifeq ($(VERSION).$(PATCHLEVEL),2.4)
+O_TARGET := xenbus_be.o
+
+export-objs := xenbus_client.o xenbus_probe.o xenbus_xs.o
xenbus_backend_client.o
+
+obj-y := xenbus_client.o xenbus_comms.o xenbus_xs.o xenbus_probe.o
xenbus_backend_client.o
+obj-$(CONFIG_XEN_BACKEND) += $(O_TARGET)
+
+
+O_TARGET := xenbus_dev.o
+
+export-objs := xenbus_probe_backend.o
+
+obj-y := xenbus_probe_backend.o
+obj-$(CONFIG_XEN_XENBUS_DEV) += $(O_TARGET)
+
+include $(TOPDIR)/Rules.make
+endif
diff -r fc406f9e9a0a drivers/xen/xenbus/xenbus_client.c
--- a/drivers/xen/xenbus/xenbus_client.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/xenbus/xenbus_client.c Tue Dec 18 11:27:24 2007 -0500
@@ -36,9 +36,7 @@
#include <xen/xenbus.h>
#include <xen/driver_util.h>
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
#define DPRINTK(fmt, args...) \
pr_debug("xenbus_client (%s:%d) " fmt ".\n", __FUNCTION__, __LINE__,
##args)
diff -r fc406f9e9a0a drivers/xen/xenbus/xenbus_comms.c
--- a/drivers/xen/xenbus/xenbus_comms.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/xenbus/xenbus_comms.c Tue Dec 18 11:27:24 2007 -0500
@@ -43,9 +43,7 @@
#include "xenbus_comms.h"
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
static int xenbus_irq;
diff -r fc406f9e9a0a drivers/xen/xenbus/xenbus_dev.c
--- a/drivers/xen/xenbus/xenbus_dev.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/xenbus/xenbus_dev.c Tue Dec 18 11:27:24 2007 -0500
@@ -49,9 +49,7 @@
#include <xen/xen_proc.h>
#include <asm/hypervisor.h>
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
struct xenbus_dev_transaction {
struct list_head list;
@@ -398,7 +396,7 @@ int xenbus_dev_init(void)
{
xenbus_dev_intf = create_xen_proc_entry("xenbus", 0400);
if (xenbus_dev_intf)
- xenbus_dev_intf->proc_fops = &xenbus_dev_file_ops;
+ xenbus_dev_intf->proc_fops = (struct file_operations *)
&xenbus_dev_file_ops;
return 0;
}
diff -r fc406f9e9a0a drivers/xen/xenbus/xenbus_probe.c
--- a/drivers/xen/xenbus/xenbus_probe.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/xenbus/xenbus_probe.c Tue Dec 18 16:35:19 2007 -0500
@@ -59,9 +59,7 @@
#include "xenbus_comms.h"
#include "xenbus_probe.h"
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
int xen_store_evtchn;
struct xenstore_domain_interface *xen_store_interface;
diff -r fc406f9e9a0a drivers/xen/xenbus/xenbus_probe_backend.c
--- a/drivers/xen/xenbus/xenbus_probe_backend.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/xenbus/xenbus_probe_backend.c Tue Dec 18 16:35:19 2007 -0500
@@ -57,9 +57,7 @@
#include "xenbus_comms.h"
#include "xenbus_probe.h"
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
static int xenbus_uevent_backend(struct device *dev, char **envp,
int num_envp, char *buffer, int buffer_size);
diff -r fc406f9e9a0a drivers/xen/xenbus/xenbus_xs.c
--- a/drivers/xen/xenbus/xenbus_xs.c Fri Dec 14 11:28:40 2007 +0000
+++ b/drivers/xen/xenbus/xenbus_xs.c Tue Dec 18 11:27:24 2007 -0500
@@ -47,9 +47,7 @@
#include <xen/xenbus.h>
#include "xenbus_comms.h"
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
#ifndef PF_NOFREEZE /* Old kernel (pre-2.6.6). */
#define PF_NOFREEZE 0
diff -r fc406f9e9a0a include/asm-i386/mach-xen/asm/synch_bitops.h
--- a/include/asm-i386/mach-xen/asm/synch_bitops.h Fri Dec 14 11:28:40
2007 +0000
+++ b/include/asm-i386/mach-xen/asm/synch_bitops.h Tue Dec 18 11:27:24
2007 -0500
@@ -7,9 +7,7 @@
* when communicating with Xen or other guest OSes running on other CPUs.
*/
-#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-#include <xen/platform-compat.h>
-#endif
+#include <xen/kerncompat.h>
#define ADDR (*(volatile long *) addr)
diff -r fc406f9e9a0a include/xen/kerncompat.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/xen/kerncompat.h Tue Dec 18 11:27:24 2007 -0500
@@ -0,0 +1,216 @@
+#ifndef _XEN_KERNCOMPAT_H_
+#define _XEN_KERNCOMPAT_H_
+
+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
+#include <xen/platform-compat.h>
+#endif
+
+#include <linux/version.h>
+
+/*
+ * Define a compatibility macro to hide the difference between the 2.6 and
+ * the 2.4 version of handle_sysrq().
+ */
+#if defined(_LINUX_SYSRQ_H) && LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18)
+#define handle_sysrq(x,y,z) handle_sysrq(x,y)
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
+#define compat_handle_sysrq(x, y, z) handle_sysrq(x, y, z)
+#elif defined(__LINUX_SYSRQ_H__)
+#define compat_handle_sysrq(x, y, z) handle_sysrq(x, y, z, NULL)
+#endif
+
+/*
+ * Hide the difference between the 2.4 and 2.6 version of
call_usermodehelper().
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#include <linux/kmod.h>
+#define compat_call_usermodehelper(path, argv, envp, wait)
call_usermodehelper((path), (argv), (envp))
+#else
+#define compat_call_usermodehelper(path, argv, envp, wait)
call_usermodehelper((path), (argv), (envp), (wait))
+#endif
+
+/*
+ * Hide the difference between the 2.4 and 2.6 version of daemonize().
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define compat_daemonize(name) daemonize()
+#else
+#define compat_daemonize(name) daemonize(name)
+#endif
+
+/*
+ * Hide the difference between the 2.4 and 2.6 version of request_module().
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define compat_request_module(name,...) request_module(name)
+#else
+#define compat_request_module(name,...) request_module(name,## __VA_ARGS__)
+#endif
+
+/*
+ * Provide a kernel 2.4 version of set_cpus_allowed().
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define compat_set_cpus_allowed(current, mask) \
+({ \
+ cpumask_t _old_mask; \
+ int _ret = 0; \
+ \
+ _old_mask = (current)->cpus_allowed; \
+ set_cpus_allowed((current), mask); \
+ \
+ if ( (cpumask_of_cpu(smp_processor_id()) & (mask))==0 ) { \
+ set_cpus_allowed((current), _old_mask); \
+ _ret = 1; \
+ } \
+ _ret; \
+})
+#else
+#define compat_set_cpus_allowed(current, mask) set_cpus_allowed((current),
(mask))
+#endif
+
+/*
+ * Hide the difference between the 2.4 and 2.6 version of register_blkdev().
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define compat_register_blkdev(major, name, fsops) register_blkdev((major),
(name), (fsops))
+#else
+#define compat_register_blkdev(major, name, fsops) register_blkdev((major),
(name))
+#endif
+
+/*
+ * Provide compatibility macros for geometry calculation under kernel 2.4.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+
+#define get_start_sect(bd) \
+({ \
+ struct gendisk *__disk; \
+ \
+ __disk = get_gendisk((bd)->bd_dev); \
+ __disk->part[MINOR((bd)->bd_dev)].start_sect; \
+})
+
+#define compat_get_capacity(bd) \
+({ \
+ struct gendisk *__disk; \
+ \
+ __disk = get_gendisk((bd)->bd_dev); \
+ __disk->part[MINOR((bd)->bd_dev)].nr_sects; \
+})
+
+#define compat_get_sector_number(req) \
+({ \
+ struct blkfront_info *__info; \
+ \
+ __info = compat_req_to_info(req); \
+ (req)->sector + (__info)->gd->part[MINOR((req)->rq_dev)].start_sect; \
+})
+
+#else
+
+#define compat_get_capacity(bd) get_capacity((bd)->bd_disk)
+#define compat_get_sector_number(req) ((req)->sector)
+
+#endif
+
+/*
+ * Provide compatibility macros for resolution of blkfront driver's private
+ * information structure.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+
+#define compat_get_info(disk, minor)
\
+({
\
+ ((struct blkfront_info **)(disk)->real_devices)[(minor)] ?
\
+ ((struct blkfront_info **)(disk)->real_devices)[(minor)] :
\
+ ((struct blkfront_info **)(disk)->real_devices)[(minor) & ~((1 <<
(disk)->minor_shift) - 1)]; \
+})
+
+#define compat_inode_to_info(inode) \
+({ \
+ struct gendisk *__disk; \
+ struct blkfront_info *__info = NULL; \
+ \
+ __disk = get_gendisk((inode)->i_rdev); \
+ \
+ if (__disk != NULL) \
+ __info = compat_get_info(__disk, MINOR((inode)->i_rdev)); \
+ \
+ __info; \
+})
+
+#define compat_req_to_info(req) \
+({ \
+ struct gendisk *__disk; \
+ struct blkfront_info *__info = NULL; \
+ \
+ __disk = get_gendisk((req)->rq_dev); \
+ \
+ if (__disk != NULL) \
+ __info = compat_get_info(__disk, MINOR((req)->rq_dev)); \
+ \
+ __info; \
+})
+
+#else
+
+#define compat_inode_to_info(inode) ((inode)->i_bdev->bd_disk->private_data)
+#define compat_req_to_info(req) ((req)->rq_disk->private_data)
+
+#endif
+
+/*
+ * Provide compatibility macros for end_request processing.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define compat_end_request(req, uptodate) \
+({ \
+ struct blkfront_info *__info; \
+ \
+ __info = compat_req_to_info(req); \
+ \
+ if (!end_that_request_first((req), (uptodate), \
+ (char *) compat_get_disk_name(__info))) { \
+ blkdev_dequeue_request(req); \
+ end_that_request_last(req); \
+ } \
+})
+
+#define compat_end_that_request_first(req, uptodate, nr_sect)
\
+({
\
+ struct blkfront_info *__info;
\
+ int __ret;
\
+
\
+ __info = compat_req_to_info(req);
\
+
\
+ do {
\
+ __ret = end_that_request_first((req), (uptodate),
\
+ (char *) compat_get_disk_name(__info));
\
+ } while (__ret != 0);
\
+
\
+ __ret;
\
+})
+
+#define compat_end_that_request_last(req, uptodate)
end_that_request_last(req)
+#else
+#define compat_end_request(req, uptodate) end_request((req), (uptodate))
+#define compat_end_that_request_first(req, uptodate, nr_sect)
end_that_request_first((req), (uptodate), (nr_sect))
+#define compat_end_that_request_last(req, uptodate)
end_that_request_last((req), (uptodate))
+#endif
+
+/*
+ * Compatibility macros which hide differences in generic disk APIs between
+ * kernel 2.4 and kernel 2.6.
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
+#define compat_add_disk(gd, dev) xlvbd_register_disk((gd), (dev))
+#define compat_get_disk_name(info) ((info)->gd->major_name)
+#define compat_get_disk_flags(gd) ((int)*((gd)->flags))
+#else
+#define compat_add_disk(gd, dev) add_disk(gd)
+#define compat_get_disk_name(info) ((info)->gd->disk_name)
+#define compat_get_disk_flags(gd) ((gd)->flags)
+#endif
+
+#endif
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|