]> xenbits.xensource.com Git - people/dstodden/blktap.git/commitdiff
CA-44974: Preserve the active connection list when freeing.
authorDaniel Stodden <daniel.stodden@citrix.com>
Wed, 15 Sep 2010 00:32:35 +0000 (17:32 -0700)
committerDaniel Stodden <daniel.stodden@citrix.com>
Wed, 15 Sep 2010 00:32:35 +0000 (17:32 -0700)
Signed-off-by: Daniel Stodden <daniel.stodden@citrix.com>
drivers/tapdisk-control.c

index 748424fa52f2ae7272b2e57ee035146f36d41d07..bce72c6e9b4753f949edd71a3787c9c29a0bf3a2 100644 (file)
@@ -165,6 +165,24 @@ tapdisk_ctl_conn_connected(struct tapdisk_ctl_conn *conn)
        return conn->fd >= 1;
 }
 
+static void
+tapdisk_ctl_conn_free(struct tapdisk_ctl_conn *conn)
+{
+       struct tapdisk_ctl_conn *prev, *next;
+       int i;
+
+       i = --td_control.n_conn;
+       /* NB. bubble the freed connection off the active list. */
+       prev = conn;
+       do {
+               ASSERT(i >= 0);
+               next = td_control.conn[i];
+               td_control.conn[i] = prev;
+               prev = next;
+               i--;
+       } while (next != conn);
+}
+
 static void
 tapdisk_ctl_conn_close(struct tapdisk_ctl_conn *conn)
 {
@@ -177,7 +195,7 @@ tapdisk_ctl_conn_close(struct tapdisk_ctl_conn *conn)
                close(conn->fd);
                conn->fd = -1;
 
-               td_control.conn[--td_control.n_conn] = conn;
+               tapdisk_ctl_conn_free(conn);
                tapdisk_server_mask_event(td_control.event_id, 0);
        }
 }