aboutsummaryrefslogtreecommitdiffstats
path: root/tools/blktap
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-01-22 11:00:45 +0000
committerKeir Fraser <keir.fraser@citrix.com>2010-01-22 11:00:45 +0000
commit939629eb5b1f143b12eee9396d6a8c8b1e0f3226 (patch)
tree7ab0ee0229e10f16bc8bcffe6d2e3ca468ce1ad8 /tools/blktap
parent7848a26a9729479720edfcee8c6bd816eb11ac41 (diff)
downloadxen-939629eb5b1f143b12eee9396d6a8c8b1e0f3226.tar.gz
xen-939629eb5b1f143b12eee9396d6a8c8b1e0f3226.tar.bz2
xen-939629eb5b1f143b12eee9396d6a8c8b1e0f3226.zip
blktap: fix blktapctrl abort
On rebooting a hvm, the blktapctrl daemon has died. gdb shows the following call trace: (gdb) where #0 0x00000039d1830155 in raise () from /lib64/libc.so.6 #1 0x00000039d1831bf0 in abort () from /lib64/libc.so.6 #2 0x00000039d186a38b in __libc_message () from /lib64/libc.so.6 #3 0x00000039d1871634 in _int_free () from /lib64/libc.so.6 #4 0x00000039d1874c5c in free () from /lib64/libc.so.6 #5 0x0000003320a01bdd in ueblktap_probe (h=3D0x6073b0,=20 w=<value optimized out>, bepath_im=<value optimized out>) at xenbus.c:270 #6 0x0000003320a020e0 in xs_fire_next_watch (h=3D0x6073b0) at xs_api.c:355 #7 0x0000000000401785 in main (argc=3D<value optimized out>, argv=<value optimized out>) at blktapctrl.c:907 There is a case that "/local/domain/0/backend/tap/<dom_id>" exists but "/local/domain/<dom_id>/vm" is not in the xenstore. Signed-off-by: Kouya Shimura <kouya@jp.fujitsu.com>
Diffstat (limited to 'tools/blktap')
-rw-r--r--tools/blktap/lib/xenbus.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/tools/blktap/lib/xenbus.c b/tools/blktap/lib/xenbus.c
index c238d5fe9a..53db3c8b29 100644
--- a/tools/blktap/lib/xenbus.c
+++ b/tools/blktap/lib/xenbus.c
@@ -232,8 +232,11 @@ static int check_sharing(struct xs_handle *h, struct backend_info *be)
ret = -1;
break;
}
+ cur_dom_uuid = NULL;
xs_gather(h, path, "vm", NULL, &cur_dom_uuid, NULL);
free(path);
+ if (!cur_dom_uuid)
+ continue;
if (!strcmp(cur_dom_uuid, dom_uuid)) {
free(cur_dom_uuid);
@@ -256,8 +259,11 @@ static int check_sharing(struct xs_handle *h, struct backend_info *be)
ret = -1;
break;
}
+ params = NULL;
xs_gather(h, path, "params", NULL, &params, NULL);
free(path);
+ if (!params)
+ continue;
image_path[1] = get_image_path(params);
if (!strcmp(image_path[0], image_path[1])) {