fs-backend: add a backend cleanup function
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 8 Dec 2009 07:45:15 +0000 (07:45 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 8 Dec 2009 07:45:15 +0000 (07:45 +0000)
This patch implements a backend cleanup function in fs-backend so that
when the connection to the frontend is closed we don't leak nodes on
xenstore.

Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
tools/fs-back/fs-backend.c
tools/fs-back/fs-backend.h
tools/fs-back/fs-xenbus.c

index 648b63b4712a67c59026261f015a00483a17586b..780a74465578ab10c473419d7f97e1d07b2c474f 100644 (file)
@@ -179,6 +179,7 @@ void terminate_mount_request(struct fs_mount *mount)
 
 static void free_mount_request(struct fs_mount *mount) {
     FS_DEBUG("free_mount_request %s\n", mount->frontend);
+    xenbus_free_backend_node(mount);
     free(mount->frontend);
     free(mount->requests);
     free(mount->freelist);
@@ -356,8 +357,19 @@ static void await_connections(void)
                 if((dom_id >= 0) && (export_id >= 0) && d == 'd') {
                     char *frontend = xs_read(xsh, XBT_NULL, watch_paths[XS_WATCH_PATH], NULL);
                     if (frontend) {
+                        char *p, *wp = strdup(watch_paths[XS_WATCH_PATH]);
                         handle_connection(dom_id, export_id, frontend);
-                        xs_rm(xsh, XBT_NULL, watch_paths[XS_WATCH_PATH]);
+                        xs_rm(xsh, XBT_NULL, wp);
+                        p = strrchr(wp, '/');
+                        if (p) {
+                            *p = '\0';
+                            p = strrchr(wp, '/');
+                            if (p) {
+                                *p = '\0';
+                                xs_rm(xsh, XBT_NULL, wp);
+                            }
+                        }
+                        free(wp);
                     }
                 }
             } else if (!strcmp(watch_paths[XS_WATCH_TOKEN], "frontend-state")) {
index 9399841a57763fbfe13c04072f35214690db2754..713eb3db62b859f65c2d6643b8bcd268a859e847 100644 (file)
@@ -67,6 +67,7 @@ int xenbus_get_watch_fd(void);
 int xenbus_read_mount_request(struct fs_mount *mount, char *frontend);
 bool xenbus_write_backend_node(struct fs_mount *mount);
 bool xenbus_write_backend_state(struct fs_mount *mount, const char *state);
+void xenbus_free_backend_node(struct fs_mount *mount);
 int xenbus_frontend_state_changed(struct fs_mount *mount, const char *oldstate);
 bool xenbus_watch_frontend_state(struct fs_mount *mount);
 bool xenbus_unwatch_frontend_state(struct fs_mount *mount);
index 603bfb9ef4d90a15025a9510bfd7d6dd0fa017a3..e883b661a09f24ecb7d8347315058914642b26d1 100644 (file)
@@ -204,6 +204,17 @@ bool xenbus_write_backend_state(struct fs_mount *mount, const char *state)
     return xs_write(xsh, XBT_NULL, node, state, strlen(state));
 }
 
+void xenbus_free_backend_node(struct fs_mount *mount)
+{
+    char node[1024];
+    int self_id;
+
+    assert(xsh != NULL);
+    self_id = get_self_id();
+    snprintf(node, sizeof(node), ROOT_NODE"/%d", mount->mount_id);
+    xs_rm(xsh, XBT_NULL, node);
+}
+
 bool xenbus_watch_frontend_state(struct fs_mount *mount)
 {
     char statepath[1024];