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

[Xen-changelog] [xen-unstable] [BLKTAP] Use lartge enough types to express parameters of large block devices.



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 4666710bfc559a92737c3998dc7790418be8ab63
# Parent  99878f3f74eec9981c48d0e5c76e6ba269ae470f
[BLKTAP] Use lartge enough types to express parameters of large block devices.

While the kernel side of blktap drivers is using 64-bit sector numbers
correctly when reporting disk sizing, the userspace parts where this
dat is actually generated is truncating at 32-bit. There are 3 variables
related to disk sizing which are used in the kernel/userspace code
'size', 'sector size' & 'info'. In kernel space these are treated as being
unsigned long long, unsigned long, and unsigned int, respectively. In
the blktap userspace code this were all varyingly long, unsigned long.
This mismatch caused 32-bit wraparound on large disks. The attached
patch updates the blktap userspace to use the same data types as
kernel space for all these params, thus both fixing the 32-bit bug &
giving the code consistency.

This patch has been tested both by comparing /proc/partitions in the
guest, with the image size seen in the host, and by using Stephen
Tweedie's 'verify-data' tool on a variety of multi-TB sized disks.

Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx>
---
 tools/blktap/drivers/blktapctrl.c |    2 +-
 tools/blktap/drivers/blktapctrl.h |    6 +++---
 tools/blktap/drivers/tapdisk.h    |    6 +++---
 tools/blktap/lib/blktaplib.h      |   12 ++++++------
 tools/blktap/lib/xenbus.c         |    2 +-
 5 files changed, 14 insertions(+), 14 deletions(-)

diff -r 99878f3f74ee -r 4666710bfc55 tools/blktap/drivers/blktapctrl.c
--- a/tools/blktap/drivers/blktapctrl.c Tue Nov 28 13:48:47 2006 +0000
+++ b/tools/blktap/drivers/blktapctrl.c Tue Nov 28 13:50:32 2006 +0000
@@ -420,7 +420,7 @@ static int read_msg(int fd, int msgtype,
                        image->secsize = img->secsize;
                        image->info = img->info;
 
-                       DPRINTF("Received CTLMSG_IMG: %lu, %lu, %lu\n",
+                       DPRINTF("Received CTLMSG_IMG: %llu, %lu, %u\n",
                                image->size, image->secsize, image->info);
                        if(msgtype != CTLMSG_IMG) ret = 0;
                        break;
diff -r 99878f3f74ee -r 4666710bfc55 tools/blktap/drivers/blktapctrl.h
--- a/tools/blktap/drivers/blktapctrl.h Tue Nov 28 13:48:47 2006 +0000
+++ b/tools/blktap/drivers/blktapctrl.h Tue Nov 28 13:50:32 2006 +0000
@@ -30,19 +30,19 @@
  */
 
 
-static inline long int tapdisk_get_size(blkif_t *blkif)
+static inline unsigned long long tapdisk_get_size(blkif_t *blkif)
 {
        image_t *img = (image_t *)blkif->prv;
        return img->size;
 }
 
-static inline long int tapdisk_get_secsize(blkif_t *blkif)
+static inline unsigned long tapdisk_get_secsize(blkif_t *blkif)
 {
        image_t *img = (image_t *)blkif->prv;
        return img->secsize;
 }
 
-static inline unsigned tapdisk_get_info(blkif_t *blkif)
+static inline unsigned int tapdisk_get_info(blkif_t *blkif)
 {
        image_t *img = (image_t *)blkif->prv;
        return img->info;
diff -r 99878f3f74ee -r 4666710bfc55 tools/blktap/drivers/tapdisk.h
--- a/tools/blktap/drivers/tapdisk.h    Tue Nov 28 13:48:47 2006 +0000
+++ b/tools/blktap/drivers/tapdisk.h    Tue Nov 28 13:50:32 2006 +0000
@@ -74,9 +74,9 @@ struct td_state {
        void *ring_info;
        void *fd_entry;
        char backing_file[1024]; /*Used by differencing disks, e.g. qcow*/
-       long int   sector_size;
-       uint64_t   size;
-       long int   info;
+       unsigned long      sector_size;
+       unsigned long long size;
+       unsigned int       info;
 };
 
 /* Prototype of the callback to activate as requests complete.              */
diff -r 99878f3f74ee -r 4666710bfc55 tools/blktap/lib/blktaplib.h
--- a/tools/blktap/lib/blktaplib.h      Tue Nov 28 13:48:47 2006 +0000
+++ b/tools/blktap/lib/blktaplib.h      Tue Nov 28 13:50:32 2006 +0000
@@ -97,9 +97,9 @@ typedef struct {
 } pending_req_t;
 
 struct blkif_ops {
-       long int (*get_size)(struct blkif *blkif);
-       long int (*get_secsize)(struct blkif *blkif);
-       unsigned (*get_info)(struct blkif *blkif);
+       unsigned long long (*get_size)(struct blkif *blkif);
+       unsigned long (*get_secsize)(struct blkif *blkif);
+       unsigned int (*get_info)(struct blkif *blkif);
 };
 
 typedef struct blkif {
@@ -156,9 +156,9 @@ typedef struct domid_translate {
 } domid_translate_t ;
 
 typedef struct image {
-       long int size;
-       long int secsize;
-       long int info;
+       unsigned long long size;
+       unsigned long secsize;
+       unsigned int info;
 } image_t;
 
 typedef struct msg_hdr {
diff -r 99878f3f74ee -r 4666710bfc55 tools/blktap/lib/xenbus.c
--- a/tools/blktap/lib/xenbus.c Tue Nov 28 13:48:47 2006 +0000
+++ b/tools/blktap/lib/xenbus.c Tue Nov 28 13:50:32 2006 +0000
@@ -219,7 +219,7 @@ static void ueblktap_setup(struct xs_han
        }
 
        /* Supply the information about the device to xenstore */
-       er = xs_printf(h, be->backpath, "sectors", "%lu",
+       er = xs_printf(h, be->backpath, "sectors", "%llu",
                        be->blkif->ops->get_size(be->blkif));
 
        if (er == 0) {

_______________________________________________
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®.