]> xenbits.xensource.com Git - xen.git/commitdiff
tools/blktap2: Handle read/write interrupts in blktap2 control plane.
authorDr. Greg Wettstein <greg@wind.enjellic.com>
Thu, 28 Mar 2013 07:50:34 +0000 (07:50 +0000)
committerIan Jackson <Ian.Jackson@eu.citrix.com>
Thu, 28 Mar 2013 14:35:23 +0000 (14:35 +0000)
The following patch:

tools: Retry blktap2 tapdisk message on interrupt.

Addressed a long standing regression with the blktap2 control
plane.  An interruption of the select system call would
prematurely terminate the message sequence needed to properly
shutdown a blktap2 tapdisk instance.

Ian Jackson correctly noted that the read and write systems calls
responsible for receiving and sending the control messages could
also return EINTR resulting in similar effects.  While this
regression was not noted in field testing this patch adds support
to re-start the calls to provide a technically complete
implementation of control plane management in the presence of
signals.

Signed-off-by: Dr. Greg Wettstein <xen@wind.enjellic.com>
Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/blktap2/control/tap-ctl-ipc.c

index c8aad1ccda901037ebc28bb6bf6dde18341b240c..c7e42d9cb9ed1dd69f3dda89ee2680db5a028330 100644 (file)
@@ -71,8 +71,11 @@ tap_ctl_read_message(int fd, tapdisk_message_t *message, int timeout)
                }
                else if (FD_ISSET(fd, &readfds)) {
                        ret = read(fd, message + offset, len - offset);
-                       if (ret <= 0)
+                       if (ret <= 0) {
+                               if (errno == EINTR)
+                                       continue;
                                break;
+                       }
                        offset += ret;
                } else
                        break;
@@ -124,8 +127,11 @@ tap_ctl_write_message(int fd, tapdisk_message_t *message, int timeout)
                }
                else if (FD_ISSET(fd, &writefds)) {
                        ret = write(fd, message + offset, len - offset);
-                       if (ret <= 0)
+                       if (ret <= 0) {
+                               if (errno == EINTR)
+                                       continue;
                                break;
+                       }
                        offset += ret;
                } else
                        break;