]> Zhao Yanbai Git Server - minix.git/commitdiff
VFS: convert EINTR to EAGAIN for nonblocking I/O 01/2801/1
authorDavid van Moolenbroek <david@minix3.org>
Sun, 31 Aug 2014 17:12:45 +0000 (17:12 +0000)
committerDavid van Moolenbroek <david@minix3.org>
Sun, 31 Aug 2014 17:29:47 +0000 (17:29 +0000)
The conversion was never properly implemented for asynchronous
character drivers, and got lost during the removal of the
synchronous character protocol.

Change-Id: Ib858806859aa7a52d6b391d4c6c521a2be361fdd

minix/servers/vfs/device.c

index 7d34c0479d2d5e40645e1c940683f53885561592..9fed98ae186e6b0f24b23d4d794f20890dd815d1 100644 (file)
@@ -751,7 +751,7 @@ static void cdev_generic_reply(message *m_ptr)
   struct fproc *rfp;
   struct worker_thread *wp;
   endpoint_t proc_e;
-  int slot;
+  int r, slot;
 
   proc_e = m_ptr->m_lchardriver_vfs_reply.id;
 
@@ -777,7 +777,13 @@ static void cdev_generic_reply(message *m_ptr)
         */
        printf("VFS: proc %d not blocked on %d\n", proc_e, m_ptr->m_source);
   } else {
-       revive(proc_e, m_ptr->m_lchardriver_vfs_reply.status);
+       /* Some services (inet) use the same infrastructure for nonblocking
+        * and cancelled requests, resulting in one of EINTR or EAGAIN when the
+        * other is really the appropriate code.  Thus, cdev_cancel converts
+        * EAGAIN into EINTR, and we convert EINTR into EAGAIN here.
+        */
+       r = m_ptr->m_lchardriver_vfs_reply.status;
+       revive(proc_e, (r == EINTR) ? EAGAIN : r);
   }
 }