Add UnownedCacheFileDescriptor

Since we switched to raw pointers in a subset of fs verfication
functions, EncodeFEC no longer have a shared ptr, and can no longer use
CacheFileDescriptor. Add a variant of CacheFileDescriptor that works
with raw pointer.

Test: th
Bug: 216391325
Change-Id: Id71880a4f8f97e4549dcc96d53e9af00ae45168c
diff --git a/payload_consumer/verity_writer_android.cc b/payload_consumer/verity_writer_android.cc
index b233b58..b669b4d 100644
--- a/payload_consumer/verity_writer_android.cc
+++ b/payload_consumer/verity_writer_android.cc
@@ -161,6 +161,11 @@
   std::unique_ptr<void, decltype(&free_rs_char)> rs_char(
       init_rs_char(FEC_PARAMS(fec_roots)), &free_rs_char);
   TEST_AND_RETURN_FALSE(rs_char != nullptr);
+  // Cache at most 1MB of fec data, in VABC, we need to re-open fd if we
+  // perform a read() operation after write(). So reduce the number of writes
+  // can save unnecessary re-opens.
+  UnownedCachedFileDescriptor cache_fd(write_fd, 1 * (1 << 20));
+  write_fd = &cache_fd;
 
   for (size_t i = 0; i < rounds; i++) {
     // Encodes |block_size| number of rs blocks each round so that we can read