]> xenbits.xensource.com Git - qemu-upstream-4.2-testing.git/commitdiff
xen: handle backend deletion from xenstore
authorStefano Stabellini <stefano.stabellini@eu.citrix.com>
Fri, 30 Mar 2012 14:33:03 +0000 (14:33 +0000)
committerStefano Stabellini <stefano.stabellini@eu.citrix.com>
Tue, 17 Apr 2012 10:12:53 +0000 (10:12 +0000)
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
hw/xen_backend.c
hw/xen_disk.c

index d876cabb128abbd0edf181efbede9a1e76be0812..555da411f3ab236b0f87ab32a5c8e405c36904ed 100644 (file)
@@ -589,7 +589,7 @@ static void xenstore_update_be(char *watch, char *type, int dom,
                                struct XenDevOps *ops)
 {
     struct XenDevice *xendev;
-    char path[XEN_BUFSIZE], *dom0;
+    char path[XEN_BUFSIZE], *dom0, *bepath;
     unsigned int len, dev;
 
     dom0 = xs_get_domain_path(xenstore, 0);
@@ -608,15 +608,16 @@ static void xenstore_update_be(char *watch, char *type, int dom,
         return;
     }
 
-    if (0) {
-        /* FIXME: detect devices being deleted from xenstore ... */
-        xen_be_del_xendev(dom, dev);
-    }
-
     xendev = xen_be_get_xendev(type, dom, dev, ops);
     if (xendev != NULL) {
-        xen_be_backend_changed(xendev, path);
-        xen_be_check_state(xendev);
+        bepath = xs_read(xenstore, 0, xendev->be, &len);
+        if (bepath == NULL) {
+            xen_be_del_xendev(dom, dev);
+        } else {
+            free(bepath);
+            xen_be_backend_changed(xendev, path);
+            xen_be_check_state(xendev);
+        }
     }
 }
 
index e9bbbf78511e1f01d6a6c8e86a086938c7e5d7ce..8217109c6d131c276ca0b1ca8e0735d064bfd35a 100644 (file)
@@ -824,6 +824,10 @@ static int blk_free(struct XenDevice *xendev)
     struct XenBlkDev *blkdev = container_of(xendev, struct XenBlkDev, xendev);
     struct ioreq *ioreq;
 
+    if (blkdev->bs || blkdev->sring) {
+        blk_disconnect(xendev);
+    }
+
     while (!QLIST_EMPTY(&blkdev->freelist)) {
         ioreq = QLIST_FIRST(&blkdev->freelist);
         QLIST_REMOVE(ioreq, list);