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

[Xen-changelog] big cleanup. better support for refresh.



ChangeSet 1.1419.1.1, 2005/04/01 14:20:59+01:00, vh249@xxxxxxxxxxxxxxxxxxxxxx

        big cleanup. better support for refresh.
        
        Signed-off-by: Vincent Hanquez <vincent@xxxxxxxxxxxxx>



 vbd.c |  601 +++++++++++++++++++++++++++++++++---------------------------------
 1 files changed, 305 insertions(+), 296 deletions(-)


diff -Nru a/linux-2.6.11-xen-sparse/drivers/xen/blkfront/vbd.c 
b/linux-2.6.11-xen-sparse/drivers/xen/blkfront/vbd.c
--- a/linux-2.6.11-xen-sparse/drivers/xen/blkfront/vbd.c        2005-04-01 
09:03:00 -05:00
+++ b/linux-2.6.11-xen-sparse/drivers/xen/blkfront/vbd.c        2005-04-01 
09:03:00 -05:00
@@ -31,6 +31,7 @@
 
 #include "block.h"
 #include <linux/blkdev.h>
+#include <linux/list.h>
 
 /*
  * For convenience we distinguish between ide, scsi and 'other' (i.e.,
@@ -42,6 +43,14 @@
 #define NUM_SCSI_MAJORS 9
 #define NUM_VBD_MAJORS 1
 
+struct lvdisk
+{
+    blkif_sector_t capacity; /*  0: Size in terms of 512-byte sectors.   */
+    blkif_vdev_t   device;   /*  8: Device number (opaque 16 bit value). */
+    u16            info; 
+    struct list_head list;
+};
+
 static struct xlbd_type_info xlbd_ide_type = {
     .partn_shift = 6,
     .partn_per_major = 2,
@@ -66,10 +75,17 @@
 static struct xlbd_major_info *major_info[NUM_IDE_MAJORS + NUM_SCSI_MAJORS +
                                          NUM_VBD_MAJORS];
 
+#define XLBD_MAJOR_IDE_START    0
+#define XLBD_MAJOR_SCSI_START   (NUM_IDE_MAJORS)
+#define XLBD_MAJOR_VBD_START    (NUM_IDE_MAJORS + NUM_SCSI_MAJORS)
+
+#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 int nr_vbds;
-static vdisk_t *vbd_info;
+struct list_head vbds_list;
 
 struct request_queue *xlbd_blk_queue = NULL;
 
@@ -82,388 +98,386 @@
     .open  = blkif_open,
     .release = blkif_release,
     .ioctl  = blkif_ioctl,
-#if 0
-    check_media_change: blkif_check,
-    revalidate:         blkif_revalidate,
-#endif
 };
 
 spinlock_t blkif_io_lock = SPIN_LOCK_UNLOCKED;
 
-static int xlvbd_get_vbd_info(vdisk_t *disk_info)
+static struct lvdisk * xlvbd_device_alloc(void)
+{
+    struct lvdisk *ret;
+
+    ret = kmalloc(sizeof(struct lvdisk), GFP_KERNEL);
+    if ( ret ) {
+        memset(ret, '\0', 0);
+        INIT_LIST_HEAD(&ret->list);
+    }
+    return ret;
+}
+
+static void xlvbd_device_free(struct lvdisk *disk)
+{
+    list_del(&disk->list);
+    kfree(disk);
+}
+
+static vdisk_t * xlvbd_probe(int *ret)
 {
-    vdisk_t         *buf = (vdisk_t *)__get_free_page(GFP_KERNEL);
-    blkif_request_t  req;
     blkif_response_t rsp;
-    int              nr;
+    blkif_request_t req;
+    vdisk_t *disk_info = NULL;
+    unsigned long buf;
+    int nr;
+
+    buf = __get_free_page(GFP_KERNEL);
+    if ( !buf )
+        goto out;
 
     memset(&req, 0, sizeof(req));
-    req.operation   = BLKIF_OP_PROBE;
+    req.operation = BLKIF_OP_PROBE;
     req.nr_segments = 1;
     req.frame_and_sects[0] = virt_to_machine(buf) | 7;
 
     blkif_control_send(&req, &rsp);
-
-    if ( rsp.status <= 0 )
-    {
+    if ( rsp.status <= 0 ) {
         printk(KERN_ALERT "Could not probe disks (%d)\n", rsp.status);
-        return -1;
+        goto out;
     }
-
-    if ( (nr = rsp.status) > MAX_VBDS )
+    nr = rsp.status;
+    if ( nr > MAX_VBDS )
         nr = MAX_VBDS;
-    memcpy(disk_info, buf, nr * sizeof(vdisk_t));
-
-    free_page((unsigned long)buf);
 
-    return nr;
+    disk_info = kmalloc(nr * sizeof(vdisk_t), GFP_KERNEL);
+    if ( disk_info )
+        memcpy(disk_info, (void *) buf, nr * sizeof(vdisk_t));
+    if ( ret )
+        *ret = nr;
+out:
+    free_page(buf);
+    return disk_info;
 }
 
-static struct xlbd_major_info *xlbd_get_major_info(int xd_device, int *minor)
+static struct xlbd_major_info *xlbd_alloc_major_info(int major, int minor, int 
index)
 {
-    int mi_idx, new_major;
-    int xd_major = MAJOR_XEN(xd_device); 
-    int xd_minor = MINOR_XEN(xd_device);
+    struct xlbd_major_info *ptr;
 
-    *minor = xd_minor;
+    ptr = kmalloc(sizeof(struct xlbd_major_info), GFP_KERNEL);
+    if ( !ptr )
+        return NULL;
 
-    switch (xd_major) {
-    case IDE0_MAJOR: mi_idx = 0; new_major = IDE0_MAJOR; break;
-    case IDE1_MAJOR: mi_idx = 1; new_major = IDE1_MAJOR; break;
-    case IDE2_MAJOR: mi_idx = 2; new_major = IDE2_MAJOR; break;
-    case IDE3_MAJOR: mi_idx = 3; new_major = IDE3_MAJOR; break;
-    case IDE4_MAJOR: mi_idx = 4; new_major = IDE4_MAJOR; break;
-    case IDE5_MAJOR: mi_idx = 5; new_major = IDE5_MAJOR; break;
-    case IDE6_MAJOR: mi_idx = 6; new_major = IDE6_MAJOR; break;
-    case IDE7_MAJOR: mi_idx = 7; new_major = IDE7_MAJOR; break;
-    case IDE8_MAJOR: mi_idx = 8; new_major = IDE8_MAJOR; break;
-    case IDE9_MAJOR: mi_idx = 9; new_major = IDE9_MAJOR; break;
-    case SCSI_DISK0_MAJOR: mi_idx = 10; new_major = SCSI_DISK0_MAJOR; break;
-    case SCSI_DISK1_MAJOR ... SCSI_DISK7_MAJOR:
-        mi_idx = 11 + xd_major - SCSI_DISK1_MAJOR;
-        new_major = SCSI_DISK1_MAJOR + xd_major - SCSI_DISK1_MAJOR;
+    memset(ptr, 0, sizeof(struct xlbd_major_info));
+
+    ptr->major = major;
+
+    switch (index) {
+    case XLBD_MAJOR_IDE_RANGE:
+        ptr->type = &xlbd_ide_type;
+        ptr->index = index - XLBD_MAJOR_IDE_START;
+        break;
+    case XLBD_MAJOR_SCSI_RANGE:
+        ptr->type = &xlbd_scsi_type;
+        ptr->index = index - XLBD_MAJOR_SCSI_START;
+        break;
+    case XLBD_MAJOR_VBD_RANGE:
+        ptr->type = &xlbd_vbd_type;
+        ptr->index = index - XLBD_MAJOR_VBD_START;
         break;
-    case SCSI_CDROM_MAJOR: mi_idx = 18; new_major = SCSI_CDROM_MAJOR; break;
-    default: mi_idx = 19; new_major = 0;/* XXXcl notyet */ break;
+    }
+    
+    if ( register_blkdev(ptr->major, ptr->type->devname) ) {
+        printk(KERN_ALERT "XL VBD: can't get major %d with name %s\n",
+                    ptr->major, ptr->type->devname);
+        kfree(ptr);
+        return NULL;
     }
 
-    if (major_info[mi_idx])
-        return major_info[mi_idx];
+    devfs_mk_dir(ptr->type->devname);
+    major_info[index] = ptr;
+    return ptr;
+}
 
-    major_info[mi_idx] = kmalloc(sizeof(struct xlbd_major_info), GFP_KERNEL);
-    if (major_info[mi_idx] == NULL)
-        return NULL;
+static struct xlbd_major_info *xlbd_get_major_info(int device)
+{
+    int major, minor, index;
 
-    memset(major_info[mi_idx], 0, sizeof(struct xlbd_major_info));
+    major = MAJOR_XEN(device);
+    minor = MINOR_XEN(device);
 
-    switch (mi_idx) {
-    case 0 ... (NUM_IDE_MAJORS - 1):
-        major_info[mi_idx]->type = &xlbd_ide_type;
-        major_info[mi_idx]->index = mi_idx;
-        break;
-    case NUM_IDE_MAJORS ... (NUM_IDE_MAJORS + NUM_SCSI_MAJORS - 1):
-        major_info[mi_idx]->type = &xlbd_scsi_type;
-        major_info[mi_idx]->index = mi_idx - NUM_IDE_MAJORS;
-        break;
-        case (NUM_IDE_MAJORS + NUM_SCSI_MAJORS) ...
-            (NUM_IDE_MAJORS + NUM_SCSI_MAJORS + NUM_VBD_MAJORS - 1):
-                major_info[mi_idx]->type = &xlbd_vbd_type;
-        major_info[mi_idx]->index = mi_idx -
-            (NUM_IDE_MAJORS + NUM_SCSI_MAJORS);
+    switch (major) {
+    case IDE0_MAJOR: index = 0; break;
+    case IDE1_MAJOR: index = 1; break;
+    case IDE2_MAJOR: index = 2; break;
+    case IDE3_MAJOR: index = 3; break;
+    case IDE4_MAJOR: index = 4; break;
+    case IDE5_MAJOR: index = 5; break;
+    case IDE6_MAJOR: index = 6; break;
+    case IDE7_MAJOR: index = 7; break;
+    case IDE8_MAJOR: index = 8; break;
+    case IDE9_MAJOR: index = 9; break;
+    case SCSI_DISK0_MAJOR: index = 10; break;
+    case SCSI_DISK1_MAJOR ... SCSI_DISK7_MAJOR:
+        index = 11 + major - SCSI_DISK1_MAJOR;
         break;
+    case SCSI_CDROM_MAJOR: index = 18; break;
+    default: index = 19; break;
     }
-    major_info[mi_idx]->major = new_major;
 
-    if (register_blkdev(major_info[mi_idx]->major, 
major_info[mi_idx]->type->devname)) {
-        printk(KERN_ALERT "XL VBD: can't get major %d with name %s\n",
-               major_info[mi_idx]->major, major_info[mi_idx]->type->devname);
-        goto out;
-    }
+    return major_info[index]
+        ? major_info[index]
+        : xlbd_alloc_major_info(major, minor, index);
+}
 
-    devfs_mk_dir(major_info[mi_idx]->type->devname);
+static int xlvbd_blk_queue_alloc(struct xlbd_type_info *type)
+{
+    xlbd_blk_queue = blk_init_queue(do_blkif_request, &blkif_io_lock);
+    if ( !xlbd_blk_queue )

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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.