if (!pipe->writers)
                        break;
-               if (!pipe->waiting_writers) {
-                       /* syscall merging: Usually we must not sleep
-                        * if O_NONBLOCK is set, or if we got some data.
-                        * But if a writer sleeps in kernel space, then
-                        * we can wait for that data without violating POSIX.
-                        */
-                       if (ret)
-                               break;
-                       if (filp->f_flags & O_NONBLOCK) {
-                               ret = -EAGAIN;
-                               break;
-                       }
+               if (ret)
+                       break;
+               if (filp->f_flags & O_NONBLOCK) {
+                       ret = -EAGAIN;
+                       break;
                }
                if (signal_pending(current)) {
                        if (!ret)
                        wake_up_interruptible_sync_poll(&pipe->wait, EPOLLIN | EPOLLRDNORM);
                        kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
                }
-               pipe->waiting_writers++;
                pipe_wait(pipe);
-               pipe->waiting_writers--;
 
                was_empty = pipe_empty(head, pipe->tail);
        }
 
                if (!pipe->writers)
                        return 0;
 
-               if (!pipe->waiting_writers && sd->num_spliced)
+               if (sd->num_spliced)
                        return 0;
 
                if (sd->flags & SPLICE_F_NONBLOCK)
                        return -EAGAIN;
                if (signal_pending(current))
                        return -ERESTARTSYS;
-               pipe->waiting_writers++;
                pipe_wait(pipe);
-               pipe->waiting_writers--;
        }
 }
 
                }
                if (!pipe->writers)
                        break;
-               if (!pipe->waiting_writers) {
-                       if (flags & SPLICE_F_NONBLOCK) {
-                               ret = -EAGAIN;
-                               break;
-                       }
+               if (flags & SPLICE_F_NONBLOCK) {
+                       ret = -EAGAIN;
+                       break;
                }
                pipe_wait(pipe);
        }
                        ret = -ERESTARTSYS;
                        break;
                }
-               pipe->waiting_writers++;
                pipe_wait(pipe);
-               pipe->waiting_writers--;
        }
 
        pipe_unlock(pipe);
                i_tail++;
        } while (len);
 
-       /*
-        * return EAGAIN if we have the potential of some data in the
-        * future, otherwise just return 0
-        */
-       if (!ret && ipipe->waiting_writers && (flags & SPLICE_F_NONBLOCK))
-               ret = -EAGAIN;
-
        pipe_unlock(ipipe);
        pipe_unlock(opipe);
 
 
  *     @readers: number of current readers of this pipe
  *     @writers: number of current writers of this pipe
  *     @files: number of struct file referring this pipe (protected by ->i_lock)
- *     @waiting_writers: number of writers blocked waiting for room
  *     @r_counter: reader counter
  *     @w_counter: writer counter
  *     @fasync_readers: reader side fasync
        unsigned int readers;
        unsigned int writers;
        unsigned int files;
-       unsigned int waiting_writers;
        unsigned int r_counter;
        unsigned int w_counter;
        struct page *tmp_page;