]> xenbits.xensource.com Git - people/dstodden/blktap.git/commitdiff
PR-1053: Leave parent sharing + rdonly modes to the child.
authorDaniel Stodden <daniel.stodden@citrix.com>
Tue, 15 Feb 2011 09:37:45 +0000 (01:37 -0800)
committerDaniel Stodden <daniel.stodden@citrix.com>
Tue, 15 Feb 2011 09:37:45 +0000 (01:37 -0800)
Comes somewhat natural. Simplifies image open code. Will allow future
drivers to override RDONLY mode on the shared storage leaf node.

Signed-off-by: Daniel Stodden <daniel.stodden@citrix.com>
drivers/block-vhd.c
drivers/tapdisk-interface.c
drivers/tapdisk-vbd.c
drivers/tapdisk.h

index 663b4e1a762ed5c652f91960813c3f8f54284480..30452807fe251c48271217a9dafe8f8aeaa95281 100644 (file)
@@ -879,12 +879,10 @@ vhd_get_parent_id(td_driver_t *driver, td_disk_id_t *id)
        if (err)
                return err;
 
-       id->name       = parent;
-       id->drivertype = DISK_TYPE_VHD;
-       if (vhd_parent_raw(&s->vhd)) {
-               DPRINTF("VHD: parent is raw\n");
-               id->drivertype = DISK_TYPE_AIO;
-       }
+       id->name   = parent;
+       id->type   = vhd_parent_raw(&s->vhd) ? DISK_TYPE_AIO : DISK_TYPE_VHD;
+       id->flags |= TD_OPEN_SHAREABLE|TD_OPEN_RDONLY;
+
        return 0;
 }
 
index 49471c423d7a2bf73f34a60284b0015a31deb915..4a70d9891f8d4f9def99d10af9624de53c535eca 100644 (file)
@@ -89,9 +89,10 @@ __td_open(td_image_t *image, td_disk_info_t *info)
                }
 
                td_flag_set(driver->state, TD_DRIVER_OPEN);
-               DPRINTF("opened image %s (%d users, state: 0x%08x, type: %d)\n",
+               DPRINTF("opened image %s (%d users, state: 0x%08x, type: %d, %s)\n",
                        driver->name, driver->refcnt + 1,
-                       driver->state, driver->type);
+                       driver->state, driver->type,
+                       td_flag_test(image->flags, TD_OPEN_RDONLY) ? "ro" : "rw");
        }
 
        image->driver = driver;
index 1306e335a2ff845b698512ebf4f49525834cc0c2..125e4526f84a257d7c2a5bf9b770e229a8c1c5d7 100644 (file)
@@ -491,24 +491,22 @@ fail:
 static int
 __tapdisk_vbd_open_vdi(td_vbd_t *vbd, td_flag_t extra_flags)
 {
-       char *file;
        int err, type;
-       td_flag_t flags;
        td_disk_id_t id;
        td_image_t *image, *tmp;
        struct tfilter *filter = NULL;
 
-       flags = (vbd->flags & ~TD_OPEN_SHAREABLE) | extra_flags;
-       file  = vbd->name;
-       type  = vbd->type;
+       id.flags = (vbd->flags & ~TD_OPEN_SHAREABLE) | extra_flags;
+       id.name  = vbd->name;
+       id.type  = vbd->type;
 
        for (;;) {
                err   = -ENOMEM;
-               image = tapdisk_image_allocate(file, type, flags);
+               image = tapdisk_image_allocate(id.name, id.type, id.flags);
 
-               if (file != vbd->name) {
-                       free(file);
-                       file = NULL;
+               if (id.name != vbd->name) {
+                       free(id.name);
+                       id.name = NULL;
                }
 
                if (!image)
@@ -519,8 +517,8 @@ __tapdisk_vbd_open_vdi(td_vbd_t *vbd, td_flag_t extra_flags)
                        if (err != -ENODEV)
                                goto fail;
 
-                       if (td_flag_test(flags, TD_OPEN_VHD_INDEX) &&
-                           td_flag_test(flags, TD_OPEN_RDONLY)) {
+                       if (td_flag_test(id.flags, TD_OPEN_VHD_INDEX) &&
+                           td_flag_test(id.flags, TD_OPEN_RDONLY)) {
                                err = tapdisk_vbd_open_index(vbd);
                                if (!err) {
                                        tapdisk_image_free(image);
@@ -549,19 +547,16 @@ __tapdisk_vbd_open_vdi(td_vbd_t *vbd, td_flag_t extra_flags)
                if (err == TD_NO_PARENT)
                        break;
 
-               file   = id.name;
-               type   = id.drivertype;
-               if (flags & TD_OPEN_REUSE_PARENT) {
-                       free(file);
-                       err = asprintf(&file, "%s%d", BLKTAP2_IO_DEVICE,
-                                       vbd->parent_devnum);
+               if (id.flags & TD_OPEN_REUSE_PARENT) {
+                       free(id.name);
+                       err = asprintf(&id.name, "%s%d", BLKTAP2_IO_DEVICE,
+                                      vbd->parent_devnum);
                        if (err == -1) {
                                err = ENOMEM;
                                goto fail;
                        }
                        type = DISK_TYPE_AIO;
                }
-               flags |= (TD_OPEN_RDONLY | TD_OPEN_SHAREABLE);
        }
 
        if (td_flag_test(vbd->flags, TD_OPEN_LOG_DIRTY)) {
index eb454b46d4c2c228ba8e868e64a380ad8e75733d..dd98c4e22507f57fec5c69ce4041eecd8d6cc71f 100644 (file)
@@ -118,7 +118,8 @@ typedef void (*td_callback_t)(td_request_t, int);
 
 struct td_disk_id {
        char                        *name;
-       int                          drivertype;
+       int                          type;
+       int                          flags;
 };
 
 struct td_disk_info {