Skip to content

Commit

Permalink
nbd: release exp->blk after all clients are closed
Browse files Browse the repository at this point in the history
If the socket fd is shutdown, there may be some data which is received before
shutdown. We will read the data and do read/write in nbd_trip(). But the exp's
blk is NULL, and it will cause qemu crashed.

Reported-by: Li Zhijian <lizhijian@cn.fujitsu.com>
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
Message-Id: <55F929E2.1020501@cn.fujitsu.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
(cherry picked from commit d626834)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
  • Loading branch information
wencongyang authored and mdroth committed Oct 21, 2015
1 parent 6d62d0e commit 78aeb69
Showing 1 changed file with 15 additions and 6 deletions.
21 changes: 15 additions & 6 deletions nbd.c
Expand Up @@ -1131,12 +1131,6 @@ void nbd_export_close(NBDExport *exp)
}
nbd_export_set_name(exp, NULL);
nbd_export_put(exp);
if (exp->blk) {
blk_remove_aio_context_notifier(exp->blk, blk_aio_attached,
blk_aio_detach, exp);
blk_unref(exp->blk);
exp->blk = NULL;
}
}

void nbd_export_get(NBDExport *exp)
Expand All @@ -1159,6 +1153,13 @@ void nbd_export_put(NBDExport *exp)
exp->close(exp);
}

if (exp->blk) {
blk_remove_aio_context_notifier(exp->blk, blk_aio_attached,
blk_aio_detach, exp);
blk_unref(exp->blk);
exp->blk = NULL;
}

g_free(exp);
}
}
Expand Down Expand Up @@ -1305,6 +1306,14 @@ static void nbd_trip(void *opaque)
goto invalid_request;
}

if (client->closing) {
/*
* The client may be closed when we are blocked in
* nbd_co_receive_request()
*/
goto done;
}

switch (command) {
case NBD_CMD_READ:
TRACE("Request type is READ");
Expand Down

0 comments on commit 78aeb69

Please sign in to comment.