]> Zhao Yanbai Git Server - minix.git/commitdiff
vfs: call pipe_check before reviving select()
authorBen Gras <ben@minix3.org>
Wed, 5 Mar 2014 14:12:54 +0000 (15:12 +0100)
committerLionel Sambuc <lionel@minix3.org>
Mon, 28 Jul 2014 15:05:14 +0000 (17:05 +0200)
. select callback on close() on a pipe
  would falsely revive a read-select on
  the pipe
. the extra pipe_check catches it
. fixes the new import of the netbsd
  make in -j N mode (make jobs that communicate
  with pipes)

servers/vfs/pipe.c

index ce0909727068a457dedfe3c82bd4e1427bfca3f4..f9e2c6ad6ab793e3b36d083835cd8c146e6a7d9b 100644 (file)
@@ -392,7 +392,16 @@ int count;                 /* max number of processes to release */
                if (f->filp_count < 1 || !(f->filp_pipe_select_ops & selop) ||
                    f->filp_vno != vp)
                        continue;
+
+               /* Do a pipe_check to see if we really want to callback this
+                * select; a close() doesn't always warrant it.
+                */
+               if(pipe_check(f, op == VFS_READ ? READING : WRITING,
+                       f->filp_flags & ~O_NONBLOCK, 1, 1) == SUSPEND) {
+                       continue;
+               }
                select_callback(f, selop);
+
                f->filp_pipe_select_ops &= ~selop;
        }
   }