]> xenbits.xensource.com Git - people/dstodden/blktap.git/commitdiff
CA-44974: Make tap_ctl_close idempotent.
authorDaniel Stodden <daniel.stodden@citrix.com>
Thu, 9 Sep 2010 09:05:17 +0000 (02:05 -0700)
committerDaniel Stodden <daniel.stodden@citrix.com>
Thu, 9 Sep 2010 09:05:17 +0000 (02:05 -0700)
Avoid potential freelist/conn vector corruption due to
double-frees. Upgrade the WARN_ON() to a panic(), the present drain
loop doesn't want to be asked after disconnect.

Signed-off-by: Daniel Stodden <daniel.stodden@citrix.com>
drivers/tapdisk-control.c

index b2d98a558146e0569d66eee88593f43b2a4b7fec..c282d60b4a9fc9deceda7bf0fe85e42468523e9d 100644 (file)
@@ -176,10 +176,10 @@ tapdisk_ctl_conn_close(struct tapdisk_ctl_conn *conn)
        if (conn->fd >= 0) {
                close(conn->fd);
                conn->fd = -1;
-       }
 
-       td_control.conn[--td_control.n_conn] = conn;
-       tapdisk_server_mask_event(td_control.event_id, 0);
+               td_control.conn[--td_control.n_conn] = conn;
+               tapdisk_server_mask_event(td_control.event_id, 0);
+       }
 }
 
 static void
@@ -251,7 +251,7 @@ tapdisk_ctl_conn_drain(struct tapdisk_ctl_conn *conn)
        int n, mode;
 
        ASSERT(conn->out.done);
-       WARN_ON(conn->fd < 0);
+       ASSERT(conn->fd >= 0);
 
        while (tapdisk_ctl_conn_connected(conn)) {
                FD_ZERO(&wfds);