Cleanup: Remove internal two-phase data pipe all-or-none support.

BUG=Fixes #366
R=jamesr@chromium.org

Review URL: https://codereview.chromium.org/1365383004 .
diff --git a/mojo/edk/system/data_pipe.cc b/mojo/edk/system/data_pipe.cc
index a18c72d..bc2daea 100644
--- a/mojo/edk/system/data_pipe.cc
+++ b/mojo/edk/system/data_pipe.cc
@@ -309,8 +309,7 @@
 
 MojoResult DataPipe::ProducerBeginWriteData(
     UserPointer<void*> buffer,
-    UserPointer<uint32_t> buffer_num_bytes,
-    bool all_or_none) {
+    UserPointer<uint32_t> buffer_num_bytes) {
   MutexLocker locker(&mutex_);
   DCHECK(has_local_producer_no_lock());
 
@@ -319,15 +318,7 @@
   if (!consumer_open_no_lock())
     return MOJO_RESULT_FAILED_PRECONDITION;
 
-  uint32_t min_num_bytes_to_write = 0;
-  if (all_or_none) {
-    min_num_bytes_to_write = buffer_num_bytes.Get();
-    if (min_num_bytes_to_write % element_num_bytes() != 0)
-      return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  MojoResult rv = impl_->ProducerBeginWriteData(buffer, buffer_num_bytes,
-                                                min_num_bytes_to_write);
+  MojoResult rv = impl_->ProducerBeginWriteData(buffer, buffer_num_bytes);
   if (rv != MOJO_RESULT_OK)
     return rv;
   // Note: No need to awake producer awakables, even though we're going from
@@ -533,23 +524,14 @@
 
 MojoResult DataPipe::ConsumerBeginReadData(
     UserPointer<const void*> buffer,
-    UserPointer<uint32_t> buffer_num_bytes,
-    bool all_or_none) {
+    UserPointer<uint32_t> buffer_num_bytes) {
   MutexLocker locker(&mutex_);
   DCHECK(has_local_consumer_no_lock());
 
   if (consumer_in_two_phase_read_no_lock())
     return MOJO_RESULT_BUSY;
 
-  uint32_t min_num_bytes_to_read = 0;
-  if (all_or_none) {
-    min_num_bytes_to_read = buffer_num_bytes.Get();
-    if (min_num_bytes_to_read % element_num_bytes() != 0)
-      return MOJO_RESULT_INVALID_ARGUMENT;
-  }
-
-  MojoResult rv = impl_->ConsumerBeginReadData(buffer, buffer_num_bytes,
-                                               min_num_bytes_to_read);
+  MojoResult rv = impl_->ConsumerBeginReadData(buffer, buffer_num_bytes);
   if (rv != MOJO_RESULT_OK)
     return rv;
   DCHECK(consumer_in_two_phase_read_no_lock());
diff --git a/mojo/edk/system/data_pipe.h b/mojo/edk/system/data_pipe.h
index c5a1c64..180c981 100644
--- a/mojo/edk/system/data_pipe.h
+++ b/mojo/edk/system/data_pipe.h
@@ -107,8 +107,7 @@
                                UserPointer<uint32_t> num_bytes,
                                bool all_or_none);
   MojoResult ProducerBeginWriteData(UserPointer<void*> buffer,
-                                    UserPointer<uint32_t> buffer_num_bytes,
-                                    bool all_or_none);
+                                    UserPointer<uint32_t> buffer_num_bytes);
   MojoResult ProducerEndWriteData(uint32_t num_bytes_written);
   HandleSignalsState ProducerGetHandleSignalsState();
   MojoResult ProducerAddAwakable(Awakable* awakable,
@@ -140,8 +139,7 @@
                                  bool all_or_none);
   MojoResult ConsumerQueryData(UserPointer<uint32_t> num_bytes);
   MojoResult ConsumerBeginReadData(UserPointer<const void*> buffer,
-                                   UserPointer<uint32_t> buffer_num_bytes,
-                                   bool all_or_none);
+                                   UserPointer<uint32_t> buffer_num_bytes);
   MojoResult ConsumerEndReadData(uint32_t num_bytes_read);
   HandleSignalsState ConsumerGetHandleSignalsState();
   MojoResult ConsumerAddAwakable(Awakable* awakable,
diff --git a/mojo/edk/system/data_pipe_consumer_dispatcher.cc b/mojo/edk/system/data_pipe_consumer_dispatcher.cc
index 0821c64..059f801 100644
--- a/mojo/edk/system/data_pipe_consumer_dispatcher.cc
+++ b/mojo/edk/system/data_pipe_consumer_dispatcher.cc
@@ -112,8 +112,7 @@
       (flags & MOJO_READ_DATA_FLAG_QUERY) || (flags & MOJO_READ_DATA_FLAG_PEEK))
     return MOJO_RESULT_INVALID_ARGUMENT;
 
-  // TODO(vtl): Remove all-or-none support at lower levels.
-  return data_pipe_->ConsumerBeginReadData(buffer, buffer_num_bytes, false);
+  return data_pipe_->ConsumerBeginReadData(buffer, buffer_num_bytes);
 }
 
 MojoResult DataPipeConsumerDispatcher::EndReadDataImplNoLock(
diff --git a/mojo/edk/system/data_pipe_impl.h b/mojo/edk/system/data_pipe_impl.h
index eff6735..6dfddc7 100644
--- a/mojo/edk/system/data_pipe_impl.h
+++ b/mojo/edk/system/data_pipe_impl.h
@@ -64,8 +64,7 @@
                                        uint32_t min_num_bytes_to_write) = 0;
   virtual MojoResult ProducerBeginWriteData(
       UserPointer<void*> buffer,
-      UserPointer<uint32_t> buffer_num_bytes,
-      uint32_t min_num_bytes_to_write) = 0;
+      UserPointer<uint32_t> buffer_num_bytes) = 0;
   virtual MojoResult ProducerEndWriteData(uint32_t num_bytes_written) = 0;
   // Note: A producer should not be writable during a two-phase write.
   virtual HandleSignalsState ProducerGetHandleSignalsState() const = 0;
@@ -92,8 +91,7 @@
   virtual MojoResult ConsumerQueryData(UserPointer<uint32_t> num_bytes) = 0;
   virtual MojoResult ConsumerBeginReadData(
       UserPointer<const void*> buffer,
-      UserPointer<uint32_t> buffer_num_bytes,
-      uint32_t min_num_bytes_to_read) = 0;
+      UserPointer<uint32_t> buffer_num_bytes) = 0;
   virtual MojoResult ConsumerEndReadData(uint32_t num_bytes_read) = 0;
   // Note: A consumer should not be writable during a two-phase read.
   virtual HandleSignalsState ConsumerGetHandleSignalsState() const = 0;
diff --git a/mojo/edk/system/data_pipe_impl_unittest.cc b/mojo/edk/system/data_pipe_impl_unittest.cc
index b7309c4..09eac99 100644
--- a/mojo/edk/system/data_pipe_impl_unittest.cc
+++ b/mojo/edk/system/data_pipe_impl_unittest.cc
@@ -124,9 +124,8 @@
     return dpp()->ProducerWriteData(elements, num_bytes, all_or_none);
   }
   MojoResult ProducerBeginWriteData(UserPointer<void*> buffer,
-                                    UserPointer<uint32_t> buffer_num_bytes,
-                                    bool all_or_none) {
-    return dpp()->ProducerBeginWriteData(buffer, buffer_num_bytes, all_or_none);
+                                    UserPointer<uint32_t> buffer_num_bytes) {
+    return dpp()->ProducerBeginWriteData(buffer, buffer_num_bytes);
   }
   MojoResult ProducerEndWriteData(uint32_t num_bytes_written) {
     return dpp()->ProducerEndWriteData(num_bytes_written);
@@ -158,9 +157,8 @@
     return dpc()->ConsumerQueryData(num_bytes);
   }
   MojoResult ConsumerBeginReadData(UserPointer<const void*> buffer,
-                                   UserPointer<uint32_t> buffer_num_bytes,
-                                   bool all_or_none) {
-    return dpc()->ConsumerBeginReadData(buffer, buffer_num_bytes, all_or_none);
+                                   UserPointer<uint32_t> buffer_num_bytes) {
+    return dpc()->ConsumerBeginReadData(buffer, buffer_num_bytes);
   }
   MojoResult ConsumerEndReadData(uint32_t num_bytes_read) {
     return dpc()->ConsumerEndReadData(num_bytes_read);
@@ -611,7 +609,7 @@
   uint32_t context;
 
   int32_t elements[10] = {};
-  uint32_t num_bytes = 0;
+  uint32_t num_bytes = 0u;
 
   // Try reading; nothing there yet.
   num_bytes =
@@ -621,7 +619,7 @@
                                    MakeUserPointer(&num_bytes), false, false));
 
   // Query; nothing there yet.
-  num_bytes = 0;
+  num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerQueryData(MakeUserPointer(&num_bytes)));
   EXPECT_EQ(0u, num_bytes);
@@ -668,7 +666,7 @@
   // implementation/configured limits) that not all the data has arrived yet.
   // (The theoretically-correct assertion here is that |num_bytes| is |1 * ...|
   // or |2 * ...|.)
-  num_bytes = 0;
+  num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerQueryData(MakeUserPointer(&num_bytes)));
   EXPECT_EQ(2 * sizeof(elements[0]), num_bytes);
@@ -687,7 +685,7 @@
   // Query.
   // TODO(vtl): See previous TODO. (If we got 2 elements there, however, we
   // should get 1 here.)
-  num_bytes = 0;
+  num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerQueryData(MakeUserPointer(&num_bytes)));
   EXPECT_EQ(1 * sizeof(elements[0]), num_bytes);
@@ -704,7 +702,7 @@
   EXPECT_EQ(-1, elements[1]);
 
   // Query. Still has 1 element remaining.
-  num_bytes = 0;
+  num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerQueryData(MakeUserPointer(&num_bytes)));
   EXPECT_EQ(1 * sizeof(elements[0]), num_bytes);
@@ -731,7 +729,7 @@
   EXPECT_EQ(-1, elements[1]);
 
   // Query.
-  num_bytes = 0;
+  num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerQueryData(MakeUserPointer(&num_bytes)));
   EXPECT_EQ(0u, num_bytes);
@@ -872,7 +870,7 @@
   num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ProducerBeginWriteData(MakeUserPointer(&buffer),
-                                         MakeUserPointer(&num_bytes), false));
+                                         MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(buffer);
   EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
 
@@ -891,7 +889,7 @@
   num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerBeginReadData(MakeUserPointer(&read_buffer),
-                                        MakeUserPointer(&num_bytes), false));
+                                        MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(read_buffer);
   // Since we only read one element (after having written three in all), the
   // two-phase read should only allow us to read one. This checks an
@@ -1212,11 +1210,10 @@
   // Write two elements.
   int32_t* elements = nullptr;
   void* buffer = nullptr;
-  // Request room for three (but we'll only write two).
-  uint32_t num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
+  uint32_t num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ProducerBeginWriteData(MakeUserPointer(&buffer),
-                                         MakeUserPointer(&num_bytes), true));
+                                         MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(buffer);
   EXPECT_GE(num_bytes, static_cast<uint32_t>(3u * sizeof(elements[0])));
   elements = static_cast<int32_t*>(buffer);
@@ -1236,12 +1233,11 @@
             hss.satisfiable_signals);
 
   // Read one element.
-  // Request two in all-or-none mode, but only read one.
   const void* read_buffer = nullptr;
-  num_bytes = static_cast<uint32_t>(2u * sizeof(elements[0]));
+  num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerBeginReadData(MakeUserPointer(&read_buffer),
-                                        MakeUserPointer(&num_bytes), true));
+                                        MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(read_buffer);
   EXPECT_EQ(static_cast<uint32_t>(2u * sizeof(elements[0])), num_bytes);
   const int32_t* read_elements = static_cast<const int32_t*>(read_buffer);
@@ -1265,7 +1261,7 @@
   num_bytes = static_cast<uint32_t>(3u * sizeof(elements[0]));
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerBeginReadData(MakeUserPointer(&read_buffer),
-                                        MakeUserPointer(&num_bytes), false));
+                                        MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(read_buffer);
   EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(elements[0])), num_bytes);
   read_elements = static_cast<const int32_t*>(read_buffer);
@@ -1320,11 +1316,11 @@
   EXPECT_EQ(MOJO_HANDLE_SIGNAL_WRITABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
             hss.satisfiable_signals);
 
-  uint32_t num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
   void* write_ptr = nullptr;
+  uint32_t num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
-                                         MakeUserPointer(&num_bytes), false));
+                                         MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(write_ptr);
   EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
 
@@ -1370,11 +1366,11 @@
 
   // Start another two-phase write and check that it's readable even in the
   // middle of it.
-  num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
   write_ptr = nullptr;
+  num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
-                                         MakeUserPointer(&num_bytes), false));
+                                         MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(write_ptr);
   EXPECT_GE(num_bytes, static_cast<uint32_t>(1u * sizeof(int32_t)));
 
@@ -1392,11 +1388,11 @@
   EXPECT_EQ(MOJO_RESULT_OK, this->ProducerEndWriteData(0u));
 
   // Start a two-phase read.
-  num_bytes = static_cast<uint32_t>(1u * sizeof(int32_t));
   const void* read_ptr = nullptr;
+  num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerBeginReadData(MakeUserPointer(&read_ptr),
-                                        MakeUserPointer(&num_bytes), false));
+                                        MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(read_ptr);
   EXPECT_EQ(static_cast<uint32_t>(1u * sizeof(int32_t)), num_bytes);
 
@@ -1649,180 +1645,6 @@
   this->ConsumerClose();
 }
 
-TYPED_TEST(DataPipeImplTest, TwoPhaseAllOrNone) {
-  const MojoCreateDataPipeOptions options = {
-      kSizeOfOptions,                           // |struct_size|.
-      MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE,  // |flags|.
-      static_cast<uint32_t>(sizeof(int32_t)),   // |element_num_bytes|.
-      10 * sizeof(int32_t)                      // |capacity_num_bytes|.
-  };
-  this->Create(options);
-  this->DoTransfer();
-
-  Waiter waiter;
-  HandleSignalsState hss;
-
-  // Try writing way too much (two-phase).
-  uint32_t num_bytes = 20u * sizeof(int32_t);
-  void* write_ptr = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            this->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
-                                         MakeUserPointer(&num_bytes), true));
-
-  // Try writing an amount which isn't a multiple of the element size
-  // (two-phase).
-  static_assert(sizeof(int32_t) > 1u, "Wow! int32_t's have size 1");
-  num_bytes = 1u;
-  write_ptr = nullptr;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            this->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
-                                         MakeUserPointer(&num_bytes), true));
-
-  // Try reading way too much (two-phase).
-  num_bytes = 20u * sizeof(int32_t);
-  const void* read_ptr = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            this->ConsumerBeginReadData(MakeUserPointer(&read_ptr),
-                                        MakeUserPointer(&num_bytes), true));
-
-  // Add waiter.
-  waiter.Init();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_READABLE, 1,
-                                      nullptr));
-
-  // Write half (two-phase).
-  num_bytes = 5u * sizeof(int32_t);
-  write_ptr = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            this->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
-                                         MakeUserPointer(&num_bytes), true));
-  // May provide more space than requested.
-  EXPECT_GE(num_bytes, 5u * sizeof(int32_t));
-  EXPECT_TRUE(write_ptr);
-  Seq(0, 5, static_cast<int32_t*>(write_ptr));
-  EXPECT_EQ(MOJO_RESULT_OK, this->ProducerEndWriteData(5u * sizeof(int32_t)));
-
-  // Wait for data.
-  // TODO(vtl): (See corresponding TODO in AllOrNone.)
-  EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyDeadline(), nullptr));
-  hss = HandleSignalsState();
-  this->ConsumerRemoveAwakable(&waiter, &hss);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE, hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // Try reading an amount which isn't a multiple of the element size
-  // (two-phase).
-  num_bytes = 1u;
-  read_ptr = nullptr;
-  EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
-            this->ConsumerBeginReadData(MakeUserPointer(&read_ptr),
-                                        MakeUserPointer(&num_bytes), true));
-
-  // Read one (two-phase).
-  num_bytes = 1u * sizeof(int32_t);
-  read_ptr = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            this->ConsumerBeginReadData(MakeUserPointer(&read_ptr),
-                                        MakeUserPointer(&num_bytes), true));
-  EXPECT_GE(num_bytes, 1u * sizeof(int32_t));
-  EXPECT_EQ(0, static_cast<const int32_t*>(read_ptr)[0]);
-  EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(1u * sizeof(int32_t)));
-
-  // We should have four left, leaving room for six.
-  num_bytes = 0u;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            this->ConsumerQueryData(MakeUserPointer(&num_bytes)));
-  EXPECT_EQ(4u * sizeof(int32_t), num_bytes);
-
-  // Assuming a tight circular buffer of the specified capacity, we can't do a
-  // two-phase write of six now.
-  num_bytes = 6u * sizeof(int32_t);
-  write_ptr = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE,
-            this->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
-                                         MakeUserPointer(&num_bytes), true));
-
-  // TODO(vtl): Hack (see also the TODO above): We can't currently wait for a
-  // specified amount of space to be available, so poll.
-  for (size_t i = 0; i < kMaxPoll; i++) {
-    // Write six elements (simple), filling the buffer.
-    num_bytes = 6u * sizeof(int32_t);
-    int32_t buffer[100];
-    Seq(100, 6, buffer);
-    MojoResult result = this->ProducerWriteData(
-        UserPointer<const void>(buffer), MakeUserPointer(&num_bytes), true);
-    if (result == MOJO_RESULT_OK)
-      break;
-    EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, result);
-
-    test::Sleep(test::EpsilonDeadline());
-  }
-  EXPECT_EQ(6u * sizeof(int32_t), num_bytes);
-
-  // TODO(vtl): Hack: poll again.
-  for (size_t i = 0; i < kMaxPoll; i++) {
-    // We have ten.
-    num_bytes = 0u;
-    EXPECT_EQ(MOJO_RESULT_OK,
-              this->ConsumerQueryData(MakeUserPointer(&num_bytes)));
-    if (num_bytes >= 10u * sizeof(int32_t))
-      break;
-
-    test::Sleep(test::EpsilonDeadline());
-  }
-  EXPECT_EQ(10u * sizeof(int32_t), num_bytes);
-
-  // Note: Whether a two-phase read of ten would fail here or not is
-  // implementation-dependent.
-
-  // Add waiter.
-  waiter.Init();
-  ASSERT_EQ(MOJO_RESULT_OK,
-            this->ConsumerAddAwakable(&waiter, MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-                                      2, nullptr));
-
-  // Close the producer.
-  this->ProducerClose();
-
-  // A two-phase read of nine should work.
-  num_bytes = 9u * sizeof(int32_t);
-  read_ptr = nullptr;
-  EXPECT_EQ(MOJO_RESULT_OK,
-            this->ConsumerBeginReadData(MakeUserPointer(&read_ptr),
-                                        MakeUserPointer(&num_bytes), true));
-  EXPECT_GE(num_bytes, 9u * sizeof(int32_t));
-  EXPECT_EQ(1, static_cast<const int32_t*>(read_ptr)[0]);
-  EXPECT_EQ(2, static_cast<const int32_t*>(read_ptr)[1]);
-  EXPECT_EQ(3, static_cast<const int32_t*>(read_ptr)[2]);
-  EXPECT_EQ(4, static_cast<const int32_t*>(read_ptr)[3]);
-  EXPECT_EQ(100, static_cast<const int32_t*>(read_ptr)[4]);
-  EXPECT_EQ(101, static_cast<const int32_t*>(read_ptr)[5]);
-  EXPECT_EQ(102, static_cast<const int32_t*>(read_ptr)[6]);
-  EXPECT_EQ(103, static_cast<const int32_t*>(read_ptr)[7]);
-  EXPECT_EQ(104, static_cast<const int32_t*>(read_ptr)[8]);
-  EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(9u * sizeof(int32_t)));
-
-  // Wait for peer closed.
-  EXPECT_EQ(MOJO_RESULT_OK, waiter.Wait(test::TinyDeadline(), nullptr));
-  hss = HandleSignalsState();
-  this->ConsumerRemoveAwakable(&waiter, &hss);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfied_signals);
-  EXPECT_EQ(MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_PEER_CLOSED,
-            hss.satisfiable_signals);
-
-  // A two-phase read of two should fail, with "failed precondition".
-  num_bytes = 2u * sizeof(int32_t);
-  read_ptr = nullptr;
-  EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
-            this->ConsumerBeginReadData(MakeUserPointer(&read_ptr),
-                                        MakeUserPointer(&num_bytes), true));
-
-  this->ConsumerClose();
-}
-
 // Tests that |ProducerWriteData()| and |ConsumerReadData()| writes and reads,
 // respectively, as much as possible, even if it may have to "wrap around" the
 // internal circular buffer. (Note that the two-phase write and read need not do
@@ -1888,14 +1710,14 @@
     num_bytes = 0u;
     EXPECT_EQ(MOJO_RESULT_OK,
               this->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr),
-                                           MakeUserPointer(&num_bytes), false));
+                                           MakeUserPointer(&num_bytes)));
     EXPECT_TRUE(write_buffer_ptr);
     EXPECT_EQ(80u, num_bytes);
     EXPECT_EQ(MOJO_RESULT_OK, this->ProducerEndWriteData(0u));
   }
 
   // TODO(vtl): (See corresponding TODO in TwoPhaseAllOrNone.)
-  size_t total_num_bytes = 0;
+  size_t total_num_bytes = 0u;
   for (size_t i = 0; i < kMaxPoll; i++) {
     // Write as much data as we can (using |ProducerWriteData()|). We should
     // write 90 bytes (eventually).
@@ -1935,7 +1757,7 @@
     num_bytes = 0u;
     EXPECT_EQ(MOJO_RESULT_OK,
               this->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
-                                          MakeUserPointer(&num_bytes), false));
+                                          MakeUserPointer(&num_bytes)));
     EXPECT_TRUE(read_buffer_ptr);
     EXPECT_EQ(90u, num_bytes);
     EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(0u));
@@ -1990,7 +1812,7 @@
   num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr),
-                                         MakeUserPointer(&num_bytes), false));
+                                         MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(write_buffer_ptr);
   EXPECT_GT(num_bytes, 0u);
 
@@ -2011,7 +1833,7 @@
   num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
-                                        MakeUserPointer(&num_bytes), false));
+                                        MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(read_buffer_ptr);
   EXPECT_EQ(2u * kTestDataSize, num_bytes);
 
@@ -2027,7 +1849,7 @@
   num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
-                                        MakeUserPointer(&num_bytes), false));
+                                        MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(read_buffer_ptr);
   EXPECT_EQ(kTestDataSize, num_bytes);
 
@@ -2071,7 +1893,7 @@
   num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr),
-                                         MakeUserPointer(&num_bytes), false));
+                                         MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(write_buffer_ptr);
   ASSERT_GT(num_bytes, kTestDataSize);
 
@@ -2089,7 +1911,7 @@
   num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
-                                        MakeUserPointer(&num_bytes), false));
+                                        MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(read_buffer_ptr);
   EXPECT_EQ(kTestDataSize, num_bytes);
 
@@ -2127,7 +1949,7 @@
   num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
             this->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr),
-                                         MakeUserPointer(&num_bytes), false));
+                                         MakeUserPointer(&num_bytes)));
 
   this->ProducerClose();
 }
@@ -2151,7 +1973,7 @@
   uint32_t num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ProducerBeginWriteData(MakeUserPointer(&write_buffer_ptr),
-                                         MakeUserPointer(&num_bytes), false));
+                                         MakeUserPointer(&num_bytes)));
   EXPECT_TRUE(write_buffer_ptr);
   ASSERT_GT(num_bytes, kTestDataSize);
 
@@ -2232,7 +2054,7 @@
   num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
             this->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
-                                        MakeUserPointer(&num_bytes), false));
+                                        MakeUserPointer(&num_bytes)));
 
   // Ditto for discard.
   num_bytes = 10u;
@@ -2278,11 +2100,11 @@
   EXPECT_EQ(0u, num_bytes);
 
   // Try ending a two-phase write with an invalid amount (too much).
-  num_bytes = 0u;
   void* write_ptr = nullptr;
+  num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
-                                         MakeUserPointer(&num_bytes), false));
+                                         MakeUserPointer(&num_bytes)));
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
             this->ProducerEndWriteData(num_bytes +
                                        static_cast<uint32_t>(sizeof(int32_t))));
@@ -2301,11 +2123,11 @@
 
   // Try ending a two-phase write with an invalid amount (not a multiple of the
   // element size).
-  num_bytes = 0u;
   write_ptr = nullptr;
+  num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
-                                         MakeUserPointer(&num_bytes), false));
+                                         MakeUserPointer(&num_bytes)));
   EXPECT_GE(num_bytes, 1u);
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, this->ProducerEndWriteData(1u));
 
@@ -2364,7 +2186,7 @@
   const void* read_ptr = nullptr;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerBeginReadData(MakeUserPointer(&read_ptr),
-                                        MakeUserPointer(&num_bytes), false));
+                                        MakeUserPointer(&num_bytes)));
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
             this->ConsumerEndReadData(num_bytes +
                                       static_cast<uint32_t>(sizeof(int32_t))));
@@ -2381,7 +2203,7 @@
   read_ptr = nullptr;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerBeginReadData(MakeUserPointer(&read_ptr),
-                                        MakeUserPointer(&num_bytes), false));
+                                        MakeUserPointer(&num_bytes)));
   EXPECT_EQ(1u * sizeof(int32_t), num_bytes);
   EXPECT_EQ(123, static_cast<const int32_t*>(read_ptr)[0]);
   EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, this->ConsumerEndReadData(1u));
@@ -2437,7 +2259,7 @@
   num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             this->ConsumerBeginReadData(MakeUserPointer(&read_buffer_ptr),
-                                        MakeUserPointer(&num_bytes), false));
+                                        MakeUserPointer(&num_bytes)));
   EXPECT_EQ(kTestDataSize, num_bytes);
   EXPECT_EQ(0, memcmp(read_buffer_ptr, kTestData, kTestDataSize));
 
diff --git a/mojo/edk/system/data_pipe_producer_dispatcher.cc b/mojo/edk/system/data_pipe_producer_dispatcher.cc
index 536dace..5221713 100644
--- a/mojo/edk/system/data_pipe_producer_dispatcher.cc
+++ b/mojo/edk/system/data_pipe_producer_dispatcher.cc
@@ -88,8 +88,7 @@
   if ((flags & MOJO_WRITE_DATA_FLAG_ALL_OR_NONE))
     return MOJO_RESULT_INVALID_ARGUMENT;
 
-  // TODO(vtl): Remove all-or-none support at lower levels.
-  return data_pipe_->ProducerBeginWriteData(buffer, buffer_num_bytes, false);
+  return data_pipe_->ProducerBeginWriteData(buffer, buffer_num_bytes);
 }
 
 MojoResult DataPipeProducerDispatcher::EndWriteDataImplNoLock(
diff --git a/mojo/edk/system/local_data_pipe_impl.cc b/mojo/edk/system/local_data_pipe_impl.cc
index 3d2e9e5..8f878d5 100644
--- a/mojo/edk/system/local_data_pipe_impl.cc
+++ b/mojo/edk/system/local_data_pipe_impl.cc
@@ -107,8 +107,7 @@
 
 MojoResult LocalDataPipeImpl::ProducerBeginWriteData(
     UserPointer<void*> buffer,
-    UserPointer<uint32_t> buffer_num_bytes,
-    uint32_t min_num_bytes_to_write) {
+    UserPointer<uint32_t> buffer_num_bytes) {
   DCHECK(consumer_open());
 
   // The index we need to start writing at.
@@ -116,12 +115,6 @@
       (start_index_ + current_num_bytes_) % capacity_num_bytes();
 
   size_t max_num_bytes_to_write = GetMaxNumBytesToWrite();
-  if (min_num_bytes_to_write > max_num_bytes_to_write) {
-    // Don't return "should wait" since you can't wait for a specified amount
-    // of data.
-    return MOJO_RESULT_OUT_OF_RANGE;
-  }
-
   // Don't go into a two-phase write if there's no room.
   if (max_num_bytes_to_write == 0)
     return MOJO_RESULT_SHOULD_WAIT;
@@ -289,16 +282,8 @@
 
 MojoResult LocalDataPipeImpl::ConsumerBeginReadData(
     UserPointer<const void*> buffer,
-    UserPointer<uint32_t> buffer_num_bytes,
-    uint32_t min_num_bytes_to_read) {
+    UserPointer<uint32_t> buffer_num_bytes) {
   size_t max_num_bytes_to_read = GetMaxNumBytesToRead();
-  if (min_num_bytes_to_read > max_num_bytes_to_read) {
-    // Don't return "should wait" since you can't wait for a specified amount of
-    // data.
-    return producer_open() ? MOJO_RESULT_OUT_OF_RANGE
-                           : MOJO_RESULT_FAILED_PRECONDITION;
-  }
-
   // Don't go into a two-phase read if there's no data.
   if (max_num_bytes_to_read == 0) {
     return producer_open() ? MOJO_RESULT_SHOULD_WAIT
diff --git a/mojo/edk/system/local_data_pipe_impl.h b/mojo/edk/system/local_data_pipe_impl.h
index 46a353d..aa14590 100644
--- a/mojo/edk/system/local_data_pipe_impl.h
+++ b/mojo/edk/system/local_data_pipe_impl.h
@@ -31,9 +31,9 @@
                                UserPointer<uint32_t> num_bytes,
                                uint32_t max_num_bytes_to_write,
                                uint32_t min_num_bytes_to_write) override;
-  MojoResult ProducerBeginWriteData(UserPointer<void*> buffer,
-                                    UserPointer<uint32_t> buffer_num_bytes,
-                                    uint32_t min_num_bytes_to_write) override;
+  MojoResult ProducerBeginWriteData(
+      UserPointer<void*> buffer,
+      UserPointer<uint32_t> buffer_num_bytes) override;
   MojoResult ProducerEndWriteData(uint32_t num_bytes_written) override;
   HandleSignalsState ProducerGetHandleSignalsState() const override;
   void ProducerStartSerialize(Channel* channel,
@@ -54,9 +54,9 @@
                                  uint32_t max_num_bytes_to_discard,
                                  uint32_t min_num_bytes_to_discard) override;
   MojoResult ConsumerQueryData(UserPointer<uint32_t> num_bytes) override;
-  MojoResult ConsumerBeginReadData(UserPointer<const void*> buffer,
-                                   UserPointer<uint32_t> buffer_num_bytes,
-                                   uint32_t min_num_bytes_to_read) override;
+  MojoResult ConsumerBeginReadData(
+      UserPointer<const void*> buffer,
+      UserPointer<uint32_t> buffer_num_bytes) override;
   MojoResult ConsumerEndReadData(uint32_t num_bytes_read) override;
   HandleSignalsState ConsumerGetHandleSignalsState() const override;
   void ConsumerStartSerialize(Channel* channel,
diff --git a/mojo/edk/system/remote_consumer_data_pipe_impl.cc b/mojo/edk/system/remote_consumer_data_pipe_impl.cc
index ce0c240..7bbafb3 100644
--- a/mojo/edk/system/remote_consumer_data_pipe_impl.cc
+++ b/mojo/edk/system/remote_consumer_data_pipe_impl.cc
@@ -177,8 +177,7 @@
 
 MojoResult RemoteConsumerDataPipeImpl::ProducerBeginWriteData(
     UserPointer<void*> buffer,
-    UserPointer<uint32_t> buffer_num_bytes,
-    uint32_t min_num_bytes_to_write) {
+    UserPointer<uint32_t> buffer_num_bytes) {
   DCHECK(consumer_open());
   DCHECK(channel_endpoint_);
 
@@ -186,12 +185,6 @@
   DCHECK_EQ(consumer_num_bytes_ % element_num_bytes(), 0u);
 
   size_t max_num_bytes_to_write = capacity_num_bytes() - consumer_num_bytes_;
-  if (min_num_bytes_to_write > max_num_bytes_to_write) {
-    // Don't return "should wait" since you can't wait for a specified amount
-    // of data.
-    return MOJO_RESULT_OUT_OF_RANGE;
-  }
-
   // Don't go into a two-phase write if there's no room.
   if (max_num_bytes_to_write == 0)
     return MOJO_RESULT_SHOULD_WAIT;
@@ -343,8 +336,7 @@
 
 MojoResult RemoteConsumerDataPipeImpl::ConsumerBeginReadData(
     UserPointer<const void*> /*buffer*/,
-    UserPointer<uint32_t> /*buffer_num_bytes*/,
-    uint32_t /*min_num_bytes_to_read*/) {
+    UserPointer<uint32_t> /*buffer_num_bytes*/) {
   NOTREACHED();
   return MOJO_RESULT_INTERNAL;
 }
diff --git a/mojo/edk/system/remote_consumer_data_pipe_impl.h b/mojo/edk/system/remote_consumer_data_pipe_impl.h
index 1bcd989..2131c96 100644
--- a/mojo/edk/system/remote_consumer_data_pipe_impl.h
+++ b/mojo/edk/system/remote_consumer_data_pipe_impl.h
@@ -50,9 +50,9 @@
                                UserPointer<uint32_t> num_bytes,
                                uint32_t max_num_bytes_to_write,
                                uint32_t min_num_bytes_to_write) override;
-  MojoResult ProducerBeginWriteData(UserPointer<void*> buffer,
-                                    UserPointer<uint32_t> buffer_num_bytes,
-                                    uint32_t min_num_bytes_to_write) override;
+  MojoResult ProducerBeginWriteData(
+      UserPointer<void*> buffer,
+      UserPointer<uint32_t> buffer_num_bytes) override;
   MojoResult ProducerEndWriteData(uint32_t num_bytes_written) override;
   HandleSignalsState ProducerGetHandleSignalsState() const override;
   void ProducerStartSerialize(Channel* channel,
@@ -73,9 +73,9 @@
                                  uint32_t max_num_bytes_to_discard,
                                  uint32_t min_num_bytes_to_discard) override;
   MojoResult ConsumerQueryData(UserPointer<uint32_t> num_bytes) override;
-  MojoResult ConsumerBeginReadData(UserPointer<const void*> buffer,
-                                   UserPointer<uint32_t> buffer_num_bytes,
-                                   uint32_t min_num_bytes_to_read) override;
+  MojoResult ConsumerBeginReadData(
+      UserPointer<const void*> buffer,
+      UserPointer<uint32_t> buffer_num_bytes) override;
   MojoResult ConsumerEndReadData(uint32_t num_bytes_read) override;
   HandleSignalsState ConsumerGetHandleSignalsState() const override;
   void ConsumerStartSerialize(Channel* channel,
diff --git a/mojo/edk/system/remote_data_pipe_impl_unittest.cc b/mojo/edk/system/remote_data_pipe_impl_unittest.cc
index 6464564..23b464f 100644
--- a/mojo/edk/system/remote_data_pipe_impl_unittest.cc
+++ b/mojo/edk/system/remote_data_pipe_impl_unittest.cc
@@ -291,11 +291,11 @@
       DataPipeConsumerDispatcher::Create();
   consumer->Init(dp);
 
-  uint32_t num_bytes = static_cast<uint32_t>(10u * sizeof(int32_t));
   void* write_ptr = nullptr;
+  uint32_t num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
-                                       MakeUserPointer(&num_bytes), false));
+                                       MakeUserPointer(&num_bytes)));
   ASSERT_GE(num_bytes, 1u * sizeof(int32_t));
 
   // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0).
@@ -401,21 +401,21 @@
       DataPipeConsumerDispatcher::Create();
   consumer->Init(dp);
 
-  uint32_t num_bytes = static_cast<uint32_t>(10u * sizeof(int32_t));
   void* write_ptr = nullptr;
+  uint32_t num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
-                                       MakeUserPointer(&num_bytes), false));
+                                       MakeUserPointer(&num_bytes)));
   ASSERT_GE(num_bytes, 1u * sizeof(int32_t));
   *static_cast<int32_t*>(write_ptr) = 123456;
   EXPECT_EQ(MOJO_RESULT_OK, dp->ProducerEndWriteData(
                                 static_cast<uint32_t>(1u * sizeof(int32_t))));
 
-  num_bytes = static_cast<uint32_t>(10u * sizeof(int32_t));
   write_ptr = nullptr;
+  num_bytes = 0u;
   EXPECT_EQ(MOJO_RESULT_OK,
             dp->ProducerBeginWriteData(MakeUserPointer(&write_ptr),
-                                       MakeUserPointer(&num_bytes), false));
+                                       MakeUserPointer(&num_bytes)));
   ASSERT_GE(num_bytes, 1u * sizeof(int32_t));
 
   // Write the consumer to MP 0 (port 0). Wait and receive on MP 1 (port 0).
diff --git a/mojo/edk/system/remote_producer_data_pipe_impl.cc b/mojo/edk/system/remote_producer_data_pipe_impl.cc
index 847949f..abf1e96 100644
--- a/mojo/edk/system/remote_producer_data_pipe_impl.cc
+++ b/mojo/edk/system/remote_producer_data_pipe_impl.cc
@@ -133,8 +133,7 @@
 
 MojoResult RemoteProducerDataPipeImpl::ProducerBeginWriteData(
     UserPointer<void*> /*buffer*/,
-    UserPointer<uint32_t> /*buffer_num_bytes*/,
-    uint32_t /*min_num_bytes_to_write*/) {
+    UserPointer<uint32_t> /*buffer_num_bytes*/) {
   NOTREACHED();
   return MOJO_RESULT_INTERNAL;
 }
@@ -250,16 +249,8 @@
 
 MojoResult RemoteProducerDataPipeImpl::ConsumerBeginReadData(
     UserPointer<const void*> buffer,
-    UserPointer<uint32_t> buffer_num_bytes,
-    uint32_t min_num_bytes_to_read) {
+    UserPointer<uint32_t> buffer_num_bytes) {
   size_t max_num_bytes_to_read = GetMaxNumBytesToRead();
-  if (min_num_bytes_to_read > max_num_bytes_to_read) {
-    // Don't return "should wait" since you can't wait for a specified amount of
-    // data.
-    return producer_open() ? MOJO_RESULT_OUT_OF_RANGE
-                           : MOJO_RESULT_FAILED_PRECONDITION;
-  }
-
   // Don't go into a two-phase read if there's no data.
   if (max_num_bytes_to_read == 0) {
     return producer_open() ? MOJO_RESULT_SHOULD_WAIT
diff --git a/mojo/edk/system/remote_producer_data_pipe_impl.h b/mojo/edk/system/remote_producer_data_pipe_impl.h
index 617cf9d..cea3d28 100644
--- a/mojo/edk/system/remote_producer_data_pipe_impl.h
+++ b/mojo/edk/system/remote_producer_data_pipe_impl.h
@@ -50,9 +50,9 @@
                                UserPointer<uint32_t> num_bytes,
                                uint32_t max_num_bytes_to_write,
                                uint32_t min_num_bytes_to_write) override;
-  MojoResult ProducerBeginWriteData(UserPointer<void*> buffer,
-                                    UserPointer<uint32_t> buffer_num_bytes,
-                                    uint32_t min_num_bytes_to_write) override;
+  MojoResult ProducerBeginWriteData(
+      UserPointer<void*> buffer,
+      UserPointer<uint32_t> buffer_num_bytes) override;
   MojoResult ProducerEndWriteData(uint32_t num_bytes_written) override;
   HandleSignalsState ProducerGetHandleSignalsState() const override;
   void ProducerStartSerialize(Channel* channel,
@@ -73,9 +73,9 @@
                                  uint32_t max_num_bytes_to_discard,
                                  uint32_t min_num_bytes_to_discard) override;
   MojoResult ConsumerQueryData(UserPointer<uint32_t> num_bytes) override;
-  MojoResult ConsumerBeginReadData(UserPointer<const void*> buffer,
-                                   UserPointer<uint32_t> buffer_num_bytes,
-                                   uint32_t min_num_bytes_to_read) override;
+  MojoResult ConsumerBeginReadData(
+      UserPointer<const void*> buffer,
+      UserPointer<uint32_t> buffer_num_bytes) override;
   MojoResult ConsumerEndReadData(uint32_t num_bytes_read) override;
   HandleSignalsState ConsumerGetHandleSignalsState() const override;
   void ConsumerStartSerialize(Channel* channel,