nbd: release exp->blk after all clients are closed
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>
This commit is contained in:
parent
04f2562f8e
commit
d626834849
21
nbd.c
21
nbd.c
@ -1131,12 +1131,6 @@ void nbd_export_close(NBDExport *exp)
|
|||||||
}
|
}
|
||||||
nbd_export_set_name(exp, NULL);
|
nbd_export_set_name(exp, NULL);
|
||||||
nbd_export_put(exp);
|
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)
|
void nbd_export_get(NBDExport *exp)
|
||||||
@ -1159,6 +1153,13 @@ void nbd_export_put(NBDExport *exp)
|
|||||||
exp->close(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);
|
g_free(exp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1305,6 +1306,14 @@ static void nbd_trip(void *opaque)
|
|||||||
goto invalid_request;
|
goto invalid_request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (client->closing) {
|
||||||
|
/*
|
||||||
|
* The client may be closed when we are blocked in
|
||||||
|
* nbd_co_receive_request()
|
||||||
|
*/
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case NBD_CMD_READ:
|
case NBD_CMD_READ:
|
||||||
TRACE("Request type is READ");
|
TRACE("Request type is READ");
|
||||||
|
Loading…
Reference in New Issue
Block a user