mirror of https://gitee.com/openkylin/libvirt.git
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: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
parent
405c0f07f5
commit
3a2ca2fbe4
src/util
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue