aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-10-11 08:12:56 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2003-10-11 08:12:56 +0000
commit2856e6bf918a12e36a5f853020521b4738ea0aab (patch)
treef78ed208b77a59f8a7ede63fb73f1c0dff2b860d
parent6d406d9392364e76c9f77452c8698b5d9ee6a8aa (diff)
parenta80f7fc9097ba24759ebf724cd9da531cf34ca95 (diff)
downloadxen-2856e6bf918a12e36a5f853020521b4738ea0aab.tar.gz
xen-2856e6bf918a12e36a5f853020521b4738ea0aab.tar.bz2
xen-2856e6bf918a12e36a5f853020521b4738ea0aab.zip
bitkeeper revision 1.503 (3f87bb888GFs_glucvd8TfB69He-BQ)
Manual merge
-rw-r--r--.rootkeys1
-rw-r--r--extras/mini-os/Makefile1
-rw-r--r--tools/control/src/org/xenoserver/control/CommandVbdList.java2
-rw-r--r--tools/misc/xen_refresh_dev.c49
-rw-r--r--xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c34
5 files changed, 77 insertions, 10 deletions
diff --git a/.rootkeys b/.rootkeys
index 81200df492..8555e6dadb 100644
--- a/.rootkeys
+++ b/.rootkeys
@@ -186,6 +186,7 @@
3f13d81eQ9Vz-h-6RDGFkNR9CRP95g tools/misc/xen_nat_enable
3f13d81e6Z6806ihYYUw8GVKNkYnuw tools/misc/xen_nat_enable.README
3f1668d4F29Jsw0aC0bJEIkOBiagiQ tools/misc/xen_read_console.c
+3f87ba90EUVPQLVOlFG0sW89BCwouQ tools/misc/xen_refresh_dev.c
3f72f1bdJPsV3JCnBqs9ddL9tr6D2g xen/COPYING
3f841450eJvqAD1Dldc0_aOweGiglQ xen/GUEST_CHANGES
3ddb79bcbOVHh38VJzc97-JEGD4dJQ xen/Makefile
diff --git a/extras/mini-os/Makefile b/extras/mini-os/Makefile
index f437cf2f58..18ae585db7 100644
--- a/extras/mini-os/Makefile
+++ b/extras/mini-os/Makefile
@@ -35,6 +35,7 @@ $(TARGET): hypervisor-ifs head.o $(OBJS)
clean:
find . -type f -name '*.o' | xargs rm -f
rm -f *.o *~ core $(TARGET).elf $(TARGET).raw $(TARGET) $(TARGET).gz
+ find . -type l | xargs rm -f
%.o: %.c $(HDRS) Makefile
$(CC) $(CFLAGS) -c $< -o $@
diff --git a/tools/control/src/org/xenoserver/control/CommandVbdList.java b/tools/control/src/org/xenoserver/control/CommandVbdList.java
index 16fd1953c6..c25191113a 100644
--- a/tools/control/src/org/xenoserver/control/CommandVbdList.java
+++ b/tools/control/src/org/xenoserver/control/CommandVbdList.java
@@ -35,7 +35,7 @@ public class CommandVbdList extends Command {
key = st.nextToken();
}
if (st.hasMoreTokens()) {
- if (Integer.parseInt(st.nextToken()) == 2) {
+ if (Integer.parseInt(st.nextToken()) == 1) {
mode = Mode.READ_WRITE;
}
}
diff --git a/tools/misc/xen_refresh_dev.c b/tools/misc/xen_refresh_dev.c
new file mode 100644
index 0000000000..b9ea025c1f
--- /dev/null
+++ b/tools/misc/xen_refresh_dev.c
@@ -0,0 +1,49 @@
+/******************************************************************************
+ * xen_refresh_dev.c
+ *
+ * Refresh our view of a block device by rereading its partition table. This
+ * is necessary to synchronise with VBD attaches and unattaches in Xen.
+ * Currently there's no automatic plumbing of attach/unattach requests.
+ *
+ * Copyright (c) 2003, K A Fraser
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <string.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sys/mount.h> /* BLKRRPART */
+
+int main(int argc, char **argv)
+{
+ int fd;
+
+ if ( argc != 2 )
+ {
+ fprintf(stderr, "xen_refresh_dev <blkdev>\ne.g., /dev/xvda\n");
+ return 1;
+ }
+
+ if ( (fd = open(argv[1], O_RDWR)) == -1 )
+ {
+ fprintf(stderr, "Error opening %s: %s (%d)\n",
+ argv[1], strerror(errno), errno);
+ return 1;
+ }
+
+ if ( ioctl(fd, BLKRRPART) == -1 )
+ {
+ fprintf(stderr, "Error executing BLKRRPART on %s: %s (%d)\n",
+ argv[1], strerror(errno), errno);
+ return 1;
+ }
+
+ close(fd);
+
+ return 0;
+}
diff --git a/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c b/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c
index 743ecd9be0..12e3657d6a 100644
--- a/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c
+++ b/xenolinux-2.4.22-sparse/arch/xeno/drivers/block/xl_block.c
@@ -272,11 +272,9 @@ int xenolinux_block_revalidate(kdev_t dev)
struct gendisk *gd = xldev_to_gendisk(dev);
xl_disk_t *disk = xldev_to_xldisk(dev);
unsigned long flags;
- int i, partn_shift = PARTN_SHIFT(dev);
- int xdev = dev & XENDEV_IDX_MASK;
+ int i, partn_shift = PARTN_SHIFT(dev), disk_nr = MINOR(dev) >> partn_shift;
- DPRINTK("xenolinux_block_revalidate: %d %d %d\n",
- dev, xdev, XENDEV_IDX_MASK);
+ DPRINTK("xenolinux_block_revalidate: %d\n", dev);
spin_lock_irqsave(&io_request_lock, flags);
if ( disk->usage > 1 )
@@ -286,14 +284,32 @@ int xenolinux_block_revalidate(kdev_t dev)
}
spin_unlock_irqrestore(&io_request_lock, flags);
- for ( i = 0; i < (1 << partn_shift); i++ )
+ for ( i = (1 << partn_shift) - 1; i >= 0; i-- )
{
- invalidate_device(xdev + i, 1);
- gd->part[xdev + i].start_sect = 0;
- gd->part[xdev + i].nr_sects = 0;
+ invalidate_device(dev+i, 1);
+ gd->part[MINOR(dev+i)].start_sect = 0;
+ gd->part[MINOR(dev+i)].nr_sects = 0;
}
- grok_partitions(gd, MINOR(dev) >> partn_shift,
+ /* VBDs can change under our feet. Check if that has happened. */
+ if ( MAJOR(dev) == XLVIRT_MAJOR )
+ {
+ xen_disk_info_t *xdi = kmalloc(sizeof(*xdi), GFP_KERNEL);
+ if ( xdi != NULL )
+ {
+ memset(xdi, 0, sizeof(*xdi));
+ xenolinux_control_msg(XEN_BLOCK_PROBE_SEG,
+ (char *)xdi, sizeof(*xdi));
+ for ( i = 0; i < xdi->count; i++ )
+ if ( IS_VIRTUAL_XENDEV(xdi->disks[i].device) &&
+ ((xdi->disks[i].device & XENDEV_IDX_MASK) == disk_nr) )
+ ((xl_disk_t *)gd->real_devices)[disk_nr].capacity =
+ xdi->disks[i].capacity;
+ kfree(xdi);
+ }
+ }
+
+ grok_partitions(gd, disk_nr,
1 << partn_shift, disk->capacity);
return 0;