AU: Pass opened device fd from update engine to bspatch.

Whenever a device is written and closes, some processing happens
(involving udev, devicekit-disks, udev, and even
chrome). Historically, bspatch called open, write, close on the raw
device, thus causing much CPU usage every time bspatch was called,
which can be many times per second for delta updates.

This CL causes us to pass /dev/fd/## and the file descriptor to
bspatch. A corresponding CL causes bspatch to detect this and skip
open/close calls. Together, these CLs dramatically reduce resource
usage on clients performing delta updates.

BUG=7636
TEST=unittests; tested delta update on device

Review URL: http://codereview.chromium.org/3723005
diff --git a/delta_performer.cc b/delta_performer.cc
index 7ee9d4f..d111015 100644
--- a/delta_performer.cc
+++ b/delta_performer.cc
@@ -446,7 +446,7 @@
   }
 
   int fd = is_kernel_partition ? kernel_fd_ : fd_;
-  const string& path = is_kernel_partition ? kernel_path_ : path_;
+  const string& path = StringPrintf("/dev/fd/%d", fd);
 
   // If this is a non-idempotent operation, request a delayed exit and clear the
   // update state in case the operation gets interrupted. Do this as late as
@@ -464,7 +464,10 @@
   cmd.push_back(input_positions);
   cmd.push_back(output_positions);
   int return_code = 0;
-  TEST_AND_RETURN_FALSE(Subprocess::SynchronousExec(cmd, &return_code));
+  TEST_AND_RETURN_FALSE(
+      Subprocess::SynchronousExecFlags(cmd,
+                                       &return_code,
+                                       G_SPAWN_LEAVE_DESCRIPTORS_OPEN));
   TEST_AND_RETURN_FALSE(return_code == 0);
 
   if (operation.dst_length() % block_size_) {