提交 3a2ca2fb 编写于 作者: M Michal Privoznik

virfdstream: Check for thread error more frequently

When the I/O thread quits (e.g. due to an I/O error, lseek()
error, whatever), any subsequent virFDStream API should return
error too. Moreover, when invoking stream event callback, we must
set the VIR_STREAM_EVENT_ERROR flag so that the callback knows
something bad happened.
Signed-off-by: NMichal Privoznik <mprivozn@redhat.com>
Reviewed-by: NJohn Ferlan <jferlan@redhat.com>
上级 405c0f07
......@@ -312,6 +312,9 @@ static void virFDStreamEvent(int watch ATTRIBUTE_UNUSED,
return;
}
if (fdst->threadErr)
events |= VIR_STREAM_EVENT_ERROR;
cb = fdst->cb;
cbopaque = fdst->opaque;
ff = fdst->ff;
......@@ -791,10 +794,10 @@ static int virFDStreamWrite(virStreamPtr st, const char *bytes, size_t nbytes)
if (fdst->thread) {
char *buf;
if (fdst->threadQuit) {
if (fdst->threadQuit || fdst->threadErr) {
virReportSystemError(EBADF, "%s",
_("cannot write to stream"));
return -1;
goto cleanup;
}
if (VIR_ALLOC(msg) < 0 ||
......@@ -870,7 +873,7 @@ static int virFDStreamRead(virStreamPtr st, char *bytes, size_t nbytes)
virFDStreamMsgPtr msg = NULL;
while (!(msg = fdst->msg)) {
if (fdst->threadQuit) {
if (fdst->threadQuit || fdst->threadErr) {
if (nbytes) {
virReportSystemError(EBADF, "%s",
_("stream is not open"));
......@@ -971,6 +974,13 @@ virFDStreamSendHole(virStreamPtr st,
* the thread to do the lseek() for us. Under no
* circumstances we can do the lseek() ourselves here. We
* might mess up file position for the thread. */
if (fdst->threadQuit || fdst->threadErr) {
virReportSystemError(EBADF, "%s",
_("stream is not open"));
goto cleanup;
}
if (fdst->threadDoRead) {
msg = fdst->msg;
if (msg->type != VIR_FDSTREAM_MSG_TYPE_HOLE) {
......@@ -1025,6 +1035,9 @@ virFDStreamInData(virStreamPtr st,
if (fdst->thread) {
virFDStreamMsgPtr msg;
if (fdst->threadErr)
goto cleanup;
while (!(msg = fdst->msg)) {
if (fdst->threadQuit) {
*inData = *length = 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册